c++ - 如何检查按钮是否被按下

标签 c++ winapi button

我的目标是用一堆不同的子控件填充我窗口的客户区。诸如按钮复选框和静态文本之类的东西,但我很难弄清楚如何捕获按钮单击消息。

我的代码:

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

HMENU        BUTTON1;

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    LPSTR lpszCmdParam, int nCmdShow)
     {
     static char szAppName[] = "Keyboarding" ;
     HWND        hwnd;
     MSG         msg;   
     WNDCLASS    wndclass; 
     HMENU       hMenu;


     hMenu = LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));

     if (!hPrevInstance)
          {
          wndclass.style         = CS_HREDRAW | CS_VREDRAW;
          wndclass.lpfnWndProc   = WndProc;
          wndclass.cbClsExtra    = 0;
          wndclass.cbWndExtra    = 0;
          wndclass.hInstance     = hInstance ;
          wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
          wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
          wndclass.hbrBackground = static_cast<HBRUSH>(GetStockObject (WHITE_BRUSH));
          wndclass.lpszMenuName  = NULL ;
          wndclass.lpszClassName = szAppName ;

          RegisterClass (&wndclass) ;
      }

     hwnd = CreateWindow (szAppName,         // window class name
                    "Lab 6",   // window caption
                    WS_OVERLAPPEDWINDOW,     // window style
                    CW_USEDEFAULT,           // initial x position
                    CW_USEDEFAULT,           // initial y position
                    CW_USEDEFAULT,
                    CW_USEDEFAULT,                // hmmmmm???
                    NULL,                    // parent window handle
                    hMenu,                    // window menu handle
                    hInstance,               // program instance handle
                  NULL) ;              // creation parameters

     HWND button1 = CreateWindow( WC_BUTTON, 
                         "Push Button", 
                         WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 
                         50, 
                         50, 
                         100, 
                         24, 
                         hwnd, 
                         BUTTON1, 
                         hInstance,
                         NULL);

     HWND button2 = CreateWindow( WC_BUTTON, 
                         "Auto Check Button?", 
                         WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 
                         50, 
                         50, 
                         100, 
                         24, 
                         hwnd, 
                         NULL, 
                         hInstance,
                         NULL);

     HWND button3 = CreateWindow( WC_BUTTON, 
                         "Push Button", 
                         WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 
                         50, 
                         50, 
                         100, 
                         24, 
                         hwnd, 
                         NULL, 
                         hInstance,
                         NULL);

     HWND editControl = CreateWindow( WC_BUTTON, 
                         "Push Button", 
                         WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 
                         50, 
                         50, 
                         100, 
                         24, 
                         hwnd, 
                         NULL, 
                         hInstance,
                         NULL);

     HWND StaticControl = CreateWindow( WC_STATIC, 
                         "Hello World", 
                         WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 
                         50, 
                         100, 
                         100, 
                         24, 
                         hwnd, 
                         NULL, 
                         hInstance,
                         NULL);

     HWND ListBox = CreateWindow( WC_BUTTON, 
                         "Push Button", 
                         WS_TABSTOP|WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, 
                         50, 
                         50, 
                         100, 
                         24, 
                         hwnd, 
                         NULL, 
                         hInstance,
                         NULL);

     ShowWindow (hwnd, nCmdShow) ;
     UpdateWindow (hwnd) ;

     while (GetMessage (&msg, NULL, 0, 0))
          {
            TranslateMessage (&msg) ;
            DispatchMessage (&msg) ;
          }
     return (int) msg.wParam ;
     }

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, UINT wParam,
                            LONG lParam)
     {
     HDC         hdc ;
     PAINTSTRUCT ps ;
     TEXTMETRIC  tm;
     RECT        rClientRect;
     RECT        rWindowRect;
     SIZE        size;
     int        cButtons = 0;

     switch (message)
          {         

     case WM_COMMAND:
         switch(LOWORD(wParam))
         {
         case BUTTON1:
             break;
         }      

          case WM_PAINT:
                hdc = BeginPaint (hwnd, &ps) ;

                EndPaint (hwnd, &ps) ;
                return 0 ;

          case WM_DESTROY:
                PostQuitMessage (0) ;
                return 0 ;
          }

     return DefWindowProc (hwnd, message, wParam, lParam) ;
     }

我正在尝试捕捉我的第一个按钮,标签为 button1 并且具有“ID”BUTTON1。我试过在我的 WM_COMMAND 中捕获它们,但它说我的 BUTTON1 未被识别。

最佳答案

您正在寻找的是:

case WM_COMMAND:
    switch(LOWORD(wParam)) {
         case BUTTON1: {

但在它识别 BUTTON1 之前,您必须以消息处理程序可以识别的方式声明它:例如,将其设为全局变量,而不是在 WinMain 中声明它:

HMENU       BUTTON1;

int WINAPI WinMaietcetc..

让我知道这是否可行!

关于c++ - 如何检查按钮是否被按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525942/

相关文章:

c# - 如何设计应从 C++ 和 C# 访问的组件

C++/MySQL,在 1 次执行中插入 200 个数据点数组

c++ - 等待 Win32 应用程序中的特定键

c++ - 定时器超时复位

javascript - 如何创建一个计数器循环,该循环在单击提交按钮时启动并输出多行单词,每个单词前面有一个数字?

c++ - Qt永久删除文件

windows - 使用 ShellExecuteEx 启动外部应用程序并等待它初始化

javascript - 同框打开URL+元素值

java - 如何将 JDialog 链接到 JButton 单击

c++ - 如何使用 C++ 中的 openssl 库验证自签名证书?