如何在win32 API中处理click事件?

时间:2010-03-26 08:59:50

标签: c api winapi

我创建了一个简单的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 个答案:

答案 0 :(得分:7)

让人惊讶。

没有必要调用SetWindowLong为对话框设置对话框proc。你的“简单”程序应该看起来像

#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);
}

答案 1 :(得分:4)

检查WM_COMMANDLOWORD(wParam)将成为您的控件ID,lParam将成为您按下的按钮。