Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба5.doc
Скачиваний:
5
Добавлен:
12.11.2019
Размер:
976.9 Кб
Скачать

3. Порядок выполнения работы

  1. Создать пустой проект на VC 6.0. Добавить к проекту файлы из приложения. Откомпилировать, отлинковать и запустить программу.

  2. Разобраться во внутреннем строении программы. Найти точки инициализации и вызова диалогов. Найти в программе создание, чтение и запись в разделы реестра. Просмотреть c помощью утилиты regedit созданные программой разделы

  3. Добавить в окно диалога два редактора.

  4. Изменить программу так, чтобы в окне рисовался эллипс. Цвет эллипса задается с помощью диалога (три редактора соответствуют трем компонентам цвета R, G, B).

  5. После изменения цвета эллипса, его три компонента заносятся в реестр.

  6. При последующих запусках программы, цвет эллипса берется из реестра.

  7. При вызове диалога компоненты цвета должны отображаться в редакторах.

Повышенная сложность:

Сделать простой редактор реестра на основе диалогового окна. В диалоговом окне три редактора. В первом редакторе указывается раздел реестра и параметр, который надо занести. Во втором значение параметра. В третьем по нажатию кнопки “Применить” высвечивается TRUE в случае успешного занесения параметра и FALSE в обратном случае.

4. Контрольные вопросы

  1. Что такое диалоговое окно? В чем его назначение?

  2. Опишите последовательность действий для использования диалоговых окон.

  3. В чем отличие модального и немодального диалогового окна?

  4. Какое сообщение используется для инициализации данных диалогового окна?

  5. Какие функции используются для получения и занесения информации в элементы диалогового окна?

  6. Что такое реестр? В чем назначение реестра? Перечислите основные разделы реестра и опишите его структуру.

  7. Какая функция используется для создания и открытия разделов реестра? Какие функции используются для записи и чтения параметров из раздела реестра?

  8. Какая функция используется для закрытия раздела реестра?

  9. Какая функция используется для удаления реестра?

Приложение Файл reg_dlg.Cpp

#include <windows.h>

#include "resource.h"

/* прототип функции окна */

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);

/* прототип функции диалогового окна */

BOOL CALLBACK Dlg_Proc(HWND hwnd,

UINT uMsg, WPARAM wParam, LPARAM lParam);

/* название ключа */

const char SubKey[20]="SoftWare\\test\\test2";

/* название значения ключа */

const char ValueName[10]="teststr";

/* дескриптор приложения */

HANDLE hInstance;

/* ключ */

HKEY hKeyRes;

char szWinName[] ="MyWin"; /* имя класса окна */

/* главная функция */

int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,

LPSTR lpszArgs, int nWinMode )

{

HWND hwnd;

MSG msg;

WNDCLASSEX wcl;

/* определение класса окна */

wcl.hInstance=hThisInst; /* дескриптор данного экземпляра */

wcl.lpszClassName=szWinName; /* имя класса окна */

wcl.lpfnWndProc=WindowFunc; /* функция окна */

wcl.style=0; /* стиль по умолчанию */

wcl.cbSize = sizeof(WNDCLASSEX); /*размер структуры */

/* WNDCLASSEX */

wcl.hIcon = LoadIcon(NULL,IDI_APPLICATION);/* большая */

/* пикторграмма */

wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* малая */

/* пиктограмма */

wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* форма курсора */

wcl.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); /* меню не используется */

wcl.cbClsExtra = 0; /* дополнительная информация отсутствует */

wcl.cbWndExtra = 0;

/* фон окна задается белым */

wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);

/* регистрация класса окна */

if(!RegisterClassEx(&wcl)) return 0;

/* Создание окна */

hwnd = CreateWindow (

szWinName, /* имя класса окна */

"Registry & Dialogs", /* заголовок */

WS_OVERLAPPEDWINDOW, /* стандартное окно */

CW_USEDEFAULT, /* координата Х - определяется Windows */

CW_USEDEFAULT, /* координата Y - определяется Windows */

CW_USEDEFAULT, /* ширина - определяется Windows */

CW_USEDEFAULT, /* высота - определяется Windows */

HWND_DESKTOP, /* родительского окна нет */

NULL, /* меню нет */

hThisInst, /* дескриптор данного экземпляра приложения */

NULL /* дополнительных аргументов нет */

);

hInstance = hThisInst;

/* отображение окна */

ShowWindow(hwnd,nWinMode);

