Здравствуйте. В общем у меня два вопроса.. Первый.. как узнать что все элементы немодального диалога создались, чтобы можно было настроить некоторые из них(получить хенд или изменить прямоугольник прорисовки в Edit-е. см. ниже) пытался сделать это в WM_INITDIALOG но там всё в холостую, элементы не успевают создаться. Второй вопрос... нужно ли для каждого немодального диалога в цикле сообщений вызывать IsDialogMessage,hDlg,ADDR msg...IsDialogMessage,hDlg1,ADDR msg ...IsDialogMessage,hDlg2,ADDR msg или же существует более изящный вариант ? P.S. Немодальные диалоги со стилем WS_CHILD, WS_CHILDWINDOW... и имеют одну каллбек функцию на всех. Код (Text): WinMain proc hInstance:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD ... MOV wc.lpfnWndProc, OFFSET WndProc .... INVOKE CreateWindowEx,NULL,ADDR szWindowText,ADDR szWindowText,WS_CAPTION +WS_SYSMENU+WS_VISIBLE,\ CW_USEDEFAULT,CW_USEDEFAULT,778,496,NULL,NULL,hInstance,NULL MOV hwnd,EAX MOV hGlobal,EAX INVOKE ShowWindow,hwnd,CmdShow INVOKE UpdateWindow,hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!EAX) invoke IsDialogMessage,hDlg,ADDR msg ;invoke IsDialogMessage,hDlg1,ADDR msg ;invoke IsDialogMessage,hDlg2,ADDR msg .IF EAX==FALSE invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDIF .ENDW MOV EAX,msg.wParam RET WinMain WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_CREATE INVOKE CreateDialogParam,hInst,1000,hWnd,\; ADDR DlgProc,ADDR app MOV hDlg13,EAX INVOKE CreateDialogParam,hInst,1005,hWnd,\; ADDR DlgProc,1005 MOV hDlg,EAX INVOKE CreateDialogParam,hInst,1030 ,hWnd,\; ADDR DlgProc,ADDR app ... DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM .IF uMsg==WM_INITDIALOG INVOKE SendDlgItemMessage,hDlg,1012,EM_GETRECT,0,ADDR rc MOV rc.top,2 MOV rc.bottom,17 INVOKE SendDlgItemMessage,hDlg,1012,EM_SETRECT,0,ADDR rc INVOKE SendDlgItemMessage,hDlg,1013,EM_SETRECT,0,ADDR rc ; Вот тут не срабатывают настройки элемента Edit ..... Искал ответ на форуме, но увы, если пропустил извините.. Заранее спасибо.
Присвоение хендлов диалога переменным hDlgXXX происходит после сообщения WM_INITDIALOG, поэтому вызовы получают первым параметром мусор.
Код (Text): DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM LOCAL rc:RECT .IF uMsg==WM_INITDIALOG CMP lParam,1005 JNE @@End ;INVOKE RtlZeroMemory,ADDR rc,SIZEOF RECT INVOKE SendDlgItemMessage,hWnd,1012,EM_GETRECT,0,ADDR rc MOV rc.top,2 MOV rc.bottom,17 INVOKE SendDlgItemMessage,hWnd,1012,EM_SETRECT,0,ADDR rc INVOKE SendDlgItemMessage,hWnd,1013,EM_SETRECT,0,ADDR rc @@End: ... Спасибо, с этим разобрались... а что скажете на счет IsDialogMessage ?
вероятно, можно так: Код (Text): while(GetMessage(&msg, NULL, 0, 0)) { if ((msg.hwnd == hDlg1 || msg.hwnd == hDlg2 || ... ) && IsDialogMessage(msg.hwnd, &msg)) continue; TranslateMessage(&msg); DispatchMessage(&msg); } попробуй
Проверки там лишние в цикле. Просто передача в IsDialogMessage() хэндла диалога и адреса сообщения достаточно. Если функция возвратила TRUE - значит не надо далее искать.
AsmGuru62 вопрос был в том, что делать, если хендлов диалогов несколько. Для каждого вызывать IsDialogMessage?
Верно, а диалоги мне эти нужны чтобы изменяя родителя можно было перемещать контролы на другие формы в программе.
rmn Делается массив хэндлов. Когда диалог открывается (например через CreateDialogParam) его хендл заносится в массив. Диалог закрывается - найти и убрать хэндл из массива. Ну и в цикле этом - пройтись по массиву и если какой то хендл возвратит TRUE - не вызывать пару: TranslateMessage/DispatchMessage.
AsmGuru62 Суть не в том, как хранятся хендлы (в массиве или отдельными переменными), а в том, стоит ли заменять одну маш. инструкцию cmp вызовом IsDialogMessage, которая в свою очередь выполнит десятки (если не сотни) инструкций, чтобы определить, является ли переданный ей хендл и сообщение диалоговыми. Ведь если msg.hwnd != hDlgXXX (или msg.hwnd != Handles), то это сообщение точно не для наших немодальных диалогов и можно просто передать его в DispatchMessage().