[WinApi] Jak obsluzyc komunikaty o kliknieciu buttona?

0

Mam sobie okno w WinApi napisane, nie jest to dialgo tylko zwykle okno. Mam tam Buttona i mam swoja poetle komunikatow. Jak zrobic tak zeby po kliknieciu na buttona cos tak sie zdazylo, np MessageBox sie pokazal? wiem jak go pokazac, ale nie wiem jak podpiac jakies zdazenie.
Prosze o pomoc!

0

Button'y wysylaja do okna komunikaty WM_COMMAND, ktore w mlodszym slowie wparam maja identyfikator buttona (nadaje mu sie go przy tworzeniu). Musisz te komunikaty odpowiednio obslużyć. Przykład funkcji obsługi komunikatów (tworzy jeden przycisk przy WM_CREATE, wyswietla mu messagebox przy WM_COMMAND):

LRESULT CALLBACK wmessagescontrol(HWND whandle,UINT winmsg,WPARAM wpar,
                             LPARAM lpar)
{
    switch (winmsg) 
    { 
        case WM_CREATE:
                CreateWindow("BUTTON","Przycisk",
                             WS_CHILD|WS_VISIBLE,10,10,120,25,
                             whandle,(HMENU)100,hInstance,NULL);
                break;
        case WM_COMMAND:
                switch (LOWORD(wpar))
                {
                case 100:
                                MessageBox(whandle,"Nacisnales przycisk","Wiadomosc",MB_OK);
                                break;
                default:
                                break;
                }
                break;
        case WM_DESTROY: 
                PostQuitMessage(0);
                        break;
        default: 
                return (DefWindowProc(whandle,winmsg,wpar,lpar)); 
    } 
    return(0L); 
}
0

O to ci chodziło ?

typedef void (*ButtonClickProc)(HWND hwndButton, WORD wIdButton, WORD wNotifyCode);

ButtonClickProc ButtonClick = NULL;

void BtnClick(HWND hwndButton, WORD wID, WORD wNotifyCode)
{
   switch(wNotifyCode)
   {
      case BN_CLICKED:
         MessageBox(NULL, "Przycisk kliknięty", "BtnClick", MB_OK);
      ...
   }
}

gdzieś w programie

ButtonClick = BtnClick;

a w pętli obsługując WM_COMMAND (zamiast tamtego MessageBox'a)

if(ButtonClick != NULL) ButtonClick((HWND) lParam, LOWORD(wParam), HIWORD(wParam));

Jak masz więcej buttonów, to najlepiej zamist funkcji ButtonClick wysyłać komunikat do okna buttona o kodzie WM_USER + wNotifyCode. Niech każdy button ma dopiętą do własnej pętli komunikatów swoją procedure ze switch'em na MSG o wartościach WM_USER + BN_CLICKED, WM_USER + BN... itd. Wtedy każdy button, jak obsłuży taki komunikat, może wywołać swoją własną procedure, np. procedure kliknięcia, tak jak w moim przykładzie wcześniej.</cpp>

1 użytkowników online, w tym zalogowanych: 0, gości: 1