Как обработать событие клика в Win32 API? - PullRequest
2 голосов
/ 26 марта 2010

Я создал простое приложение win 32 ... в котором оно имеет текстовое поле и кнопку в диалоговом окне ... Сначала, когда я создал это ... оно не отображает диалоговое окно, а затем добавляется код ниже, чтобы обработать закрытие (WM_CLOSE) диалогового окна ... но я хочу знать, как обрабатывать событие нажатия кнопки ..

  void ValidatePassword(CString encryptedPassword)
{
    //create password dialog window
    CreateEvent(NULL,true,false,L"TestEvent");
    MSG msg;
    HWND hwnd = CreateWindowEx(0,WC_DIALOG,L"Security Alert",WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                    600,300,300,200,NULL,NULL,NULL,NULL);

    //create label
    CreateWindowEx(NULL,L"Static",L"Requires Password to Run the File:", WS_CHILD|WS_VISIBLE,
                    10,25,300,20,hwnd,(HMENU)label_id,NULL,NULL);

    //create textboxcontrol within the dialog
    CreateWindowEx(WS_EX_CLIENTEDGE,L"EDIT",L"",WS_CHILD|WS_VISIBLE | ES_PASSWORD,
                    10,50,125,25,hwnd,(HMENU)textbox_id,NULL,NULL);
    //create button
    HWND button = CreateWindowEx(WS_EX_CLIENTEDGE,L"Button",L"OK",WS_CHILD|WS_VISIBLE,
                    10,100,100,25,hwnd,(HMENU)button_id,NULL,NULL);

    ShowWindow (hwnd, SW_SHOW);
    UpdateWindow(hwnd);
    //SetWindowLong(button,DWL_DLGPROC, (long)myProc);

    while(GetMessage(&msg,NULL,0,0))
    {

        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }




}

LRESULT WINAPI myProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{


    HWND hwndButton;
    switch (message)
    { 
        /* Handles all Windows Messages */
        case WM_COMMAND:

            {
              if(((HWND)lParam) && (HIWORD(wParam) == BN_CLICKED))
              {
                int iMID;
                iMID = LOWORD(wParam);
                switch(iMID)
                {
                  case button_id:
                      {
                       MessageBox(hwnd, (LPCTSTR)"You just pushed me!",  (LPCTSTR) "My Program!", MB_OK|MB_ICONEXCLAMATION);
                       break;
                       }
                  default:
                       break;
                }
              }
              break;
            }
        case WM_DESTROY:
            {
              PostQuitMessage (0);       /* send a WM_QUIT to Message Queue, to shut off program */
              break;
             }
    }

    return 0; 
}

Ответы [ 2 ]

7 голосов
/ 26 марта 2010

Хлоп.

Нет необходимости вызывать SetWindowLong, чтобы установить процедуру диалога для диалога. Ваша «простая» программа должна выглядеть примерно так:

#include <windows.h>
#include "resource.h"

BOOL CALLBACK myProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch(uMsg)
  {
  case WM_INITDIALOG:
    return TRUE;
  case WM_COMMAND:
    if( LOWORD(wParam) == IDCLOSE) // close button click
      EndDialog(hwnd,0);
    return TRUE;
  }
  return FALSE;
}

int CALLBACK WinMain(HINSTANCE hExe,HINSTANCE,LPCSTR,INT)
{
  return DialogBox(hExe,MAKEINTRESOURCE(IDD_DIALOG),NULL,myProc);
}
4 голосов
/ 26 марта 2010

Проверка для WM_COMMAND . LOWORD(wParam) будет вашим контрольным ID, а lParam будет вашим hWnd для кнопки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...