如何在Win32 API中处理点击事件?

6

我创建了一个简单的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; 
}

有没有人能告诉我button_id和textbox_id是什么意思,它们在哪里声明? - Ravindra Gupta
2个回答

9

哎呀。

在对话框中调用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);
}

它不起作用了...可能是我做错了什么...请检查我的编辑。 - kiddo
DialogBox() API是创建对话框比CreateWindow()更简单的方式,因为它管理消息循环,并从对话框资源创建控件。如果您使用CreateWindow(因为您不想使用对话框资源),则确实需要使用SetWindowLong来设置对话框过程。 - Chris Becke
是的,我接受您建议的内容...现在它可以工作了...谢谢。 - kiddo
扩展的示例代码有助于理解为什么你要以那种方式做事情 :) - Chris Becke

5

检查 WM_COMMANDLOWORD(wParam) 是您的控件ID,lParam 是按钮的 hWnd。


你的意思是调用 myProc(NULL,WM_COMMAND,(WPARAM)button_id,(LPARAM)hwnd); 吗? - kiddo
错误,你不是用那些参数来调用函数的,那是由Windows调用你的函数(假设你设置正确)。而wParam并不是控件ID,只有它的低半部分才是。 - Blindy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接