Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab_progr_Win / Lab9.doc
Скачиваний:
9
Добавлен:
23.03.2015
Размер:
1.11 Mб
Скачать

Lresult callback WndProc (hwnd hwnd, uint iMsg, wparam wParam, lparam lParam) {

switch (iMsg)

{

case WM_COMMAND:

switch (wParam){

case IDM_ABOUT:

break;

case IDM_TEXT:

break;

case IDM_INTEGER:

break;

case IDM_EXIT:

SendMessage(hwnd, WM_CLOSE, 0, 0L);

break;

default:

break; }

return 0;

case WM_PAINT :

hdc = BeginPaint (hwnd, &ps) ;

  1. Тепер створимо віконні процедури, що будуть обслуговувати вікна діалогів. Діалогова процедура чи процедура діалогу програми обробляє повідомлення, одержувані вікном діалогу. Хоча вона дуже сильно нагадує віконну процедуру, це не дійсна віконна процедура. Віконна процедура вікна діалогу знаходиться в Windows. Ця віконна процедура викликає вашу діалогову процедуру, передаючи їй багато які з повідомлень, що одержує сама. Тут представлена процедура діалогу ABOUT програми ATIDIA:

#include <windows.h>

#include "resource.h"

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

BOOL CALLBACK AboutDiaProc(HWND, UINT, WPARAM, LPARAM) ;

static char szAppName[] = "Dialogs" ;

BOOL CALLBACK AboutDiaProc(HWND hdlg, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

switch (iMsg){

case WM_INITDIALOG:

return TRUE;

case WM_COMMAND:

switch (LOWORD(wParam)){

case IDOK:

EndDialog(hdlg, TRUE);

break;

default: return 0;

}

break;

default: return 0;}

return TRUE;}

Параметри цієї функції ті ж, що і параметри звичайної віконної процедури; як і віконна процедура, процедура діалогу повинна бути визначена як функція типу CALLBACK. Хоча в якості дескриптора вікна діалогу використовувався дескриптор hdlg, замість нього можна при бажанні використовувати hwnd. Зверніть увагу на відмінності між цією функцією і віконною процедурою:

  • Віконна процедура повертає значення типу LRESULT; а процедура діалогового вікна — значення типу BOOL (обумовлене в заголовних файлах Windows як int).

  • Якщо віконна процедура не обробляє якесь повідомлення, вона викликає DefWindowProc; процедура діалогу, якщо вона не обробляє повідомлення, повертає FALSE (0), а якщо обробляє, то TRUE (ненульове значення).

  • Процедура діалогу не обробляє повідомлення WM_PAINT і WM_DESTROY. Процедура діалогу не одержить повідомлення WM_CREATE; замість цього вона виконує ініціалізацію при обробці спеціального повідомлення WM_INITDIALOG.

Повідомлення WM_INITDIALOG є першим повідомленням, що одержує процедура діалогу. Це повідомлення посилається тільки процедурам діалогу. Якщо процедура діалогу повертає TRUE, то Windows поміщає фокус уведення на перше дочірнє вікно елемента керування, що має стиль WS_TABSTOP. З іншого боку, при обробці повідомлення WM_INITDIALOG процедура діалогу може використовувати функцію SetFocus для того, щоб установити фокус на одне з дочірніх вікон керування вікна діалогу, і тоді вона повинна повернути значення FALSE.

Єдиним повідомленням, що залишилося, що обробляє процедура вікна діалогу, є WM_COMMAND. Це те повідомлення, що елемент керування кнопка посилає своєму батьківському вікну тоді, коли або на ній виробляється щелчок мишею, або натиснута клавіша <Spacebar> (пробіл) і кнопка має фокус введення. Ідентифікатор дочірнього вікна елемента керування (який у шаблоні вікна діалогу дорівнює IDOK) знаходиться в молодшому слові параметра wParam. Для цього повідомлення процедура діалогу викликає функцію EndDialog, що повідомляє Windows про необхідність закриття вікна діалогу. Для всіх інших повідомлень процедура діалогу повертає FALSE, повідомляючи віконній процедурі вікна діалогу усередині Windows, що процедура діалогу програми не обробляє повідомлення.

Повідомлення для модального вікна діалогу не проходять через чергу повідомлень програми, тому не турбуйтеся про вплив швидких клавіш на роботу вікна діалогу.

  1. Для того, щоб діалог викликався при виборі відповідного пункту меню, необхідно додати до програми наступний код:

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) {

HDC hdc ;

PAINTSTRUCT ps ;

static HINSTANCE hInstance ;

switch (iMsg)

{

case WM_CREATE :

hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;

return 0 ;

case WM_COMMAND:

switch (wParam){

case IDM_ABOUT:

Соседние файлы в папке Lab_progr_Win