Сейчас на форуме: vasilevradislav, Kybyx, Rio (+3 невидимых)

 eXeL@B —› Оффтоп —› MessageBox не закрывается о_О
Посл.ответ Сообщение

Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 27 марта 2009 00:00
· Личное сообщение · #1

даж стыдно такое в раздел программирование постить.

короче после такого кода:

Code:
  1. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
  2. {
  3.          switch (msg) {
  4.                  case WM_COMMAND:
  5.                         switch (LOWORD(wParam)) {
  6.                               case ADDTYPE_APPLY:
  7.                                    if (HIWORD(wParam) == BN_CLICKED) {
  8.                                        MessageBoxA(0, "Apply", NULL, MB_OK);
  9.                                    }
  10.                                    break;
  11.                               case ADDTYPE_CANCEL:
  12.                                    if(HIWORD(wParam) == BN_CLICKED) {
  13.                                        
  14.                                    }
  15.                                    break;
  16.                         }
  17.                         break;
  18.                  case WM_DESTROY:
  19.                         PostQuitMessage(NULL);
  20.                         break;
  21.          }
  22.          return DefWindowProc(hwnd, msg, wParam, lParam);
  23. }

mesageBox не закрывается.
Пример в атаче.


e1d8_26.03.2009_CRACKLAB.rU.tgz - fileTypes.exe

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 27 марта 2009 00:16
· Личное сообщение · #2

Stack пишет:
mesageBox не закрывается

и не открывается тож =)))




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 27 марта 2009 00:26
· Личное сообщение · #3

первым параметром MessageBox указывай хэндл окна (hWnd)
и проверку на BN_CLICKED проводи ДО
и не забывай возвращать FALSE там, где это требуется

-----
EnJoy!




Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 27 марта 2009 00:50
· Личное сообщение · #4

Ara пишет:
и не открывается тож =)))


нажмай на "ОК".

Jupiter пишет:
первым параметром MessageBox указывай хэндл окна (hWnd)

Это само собой просто надо с этим глюком разобратся для начала.

Jupiter пишет:
и проверку на BN_CLICKED проводи ДО

Всмысле до switch (LOWORD(wParam)) ?

PS: делать интерфейсы на более низком уровне чем Delphi VCL сложнее, но намного интереснее.

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 27 марта 2009 08:35 · Поправил: BoRoV
· Личное сообщение · #5

Stack пишет:
Jupiter пишет:
и проверку на BN_CLICKED проводи ДО

Всмысле до switch (LOWORD(wParam)) ?

Code:
  1. LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam) 
  2.          switch (msg) { 
  3.                  case WM_COMMAND: 
  4.                         if (HIWORD(wParam) == BN_CLICKED) {
  5.                               switch (LOWORD(wParam)) { 
  6.                                     case ADDTYPE_APPLY: 
  7.                                           MessageBoxA(0, "Apply", NULL, MB_OK);
  8.                                           break;
  9.                                     case ADDTYPE_CANCEL:                                          
  10.                                           break;
  11.                                }
  12.                         }
  13.                         break;
  14.                  case WM_DESTROY: 
  15.                         PostQuitMessage(NULL);
  16.                         break;
  17.          } 
  18.          return DefWindowProc(hwnd, msg, wParam, lParam);
  19. }


-----
Лучше быть одиноким, но свободным © $me




Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 27 марта 2009 13:59 · Поправил: Stack
· Личное сообщение · #6

BoRoV, ну это я понял.
Вопрос оптимизации кода я не затрагивал - все равно этот коллбэк для отладки кой какий функций диалога.

все равно идрен-батон не закрывается.
Мне просто интересно - как это происходит.
Поковыряюсь еще чуть в дебагере.

Add: Выяснил что функция мессагбокса не возвращает управление проге. И главное при других случаях все работает. И еще если убрать создание диалога все работает.

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 27 марта 2009 16:10
· Личное сообщение · #7

ну что ж ты ленивый то такой...
я же уже ответил на твой вопрос!

и не забывай возвращать FALSE там, где это требуется

DefWindowProc НЕ МОЖЕТ выполняться ВСЕГДА !!!

DefWindowProc выполняется ТОЛЬКО тогда, когда твой код не отработал и нужно стандартное действие системы!

если ты и сейчас не понимаешь (может ну его, программирование, а?), мой те совет:
почитай про оконную процедуру, что она должна возвращать, для чего служит DefWindowProc и т.д.

ты удивляешься, почему твой код теряет управление, хотя сам же безусловно вызываешь DefWindowProc!

case WM_COMMAND
case WM_DESTROY
case else
!!! DefWindowProc здесь !!!

-----
EnJoy!




Ранг: 107.5 (ветеран)
Активность: 0.150
Статус: Участник

Создано: 27 марта 2009 16:14 · Поправил: Stack
· Личное сообщение · #8

Jupiter это я не ленивый это пример того до чего человека VCL доводит.

надо будет поподробнее о оконной процедуре почитать, а дефвинпроц значит в секции default надо обрабатывать.

Да и к тому же ДО ДЕФВИНПРОЦА УПРАВЛЕНИЕ В СЛУЧАЕ МЕСАГБОКСА не доходит.

Короче вы меня не правильно поняли скорее всего. А тему лучше закрою.

ADD: не работало из-за непраильного цикла - надо нулл ставить.

while (GetMessage(&msg, hWnd, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}

-----
Md5 fcbb6c9c9a5029b24d70f2d67c7cca74



 eXeL@B —› Оффтоп —› MessageBox не закрывается о_О

У вас должно быть 20 пунктов ранга, чтобы оставлять сообщения в этом подфоруме, но у вас только 0

   Для печати Для печати