<Win32_14>__win32控件(2)__教你自学掌握所有控件的玩法

本文由BlueCoder编写   转载请说明出处:

http://blog.csdn.net/crocodile__/article/details/10273185

我的邮箱:bluecoder@yeah.net    欢迎大家和我交流编程心得

我的微博:BlueCoder_黎小华    欢迎光临^_^




学习win32 API 编程,我们应该善于利用微软给我们提供的一些辅助工具,例如大家都知道的MSDN、SPY++等等。

今天在讲述之前呢,先给大家介绍一个很有用的工具——Control Spy——它的用途和SPY++有点儿类似,它能查看对应控件所属的风格、能响应的消息以及响应的通知码。

有了它,加上msdn,你基本上就能很快掌握这些控件的用法了——都是基于消息驱动来完成响应的工作

(点击下载Control Spy小工具)

 

OK,先来讲一下这个小工具的用法(包含个人的学习心得):

(1)在左边子窗口中,选择你想学习的控件,这里我就选择Button

(2)在中间子窗口中你就能预览这个控件的样式

(3)我们知道,这些控件其实本质上都是窗口,因此他们都可以用CreateWindow或者CreateWindowEx函数来创建

下面,我详细讲一下创建的过程(为了帮助说明,我将以CreateWindow函数为例,并贴出该函数的原型声明)

  1. HWND CreateWindow(  
  2.   LPCTSTR lpClassName,  // registered class name  
  3.   LPCTSTR lpWindowName, // window name  
  4.   DWORD dwStyle,        // window style  
  5.   int x,                // horizontal position of window  
  6.   int y,                // vertical position of window  
  7.   int nWidth,           // window width  
  8.   int nHeight,          // window height  
  9.   HWND hWndParent,      // handle to parent or owner window  
  10.   HMENU hMenu,          // menu handle or child identifier  
  11.   HINSTANCE hInstance,  // handle to application instance  
  12.   LPVOID lpParam        // window-creation data  
  13. );  

我只列出需要注意的几个特别参数的设法

1>窗口类的名称lpClassName——微软帮预设了对应控件所关联的窗口类名称——因此,你只需要将它设为TEXT("控件的英文名称")

    例如,我这里选择按钮Button,你就可以写为TEXT("button");如果选择组合框ComboBox,就写为TEXT("combobox")

    注:名称不区分大小写,因此你在创建主窗口的时候,就不能将主窗口的窗口类名称设为这些控件的名称,免得覆盖了微软预设的控件窗口类名称

 

2>窗口的风格dwStyle——这时刚刚提到的小工具就起作用了,你可以在它的子窗口Style中,查找对应的类型:

不过类型WS_CHILD是必须添加的,如果你想让改控件一创建就可见,那么就应该还加上WS_VISIBLE

 

3>父窗口hWndParent,由于这些控件都是子窗口,所以父窗口一定不能为空,这个之情况而定

4>菜单句柄hMenu,这个需要设定为控件的ID号(ID一般就是用宏定义的一些常量,例如:IDB_BUTTON  按钮ID号)

为了类型的匹配,你需要强制转换一下类型:(HMENU)IDB_BUTTON

5>实例句柄hInstance,如果你是在主窗口的WM_CREATE消息中创建控件,那么可以这样设定:((LPCREATESTRUCT)lParam)->hInstance

(4)了解控件能响应的消息:

 

(5)你还可以操作,这个控件来看看它所响应的消息以及对应的通知码

消息:

 

通知码:

 

好了,这个小工具的大致使用方法就介绍到这里,如果你还是不怎么清楚它的用法,可以参见资源下载中提供的英文版帮助文档 

 

光说不练是假把式,还是用程序代码来证明一切

昨天讲了按钮的创建以及使用方法,今天儿就讲一下组合框的使用方法。

 

还是先来看看实现的效果:

 

 

可以看见,我还是使用WinXP以来微软提供的新控件,毕竟要美观些

 

***************************************************进入代码阶段******************************************************