UpdateWindow(hwnd);

/* цикл сообщений */

while (GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg); /* разрешает

использование клавиатуры */ DispatchMessage(&msg); /* возвращает управление Windows */

}

return msg.wParam;

}

/* Эта функция вызывается Windows 95, которая передает ей */

/* сообщения из очереди сообщений */

LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam,

LPARAM lParam)

{

switch (message){

case WM_DESTROY: /* завершение программы */

PostQuitMessage(0);

break;

case WM_COMMAND:

/* сообщение от пункта меню - Settings */

if(LOWORD(wParam)==IDM_SETS)

{

// создание модального диалогового окна

DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1),

hwnd, (DLGPROC)Dlg_Proc);

// для немодального - Create_Dialog(-//-)

}

/* сообщение от пункта меню - Exit */

if(LOWORD(wParam)==IDM_EXIT)

{

DestroyWindow(hwnd);

}

break;

default:

/* позволяет Windows обрабатывать любые сообщения

неуказанные в предыдущем случае */

return DefWindowProc(hwnd, message,wParam,lParam);

}

return 0;

}

/* функция, обрабатывающая сообщения от диаогового окна */

BOOL CALLBACK Dlg_Proc(HWND hwnd, UINT uMsg,

WPARAM wParam, LPARAM lParam)

{

unsigned char *pBuffer;

DWORD dwType,dwSize,dwDisPos;

char s_key[40];

switch (uMsg) {

/* сообщение - инициализация диалога */

case WM_INITDIALOG:

/* создание или открытие ключа реестра */

/* параметры

1 - ключ

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

или любой из открытых ключей

2 - название подключа

3 - зарезервирован - 0

4 - указывает на строку, которая определяет тип объекта

5 - опции

6 - тип доступа

7 - структура безопасности

8 - результирующий ключ

9 - определяет, был ли создан ключ или открыт

*/

if ((RegCreateKeyEx(HKEY_LOCAL_MACHINE, SubKey,NULL, NULL,

REG_OPTION_NON_VOLATILE,KEY_READ|KEY_WRITE,NULL,

&hKeyRes,&dwDisPos))==ERROR_SUCCESS)

{

SetDlgItemText(hwnd, IDD_TEXT1, SubKey);

/*считывание размера данных параметра в ключе реестра */

/* параметры

1 - ключ

2 - название параметра

3 - зарезервирован

4 - тип параметра REG_SZ REG_DWORD REG_BINARY

5 - адрес буфера для хранения значения

NULL - если данные не требуются

6 - размер значения в байтах

*/

if (RegQueryValueEx(hKeyRes, ValueName,

NULL, &dwType, NULL, &dwSize)==ERROR_SUCCESS)

{

/* выделение памяти под значение ключа */

pBuffer=new unsigned char[dwSize];

/* считывание значения параметра из ключа реестра */

if ((RegQueryValueEx(hKeyRes, ValueName,

NULL, &dwType, pBuffer, &dwSize))==ERROR_SUCCESS

&& pBuffer!=NULL)

{

/* занесение строки в редактор диалога */

SetDlgItemText(hwnd, IDD_EDIT1, (char *)pBuffer);

delete pBuffer;

}

}

break;

}

/* обработчик сообщений от управляющих элементов диалогового окна*/

case WM_COMMAND:

switch (wParam)

{

/* сообщение от кнопки OK*/

case IDD_OK:

/* получение текста из редактора диалога */

GetDlgItemText(hwnd, IDD_EDIT1, s_key, 39);

/* занесение значения строкового параметра

в ключ реестра */

/* параметры

1 - ключ

2 - название параметра

3 - зарезервирован - 0

4 - тип значения параметра

5 - значение

6 - размер значения */

RegSetValueEx(hKeyRes, ValueName, NULL,

REG_SZ, (unsigned char*)s_key,

lstrlen(s_key));

/* закрытие ключа реестра */

RegCloseKey(hKeyRes);

/* закрытие модального окна диалога */

EndDialog (hwnd, 1);

break;

/* сообщение от кнопки CANCEL */

case IDD_CANCEL:

/* закрытие ключа реестра */

RegCloseKey(hKeyRes);

/* удаление ключа реестра */

/* параметры

1 - ключ

2 - подключ

*/

RegDeleteKey (HKEY_LOCAL_MACHINE,SubKey);

/* закрытие модального окна диалога */

EndDialog (hwnd, 1);

break;

}

}

return(FALSE);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]