API消息机制中的WM_COMMAND

在WM_COMMAND消息中 , lParam参数没有高地位的值之分 . 如果这个消息是由一个窗口发送的 , 那么这个参数lParam就表示这个窗口的窗口句柄HWND,这个主要是为了区分消息是从哪个按钮(或其它窗口控件)发送来的。


//button.c
#include<windows.h>
 
//按钮个数
#define NUM        2
 
//按钮的文本
TCHAR *  btnName[NUM]={TEXT( "按钮1" ), TEXT( "按钮2" )};
 
LRESULT  CALLBACK WndProc( HWND UINT WPARAM LPARAM );
 
int  WINAPI WinMain( HINSTANCE  hInstance,
                    HINSTANCE  hPrevInstance,
                    PSTR  szCmdLine,
                    int  iCmdShow)
{
     static   TCHAR    szAppName[] = TEXT( "Btn" );
     HWND             hwnd;
     MSG             msg;
     WNDCLASS        wndclass;
     int              cxScreen, cyScreen;
     
     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  = ( HBRUSH )GetStockObject(WHITE_BRUSH);
     wndclass.lpszMenuName   = NULL;
     wndclass.lpszClassName  = szAppName;
     
     if (!RegisterClass(&wndclass))
     {
         MessageBox(NULL, TEXT( "This program requires Windows NT!" ),
             szAppName, MB_ICONERROR);
         return  0;
     }
     
     cxScreen = GetSystemMetrics(SM_CXSCREEN);
     cyScreen = GetSystemMetrics(SM_CYSCREEN);
     hwnd = CreateWindow(szAppName,
                         TEXT( "Btn Demo" ),
                         WS_OVERLAPPEDWINDOW,
                         cxScreen * 3 / 10,
                         cyScreen / 5,
                         cxScreen * 2 / 5,
                         cyScreen * 3 / 5,
                         NULL,
                         NULL,
                         hInstance,
                         NULL);
 
     ShowWindow(hwnd, iCmdShow);
     UpdateWindow(hwnd);
 
     while (GetMessage(&msg, NULL, 0, 0))
     {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
     
     return  msg.wParam;
}
 
LRESULT  CALLBACK WndProc( HWND  hwnd,  UINT  message,  WPARAM  wParam,  LPARAM  lParam)
{
     static  HWND         hwndBtn[NUM]; //按钮句柄
     HINSTANCE        hInstance;   //窗口实例
     int              cxChar, cyChar, i; //默认字体的宽度和高度 循环变量
     
     switch (message)
     {
     case  WM_CREATE:
         cxChar = LOWORD(GetDialogBaseUnits());
         cyChar = HIWORD(GetDialogBaseUnits());
         hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
         
         //创建两个按钮
         for (i=0; i<NUM; i++)
             hwndBtn[i] = CreateWindow(TEXT( "button" ), btnName[i],
                                     WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                                     10, i * 100 + 10, 20 * cxChar, 7 * cyChar / 4,
                                     hwnd, ( HMENU )9, hInstance, NULL);
           return  0;
 
     case  WM_COMMAND:
         //响应两个按钮的按下消息
         for (i=0; i<NUM; i++)
             //如果按钮句柄匹配  就显示相应信息
             if (( HWND )lParam == hwndBtn[i])
             {
                 MessageBox(NULL, btnName[i], TEXT( "提示" ), MB_OK);
                 break ;
             }
         return  0;
 
     case  WM_DESTROY:
         PostQuitMessage(0);
         return  0;
     }
 
     return  DefWindowProc(hwnd, message, wParam, lParam);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值