Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.88.249] |
|
Страницы: (4) « Первая ... 2 3 [4] все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Есть подозрение, что функцию EndDialog не надо вызывать как у вас, ибо на это намекает справка:
Цитата а у вас диалог создаётся просто как окошко... Remarks Dialog boxes created by the DialogBox, DialogBoxParam, DialogBoxIndirect, and DialogBoxIndirectParam functions must be destroyed using the EndDialog function. An application calls EndDialog from within the dialog box procedure; the function must not be used for any other purpose. Добавлено Но в том конкретном вашем примере сработает и так: BOOL CALLBACK DlgProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: ShowWindow( hwnd, SW_MAXIMIZE); break; case WM_CLOSE: EndDialog( hwnd, wParam); PostMessage( hwnd, WM_QUIT, wParam, lParam); ... BOOL CALLBACK DlgProcBtn( HWND hwndBtn, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_INITDIALOG: ShowWindow( hwndBtn, SW_NORMAL); MoveDlg( hwnd, hwndBtn); break; case WM_COMMAND: { switch (LOWORD(wParam)) { case IDOK: EndDialog(hwndBtn,1); PostMessage(GetParent(hwndBtn),WM_CLOSE,1,0); return TRUE;//break; case IDCANCEL: EndDialog(hwndBtn,0); PostMessage(GetParent(hwndBtn),WM_CLOSE,0,0); ... |
Сообщ.
#47
,
|
|
|
[QUOTE=Cfon,1484463663,3702023]смотрел смотрел твой проект и них** не понял
зачем создается два диалога? только для группировки двух кнопок? [/QUOTE] На самом деле будет много контролов на основном диалоге. Добавлено [QUOTE=Славян,1484466124,3702028]Есть подозрение, что функцию EndDialog не надо вызывать как у вас, ибо на это намекает справка:[QUOTE]а у вас диалог создаётся просто как окошко... [/QUOTE] Спасибо большое, сработало. А как правильно вызывать EndDialog и создавать диалог (не просто как окошко)? Как правильно в моем примере это сделать? |
Сообщ.
#48
,
|
|
|
Можно так попробовать:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //MSG msg; //hwnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc); //hwndBtn = 0;//CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hwnd, (DLGPROC)DlgProcBtn); return DialogBox( hInstance, MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc); } BOOL CALLBACK DlgProc( HWND lhwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch( msg ) { case WM_INITDIALOG: ShowWindow( hwnd = lhwnd, SW_MAXIMIZE); // говорим, что глобальная - это как локальная hwndBtn = CreateDialog( NULL, MAKEINTRESOURCE(IDD_DIALOG2), lhwnd, (DLGPROC)DlgProcBtn); break; case WM_CLOSE: EndDialog( lhwnd, wParam); PostMessage(lhwnd,WM_QUIT,wParam,lParam); ... Добавлено Ай, WM_QUIT в данном случае даже излишне. |
Сообщ.
#49
,
|
|
|
Цитата tumanovalex @ А как правильно вызывать EndDialog и создавать диалог (не просто как окошко)? Как правильно в моем примере это сделать? EndDialog разрушает модальное диалоговое окно, немодальное удаляется через DestroyWindow. Чтобы закрыть диалог из другого окна диалога надо послать пользовательское сообщение и обработать его в диал.процедуре окна владельца BOOL CALLBACK DlgProc1(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case UM_CLOSEWINDOW: EndDialog(hwnd,0); return TRUE; } return FALSE; } BOOL CALLBACK DlgProc2(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: case IDCANCEL: SendMessage(GetParent(hwnd), UM_CLOSEWINDOW, 0, 0); return TRUE; } } return FALSE; } |
Сообщ.
#50
,
|
|
|
Спасибо за ответы. Теперь понятно.
|
Сообщ.
#51
,
|
|
|
А когда нужно использовать IsDialogMessage, о которой упоминается в сообщении B.V.?
|
Сообщ.
#52
,
|
|
|
Цитата tumanovalex @ А когда нужно использовать IsDialogMessage, о которой упоминается в сообщении B.V.? в случае немодального окна: while(GetMessage(...)) { if (!IsDialogMessage(...)) { DispatchMessage(...); } } обработаное в IsDialogMessage сообщение не должно обрабатывается повторно в DispatchMessage. |
Сообщ.
#53
,
|
|
|
Спасибо за ответ.
|