
- •Министерство образования и науки Российской Федерации
- •1. Работа с реестром
- •1.1. Создание - открытие раздела
- •1.2. Чтение параметров раздела реестра
- •1.3. Занесения значения параметра раздела реестра
- •1.4. Закрытие раздела
- •1.5. Удаление раздела
- •2. Диалоговые окна. Определение и назначение
- •2.1. Описание диалогового окна в файле ресурсов
- •2.2. Функция диалогового окна
- •2.3. Вызов модального диалогового окна
- •2.4. Закрытие модального диалогового окна
- •2.5. Вызов немодального диалогового окна
- •2.6. Получения и занесения данных в элементы управления диалогового
- •3. Порядок выполнения работы
- •4. Контрольные вопросы
- •Приложение Файл reg_dlg.Cpp
- •Файл reg_dlg.Rc
- •Файл resource.H
3. Порядок выполнения работы
Создать пустой проект на VC 6.0. Добавить к проекту файлы из приложения. Откомпилировать, отлинковать и запустить программу.
Разобраться во внутреннем строении программы. Найти точки инициализации и вызова диалогов. Найти в программе создание, чтение и запись в разделы реестра. Просмотреть c помощью утилиты regedit созданные программой разделы
Добавить в окно диалога два редактора.
Изменить программу так, чтобы в окне рисовался эллипс. Цвет эллипса задается с помощью диалога (три редактора соответствуют трем компонентам цвета R, G, B).
После изменения цвета эллипса, его три компонента заносятся в реестр.
При последующих запусках программы, цвет эллипса берется из реестра.
При вызове диалога компоненты цвета должны отображаться в редакторах.
Повышенная сложность:
Сделать простой редактор реестра на основе диалогового окна. В диалоговом окне три редактора. В первом редакторе указывается раздел реестра и параметр, который надо занести. Во втором значение параметра. В третьем по нажатию кнопки “Применить” высвечивается TRUE в случае успешного занесения параметра и FALSE в обратном случае.
4. Контрольные вопросы
Что такое диалоговое окно? В чем его назначение?
Опишите последовательность действий для использования диалоговых окон.
В чем отличие модального и немодального диалогового окна?
Какое сообщение используется для инициализации данных диалогового окна?
Какие функции используются для получения и занесения информации в элементы диалогового окна?
Что такое реестр? В чем назначение реестра? Перечислите основные разделы реестра и опишите его структуру.
Какая функция используется для создания и открытия разделов реестра? Какие функции используются для записи и чтения параметров из раздела реестра?
Какая функция используется для закрытия раздела реестра?
Какая функция используется для удаления реестра?
Приложение Файл 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);
}