如何检查按钮是否被按下

问题描述:

我的目标是用一堆不同的子控件填充窗口的客户区。像按钮复选框和静态文本的东西,但我很难找出如何捕捉按钮单击消息。如何检查按钮是否被按下

我的代码:

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

我试图抓住我的第一个按钮labaled按钮1,并具有 “ID” BUTTON1。我试图在我的WM_COMMAND中捕捉它们,并且它说我的BUTTON1是未识别的。

+0

我试图在我的WM_COMMAND中捕捉我的BUTTON1并切换wParam的LOWORD。它只是说BUTTON1没有被识别。 – 2013-05-13 15:52:27

+0

@JesseMoreland,它在'WinMain'中。你的程序看不到它。 – chris 2013-05-13 15:53:38

+0

我必须制定一个儿童控制程序? – 2013-05-13 15:53:52

你所寻找的是:

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

但在此之前它可以识别BUTTON1你将不得不宣布它以这样一种方式,它可以通过消息处理程序予以确认:例如使之成为全球变量,而不是在WinMain中声明它:

HMENU  BUTTON1; 

int WINAPI WinMaietcetc.. 

让我知道这是否工作!

+0

它的工作种类。它说BUTTON1需要是一个可修改的表达。现在更新代码。 – 2013-05-13 16:01:47

+0

您需要给BUTTON1一个值,所以'HMENU BUTTON1 = 5'。你最好使用define('#define BUTTON1 5')或'const int'而不仅仅是HMENU – 2013-05-13 16:04:18

+0

因为它是一个开关,我认为它必须是const或定义的,以便它被允许由编译器 – 2013-05-13 16:05:18