Использование немодального диалога 10510w2224k
Win
В завершение данной главы преобразуем модальный диалог из предыдущего примера в немодальный. Использование немодального диалога 10510w2224k потребует несколько больше усилий, чем использование модального, - в основном потому, что немодальный диалог является более независимым окном, нежели модальный. В процессе работы немодального диалога 10510w2224k программа остается активной, так что диалог и породившее его окно продолжают получать сообщения. Таким образом, для включения в программу немодального диалога 10510w2224k необходимо вставить дополнительный фрагмент в цикл обработки сообщений Вашей программы.
Для создания немодального диалога 10510w2224k вместо функции DialogBox API CreateDialog
HWND CreateDialog(HINSTANCE hThisInst,
LPCSTR lpName,
HWND hwnd
DLGPROC IpDFunc
hThisInst WinMain lpName - имя диалога 10510w2224k , определенное в файле ресурсов, hwnd - дескриптор родительского окна для диалога 10510w2224k , а lpDFunc - указатель на функцию диалога 10510w2224k . Функция диалога 10510w2224k в данном случае должна быть описана так же, как и для модального диалога 10510w2224k .
ShowWindow . Однако если при определении диалога 10510w2224k в файле ресурсов добавить стиль WS VISIBLE
Для завершения немодального диалога 10510w2224k программа должна вызвать функцию DestroyWindow EndDialog DestroyWindow
BOLL DestroyWindow HWND hwnd
hwnd должен задавать дескриптор закрываемого окна (в данном случае диалога 10510w2224k ).
IsDialogMessage , направляющей сообщения диалога 10510w2224k Вашему немодальному диалогу:
BOOL IsDialogMessage(HWND hdwnd, LPMSG msg);
hdwnd содержит дескриптор окна немодального диалога 10510w2224k , a msg GetMessage . Эта функция возвращает ненулевое значение, если сообщение предназначено для диалога 10510w2224k , и нуль в противном случае. Если сообщение предназначено для диалога 10510w2224k , оно будет автоматически направлено ему. Таким образом, для работы с немодальным диалогом цикл обработки сообщений Вашей программы должен выглядеть следующим образом:
while(GetMessage(&msg,NULL,0,0))
if(!IsDialogMessage(hDlg,&msg))
if(!TranslateAccelerator(hwnd,hAccel,&msg))
Как видите, сообщение обрабатывается обычным образом только в том случае, если оно не предназначено для диалога 10510w2224k .
Создание немодального диалога 10510w2224k . Преобразование модального диалога 10510w2224k из предыдущего примера в немодальный потребует небольших изменений в программе. Прежде всего необходимо внести изменения в файл ресурсов Mydialog rc. Поскольку немодальный диалог при создании не отображается автоматически, добавьте в определение диалога 10510w2224k стиль WS VISIBLE Mydialog rc
#include "Mydialog.h"
#include <Windows.h>
MYMENU MENU
MYMENU ACCELERATORS
MYDB DIALOG 18, 18, 142, 92
CAPTION " "
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU|
WS_VISIBLE
IsDialogMessage
CreateDialog DialogBox
3) для закрытия диалога 10510w2224k заменить функцией DestroyWindows EndDialog
. Полный текст программы, использующей немодальный диалог (с внесенными изменениями), приводится ниже. Пример работы программы приведен на рис. 5.4. Обязательно попробуйте запустить эту программу, чтобы полностью понять разницу между модальным и немодальным диалога 10510w2224k ми.
// Демонстрация немодального диалога 10510w2224k
include <Windows h>
#include <String.h>
#include <Stdio.h>
#include "Mydialog.h"
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);
char szWinName[]="МоеОкно"; // Имя класса окна
HINSTANCE hInst;
HWND hDlg; // диалога 10510w2224k
int WINAPI WinMain(HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
return msg wParam
}
Windows
LRESULT CALLBACK WindowFunc HWND hwnd
UINT message,
WPARAM wParam,
LPARAM lParam)
break;
case WM DESTROY
PostQuitMessage
break
default // Все сообщения, не обрабатываемые
// в данной функции, направляются
// на обработку по умолчанию
return DefWindowProc(hwnd, message,
wParam, lParam);
}
return 0;
}
// Простая функция диалога 10510w2224k
BOOL CALLBACK DialogFunc(HWND hdwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
return 1;
case IDD_SELFRUIT: //Кнопка "Выбери фрукт"
i=SendDlgItemMessage(hdwnd,ID_LB1,
LB_GETCURSEL,
0, 0L);
if( i > -1)
sprintf
(str
"Индекс выбранного элемента %d",
i);
else
sprintf(str,"Фрукт не выбран");
MessageBox(hdwnd,str,"Сделан выбор",
MB_OK);
return 1;
case IDOK: // Кнопка IDOK "Конец ввода"
GetDlgItemText(hdwnd,ID_EB1,str,80);
MessageBox(hdwnd, str, "Содержимое окна ввода",
MB_OK);
return 1;
}
case WM_INITDIALOG: // Инициализация списка
SendDlgItemMessage(hdwnd, ID_LB1,
LB_ADDSTRING,
0, (LPARAM)"Яблоко");
SendDlgItemMessage(hdwnd, ID_LB1,
LB_ADDSTRING,
0, (LPARAM)"Апельсин");
SendDlgItemMessage(hdwnd, ID_LB1,
LB_ADDSTRING,
0, (LPARAM)"Груша");
SendDlgItemMessage(hdwnd, ID_LB1,
LB_ADDSTRING,
0, (LPARAM)"Виноград");
return 1;
return
}
|