先在头文件做一些相应的声明

  1. //WINDOW_XP_STYLE.H  
  2.   
  3. #include<windows.h>  
  4.   
  5. //组合框的ID  
  6. #define IDCB_COMBOBOX_1 100  
  7. #define IDCB_COMBOBOX_2 101  
  8. #define IDCB_COMBOBOX_3 103  
  9. //组合框的个数  
  10. #define NUMS            3  
  11.   
  12. //一些字符串数组,用于显示  
  13. TCHAR* tchSmall[]   = {TEXT("小美女"), TEXT("小帅哥"), TEXT("小可爱")};  
  14. TCHAR* tchBig[]     = {TEXT("大美女"), TEXT("大帅哥"), TEXT("小顽皮")};  
  15. TCHAR* tchNone[]    = {TEXT("漂亮"), TEXT("帅气"), TEXT("可爱")};  
  16.   
  17. //使用WinXP以来提供的心控件  
  18. #pragma comment(linker,"\"/manifestdependency:type='win32' "\  
  19.                         "name='Microsoft.Windows.Common-Controls' "\  
  20.                         "version='6.0.0.0' processorArchitecture='*' "\  
  21.                         "publicKeyToken='6595b64144ccf1df' language='*'\"")  


 

因为大部分技术都是在前面博文中讲述过的,这里我就仅仅将完整代码贴出来,内含一定的注释,只要各位有一定的基础,应该是能看懂的^_^

  1. //ComboBox.c  
  2. #include"Window_Xp_Style.h"  
  3.   
  4. LRESULT CALLBACK WndProc(HWNDUINTWPARAMLPARAM);  
  5.   
  6. int WINAPI WinMain(HINSTANCE hInstance,  
  7.                    HINSTANCE hPrevInstance,  
  8.                    PSTR szCmdLine,  
  9.                    int iCmdShow)  
  10. {  
  11.     static  TCHAR   szAppName[] = TEXT("ComboBox View");//注意这里不能写为ComboBox  因为这样会覆盖微软预设的控件窗口类名称  
  12.     HWND            hwnd;  
  13.     MSG             msg;  
  14.     WNDCLASS        wndclass;  
  15.     int             cxScreen, cyScreen;  
  16.       
  17.     wndclass.style          = CS_HREDRAW | CS_VREDRAW;  
  18.     wndclass.lpfnWndProc    = WndProc;  
  19.     wndclass.cbClsExtra     = 0;  
  20.     wndclass.cbWndExtra     = 0;  
  21.     wndclass.hInstance      = hInstance;  
  22.     wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);  
  23.     wndclass.hCursor        = LoadCursor(NULL, IDC_ARROW);  
  24.     wndclass.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);  
  25.     wndclass.lpszMenuName   = NULL;  
  26.     wndclass.lpszClassName  = szAppName;  
  27.       
  28.     if(!RegisterClass(&wndclass))  
  29.     {  
  30.         MessageBox(NULL, TEXT("This program requires Windows NT!"),  
  31.             szAppName, MB_ICONERROR);  
  32.         return 0;  
  33.     }  
  34.       
  35.     cxScreen = GetSystemMetrics(SM_CXSCREEN);  
  36.     cyScreen = GetSystemMetrics(SM_CYSCREEN);  
  37.     hwnd = CreateWindow(szAppName,  
  38.                         TEXT("ComboBox Demo"),  
  39.                         WS_OVERLAPPEDWINDOW,  
  40.                         cxScreen  * 7 / 20,  
  41.                         cyScreen / 4,  
  42.                         cxScreen * 3 / 10,  
  43.                         cyScreen / 2,  
  44.                         NULL,  
  45.                         NULL,  
  46.                         hInstance,  
  47.                         NULL);  
  48.   
  49.     ShowWindow(hwnd, iCmdShow);  
  50.     UpdateWindow(hwnd);  
  51.   
  52.     while(GetMessage(&msg, NULL, 0, 0))  
  53.     {  
  54.         TranslateMessage(&msg);  
  55.         DispatchMessage(&msg);  
  56.     }  
  57.       
  58.     return msg.wParam;  
  59. }  
  60.   
  61. LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  62. {  
  63.     static HWND hComboBox[NUMS];//组合框窗口句柄数组(有3个)  
  64.     int         iCombID[] = {IDCB_COMBOBOX_1, IDCB_COMBOBOX_2, IDCB_COMBOBOX_3};//组合框ID数组  
  65.     HFONT       hFont;//字体句柄  
  66.     LOGFONT     lf;  
  67.     int         i, xPos, yDiv;//循环变量、组合框x坐标、y坐标上的间距  
  68.   
  69.     switch(message)  
  70.     {  
  71.     case WM_CREATE:  
  72.         //创建组合框  
  73.         for(i=0; i<NUMS; i++)  
  74.         {  
  75.             hComboBox[i] = CreateWindow(TEXT("combobox"), TEXT(""),  
  76.                             WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_HASSTRINGS | CBS_SIMPLE,  
  77.                             0, 0, 0, 0, hwnd, (HMENU)iCombID[i],  
  78.                             ((LPCREATESTRUCT)lParam)->hInstance, NULL);  
  79.         }  
  80.   
  81.         //添加子项  
  82.         for(i=0; i<NUMS; i++)  
  83.             SendMessage(hComboBox[0], CB_ADDSTRING, 0, (LPARAM)tchSmall[i]);  
  84.   
  85.         for(i=0; i<NUMS; i++)  
  86.             SendMessage(hComboBox[1], CB_ADDSTRING, 0, (LPARAM)tchBig[i]);  
  87.   
  88.         for(i=0; i<NUMS; i++)  
  89.             SendMessage(hComboBox[2], CB_ADDSTRING, 0, (LPARAM)tchNone[i]);  
  90.   
  91.         //设置初始状态选中的子项  
  92.         for(i=0; i<NUMS; i++)  
  93.             SendMessage(hComboBox[i], CB_SETCURSEL, (WPARAM)0, 0);  
  94.   
  95.         //创建字体  
  96.         ZeroMemory(&lf, sizeof(LOGFONT));  
  97.         lf.lfHeight = -10;  
  98.         hFont = CreateFontIndirect(&lf);  
  99.   
  100.         //修改当前的字体  
  101.         for(i=0; i<NUMS; i++)  
  102.             SendMessage(hComboBox[i], WM_SETFONT, (WPARAM)hFont, 0);  
  103.   
  104.         return 0;  
  105.   
  106.     case WM_SIZE:  
  107.         //随着窗口大小的改变而移动组合框  
  108.         xPos = (LOWORD(lParam) - 100) / 2;  
  109.         yDiv = HIWORD(lParam) / (NUMS + 2);  
  110.   
  111.         for(i=0; i<NUMS; i++)  
  112.             MoveWindow(hComboBox[i], xPos, yDiv * (i + 1), 100, 20, TRUE);  
  113.         return 0;  
  114.   
  115.     //响应组合框子项选择的消息  
  116.     case WM_COMMAND:  
  117.         //判断控件的ID  
  118.         switch(LOWORD(wParam))  
  119.         {  
  120.         case IDCB_COMBOBOX_1:  
  121.             //判断当前控件对应的通知码  
  122.             if(HIWORD(wParam) == CBN_SELENDOK)//选择了组合框的子项  
  123.             {  
  124.                 LRESULT index;  
  125.                 index = SendMessage(hComboBox[0], CB_GETCURSEL, 0, 0);  
  126.   
  127.                 if(CB_ERR != index)  
  128.                     MessageBox(hwnd, tchSmall[(int)index], TEXT("提示"), MB_OK);  
  129.             }  
  130.             break;  
  131.   
  132.         case IDCB_COMBOBOX_2:  
  133.             //判断当前控件对应的通知码  
  134.             if(HIWORD(wParam) == CBN_SELENDOK)  
  135.             {  
  136.                 LRESULT index;  
  137.                 index = SendMessage(hComboBox[1], CB_GETCURSEL, 0, 0);  
  138.   
  139.                 if(CB_ERR != index)  
  140.                     MessageBox(hwnd, tchBig[(int)index], TEXT("提示"), MB_OK);  
  141.             }  
  142.             break;  
  143.   
  144.         case IDCB_COMBOBOX_3:  
  145.             //判断当前控件对应的通知码  
  146.             if(HIWORD(wParam) == CBN_SELENDOK)  
  147.             {  
  148.                 LRESULT index;  
  149.                 index = SendMessage(hComboBox[2], CB_GETCURSEL, 0, 0);  
  150.   
  151.                 if(CB_ERR != index)  
  152.                     MessageBox(hwnd, tchNone[(int)index], TEXT("提示"), MB_OK);  
  153.             }  
  154.             break;  
  155.         }  
  156.         return 0;  
  157.   
  158.     case WM_DESTROY:  
  159.         PostQuitMessage(0);  
  160.         return 0;  
  161.     }  
  162.   
  163.     return DefWindowProc(hwnd, message, wParam, lParam);  
  164. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值