2014-11-22 7 views
0

У меня возникла проблема с использованием SendMessage() и PostMessage() правильно. Дело в том, что я пытаюсь сделать, это в моей оконной процедуреПравильное использование SendMessage() и PostMessage()

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
int wmId, wmEvent; 
PAINTSTRUCT ps; 
HDC hdc; 

switch (message) 
{ 
case WM_COMMAND: 
    wmId = LOWORD(wParam); 
    wmEvent = HIWORD(wParam); 
    // Parse the menu selections: 
    switch (wmId) 
    { 
    case WM_CREATE: 
     break; 
    case IDM_ABOUT: 
     DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 
     break; 
    case IDM_EXIT: 
     DestroyWindow(hWnd); 
     break; 
    case WM_USER: 
     break; 
    case WM_USER + 1: 
     break; 
    default: 
     if (grid.ProcessEvent(wmId, wmEvent)) 
     { 
      SendMessage(hWnd, WM_USER + 1, 0, 0); 
      break; 
     } 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    break; 
case WM_DESTROY: 
    PostQuitMessage(0); 
    break; 
default: 
    return DefWindowProc(hWnd, message, wParam, lParam); 
} 
return 0; 
} 

Im не совсем уверен, почему это не работает, может быть, кто-то может помочь SendMessage(hWnd, WM_USER + 1, 0, 0);. Я уверен, что вызывается SendMessage (...), но это не влияет на запуск WndProc с моими аргументами.

ответ

0

SendMessage указывается так, чтобы он не возвращался до тех пор, пока окно получателя не обработало сообщение, которое оно не может выполнить, так как вы находитесь внутри своего собственного WndProc и сами передаете сообщения. Это один из тех случаев, когда вы должны использовать PostMessage.

2

Метка корпуса case WM_USER + 1: вложена во внутренний регистр корпуса (который включает wmId). Он должен быть перенесен в оператор case switch (message), поэтому он находится на том же уровне вложенности, что и case WM_COMMAND: и case WM_DESTROY:.

Вышеуказанное также относится к case WM_USER:.

Смежные вопросы