2013-05-13 4 views
0

Моя цель - заполнить клиентскую область моего окна кучей различных дочерних элементов управления. Такие вещи, как кнопки флажки и статический текст, но мне сложно определить, как поймать сообщение с нажатой кнопкой.Как проверить, была ли нажата кнопка

Мой код:

#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 button1 и имеет "ID" BUTTON1. Я попытался просто поймать их в моем WM_COMMAND, и он говорит, что мой BUTTON1 не идентифицирован.

+0

Я попытался поймать свою BUTTON1 в моем WM_COMMAND и переключить LOWORD из wParam. Он просто говорит, что BUTTON1 не идентифицирован. –

+0

@JesseMoreland, это в 'WinMain'. Ваша процедура не может его увидеть. – chris

+0

Мне нужно сделать процедуру для детского контроля? –

ответ

3

То, что вы ищете:

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

Но прежде, чем он будет распознавать BUTTON1 вам придется объявить его таким образом, что он может быть распознан обработчиком сообщений: например, сделать его глобальным вместо объявления его в WinMain:

HMENU  BUTTON1; 

int WINAPI WinMaietcetc.. 

Сообщите мне, если это работает!

+0

Это сработало. Он говорит, что BUTTON1 должен быть модифицируемым выражением. Обновление кода сейчас. –

+0

Вам нужно указать BUTTON1 значение, поэтому 'HMENU BUTTON1 = 5'. Лучше использовать определение ('#define BUTTON1 5') или' const int' вместо HMENU –

+0

Поскольку это переключатель, я думаю, он должен быть const или определен для того, чтобы он был разрешен компилятором –

Смежные вопросы