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

<Win32_14>__win32控件(2)__教你自学掌握所有控件的玩法的更多相关文章

  1. 《ASP.NET1200例》解决母版页报错“内容控件必须是内容页中的顶级控件,或是引用母版页的嵌套母版页。”

    VS2005下,添加了母版页这个控件,我们可以讲N个页面中共同的部分放在母版页来实现,并让WEB窗体集成自我们的母版页,就可以让我们的站点具有统一的风格了.在VS2005SP1之前的版本中,我们只能创 ...

  2. android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果

    主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import j ...

  3. Winform----自定义控件之半透明遮罩(蒙版遮盖指定控件)

    先贴运行效果图,源码点击这里下载 1.新建自定义控件 2.实现功能   namespace UserControlLib   {   [ToolboxBitmap(typeof(ZhLoading)) ...

  4. 自学Zabbix3.10.2-事件通知Notifications upon events-Actions报警配置

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.10.2-事件通知Notifications upon events-Acti ...

  5. Iocomp控件教程之Analog Display—模拟显示控件(优于EDIT控件)

    Analog Display是简洁的显示控件.用于显示指定准确度和单位的模拟值(实数),能够将准确度设置为0.使显示结果为整数. 第一步:建立MFC对话框 第二步:插入AnalogDisplay控件 ...

  6. Iocomp控件教程之LinearGauge--线性刻度尺控件

    线性刻度尺-线性刻度尺控件(LinearGauge)是一个具有线性表达式刻度的图像控件.支持多达5种颜色断面和4种指示器样式,相同功能,查看线性对数刻度尺(Linear Log Gauge)控件内容 ...

  7. 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”

    接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...

  8. 问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件

    大家不要笑我了,我不喜欢用那个人家写的串口类. 所以导出了MSCOMM32.OCX的类,然后在此基础上写了一个串口打印机的小工具类. -------------声明--------------- 本文 ...

  9. PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)

    如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...

随机推荐

  1. TCP/IP笔记 三.运输层(1)——UDP,TCP

    1. 运输层 1.1 两种协议:TCP和UDP. (1)TCP:提供了一种可靠的数据传输服务,TCP是面向连接的,只有链接建立起来后才能通信. (2)UDP:是把数据直接发出去,而不管对方是不是在收信 ...

  2. 四大流行的jdbc连接池之C3P0篇

    C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...

  3. 使用 HTML5 webSocket API实现即时通讯的功能

    project下载地址:http://download.csdn.net/detail/wangshuxuncom/6430191 说明: 本project用于展示怎样使用 HTML5 webSock ...

  4. Swift - 使用UI Dynamics给UIKit组件添加移动吸附行为

    UI Dynamics是UIKit的一个新组成部分,它向iOS中的视图提供了与物理学有关的功能和动画.可以让你向视图中引入力和物理属性,可以让你的视图弹跳,舞动,受重力影响等等. 下面通过样例,演示使 ...

  5. 读取中兴3G告警log告警文件到集合

    1.文件格式 ALARM_ID=102305_404205 EVENT_TIME=-- :: NOTIFICATION_TYPE= MANAGED_OBJECT_INSTANCE=NodeId=,Bs ...

  6. PHP环境部署问题集合

    Forbidden You don't have permission to access /phpmyadmin/ on this server. 安装wamp 后访问 http://localho ...

  7. 使用hadoop ecipse插件须要注意的问题

    1.关于run on hadoop的问题: 在未用hadoop eclipse插件前,我以为通过hadoop eclipse 插件不但能够管理hdfs,还能够自己主动打包程序.并帮我自己主动设置Con ...

  8. 使用datapump 导出导入同义词(export and import synonym using datapump)

    对于同义词的备份我们有多种方式来实现,如直接通过脚本生成同义词的创建脚本,或者使用dbms_metadata.get_ddl来提取同义词的定义脚本.然而在使用传统的exp或是datapump expd ...

  9. 【Java数据结构】Java数据结构之链表反转

    我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...

  10. boost.asio系列——socket编程

    asio的主要用途还是用于socket编程,本文就以一个tcp的daytimer服务为例简单的演示一下如何实现同步和异步的tcp socket编程. 客户端 客户端的代码如下: #include &l ...