<Win32_14>__win32控件(2)__教你自学掌握所有控件的玩法
学习win32 API 编程,我们应该善于利用微软给我们提供的一些辅助工具,例如大家都知道的MSDN、SPY++等等。
今天在讲述之前呢,先给大家介绍一个很有用的工具——Control Spy——它的用途和SPY++有点儿类似,它能查看对应控件所属的风格、能响应的消息以及响应的通知码。
有了它,加上msdn,你基本上就能很快掌握这些控件的用法了——都是基于消息驱动来完成响应的工作
OK,先来讲一下这个小工具的用法(包含个人的学习心得):
(1)在左边子窗口中,选择你想学习的控件,这里我就选择Button
(2)在中间子窗口中你就能预览这个控件的样式
(3)我们知道,这些控件其实本质上都是窗口,因此他们都可以用CreateWindow或者CreateWindowEx函数来创建
下面,我详细讲一下创建的过程(为了帮助说明,我将以CreateWindow函数为例,并贴出该函数的原型声明)
HWND CreateWindow(
LPCTSTR lpClassName, // registered class name
LPCTSTR lpWindowName, // window name
DWORD dwStyle, // window style
int x, // horizontal position of window
int y, // vertical position of window
int nWidth, // window width
int nHeight, // window height
HWND hWndParent, // handle to parent or owner window
HMENU hMenu, // menu handle or child identifier
HINSTANCE hInstance, // handle to application instance
LPVOID lpParam // window-creation data
);我只列出需要注意的几个特别参数的设法
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以来微软提供的新控件,毕竟要美观些
***************************************************进入代码阶段******************************************************
先在头文件做一些相应的声明
//WINDOW_XP_STYLE.H #include<windows.h> //组合框的ID
#define IDCB_COMBOBOX_1 100
#define IDCB_COMBOBOX_2 101
#define IDCB_COMBOBOX_3 103
//组合框的个数
#define NUMS 3 //一些字符串数组,用于显示
TCHAR* tchSmall[] = {TEXT("小美女"), TEXT("小帅哥"), TEXT("小可爱")};
TCHAR* tchBig[] = {TEXT("大美女"), TEXT("大帅哥"), TEXT("小顽皮")};
TCHAR* tchNone[] = {TEXT("漂亮"), TEXT("帅气"), TEXT("可爱")}; //使用WinXP以来提供的心控件
#pragma comment(linker,"\"/manifestdependency:type='win32' "\
"name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' processorArchitecture='*' "\
"publicKeyToken='6595b64144ccf1df' language='*'\"")
因为大部分技术都是在前面博文中讲述过的,这里我就仅仅将完整代码贴出来,内含一定的注释,只要各位有一定的基础,应该是能看懂的^_^
//ComboBox.c
#include<windows.h>
#include"Window_Xp_Style.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow)
{
static TCHAR szAppName[] = TEXT("ComboBox View");//注意这里不能写为ComboBox 因为这样会覆盖微软预设的控件窗口类名称
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("ComboBox Demo"),
WS_OVERLAPPEDWINDOW,
cxScreen * 7 / 20,
cyScreen / 4,
cxScreen * 3 / 10,
cyScreen / 2,
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 hComboBox[NUMS];//组合框窗口句柄数组(有3个)
int iCombID[] = {IDCB_COMBOBOX_1, IDCB_COMBOBOX_2, IDCB_COMBOBOX_3};//组合框ID数组
HFONT hFont;//字体句柄
LOGFONT lf;
int i, xPos, yDiv;//循环变量、组合框x坐标、y坐标上的间距 switch(message)
{
case WM_CREATE:
//创建组合框
for(i=0; i<NUMS; i++)
{
hComboBox[i] = CreateWindow(TEXT("combobox"), TEXT(""),
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN | CBS_HASSTRINGS | CBS_SIMPLE,
0, 0, 0, 0, hwnd, (HMENU)iCombID[i],
((LPCREATESTRUCT)lParam)->hInstance, NULL);
} //添加子项
for(i=0; i<NUMS; i++)
SendMessage(hComboBox[0], CB_ADDSTRING, 0, (LPARAM)tchSmall[i]); for(i=0; i<NUMS; i++)
SendMessage(hComboBox[1], CB_ADDSTRING, 0, (LPARAM)tchBig[i]); for(i=0; i<NUMS; i++)
SendMessage(hComboBox[2], CB_ADDSTRING, 0, (LPARAM)tchNone[i]); //设置初始状态选中的子项
for(i=0; i<NUMS; i++)
SendMessage(hComboBox[i], CB_SETCURSEL, (WPARAM)0, 0); //创建字体
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight = -10;
hFont = CreateFontIndirect(&lf); //修改当前的字体
for(i=0; i<NUMS; i++)
SendMessage(hComboBox[i], WM_SETFONT, (WPARAM)hFont, 0); return 0; case WM_SIZE:
//随着窗口大小的改变而移动组合框
xPos = (LOWORD(lParam) - 100) / 2;
yDiv = HIWORD(lParam) / (NUMS + 2); for(i=0; i<NUMS; i++)
MoveWindow(hComboBox[i], xPos, yDiv * (i + 1), 100, 20, TRUE);
return 0; //响应组合框子项选择的消息
case WM_COMMAND:
//判断控件的ID
switch(LOWORD(wParam))
{
case IDCB_COMBOBOX_1:
//判断当前控件对应的通知码
if(HIWORD(wParam) == CBN_SELENDOK)//选择了组合框的子项
{
LRESULT index;
index = SendMessage(hComboBox[0], CB_GETCURSEL, 0, 0); if(CB_ERR != index)
MessageBox(hwnd, tchSmall[(int)index], TEXT("提示"), MB_OK);
}
break; case IDCB_COMBOBOX_2:
//判断当前控件对应的通知码
if(HIWORD(wParam) == CBN_SELENDOK)
{
LRESULT index;
index = SendMessage(hComboBox[1], CB_GETCURSEL, 0, 0); if(CB_ERR != index)
MessageBox(hwnd, tchBig[(int)index], TEXT("提示"), MB_OK);
}
break; case IDCB_COMBOBOX_3:
//判断当前控件对应的通知码
if(HIWORD(wParam) == CBN_SELENDOK)
{
LRESULT index;
index = SendMessage(hComboBox[2], CB_GETCURSEL, 0, 0); if(CB_ERR != index)
MessageBox(hwnd, tchNone[(int)index], TEXT("提示"), MB_OK);
}
break;
}
return 0; case WM_DESTROY:
PostQuitMessage(0);
return 0;
} return DefWindowProc(hwnd, message, wParam, lParam);
}
<Win32_14>__win32控件(2)__教你自学掌握所有控件的玩法的更多相关文章
- 《ASP.NET1200例》解决母版页报错“内容控件必须是内容页中的顶级控件,或是引用母版页的嵌套母版页。”
VS2005下,添加了母版页这个控件,我们可以讲N个页面中共同的部分放在母版页来实现,并让WEB窗体集成自我们的母版页,就可以让我们的站点具有统一的风格了.在VS2005SP1之前的版本中,我们只能创 ...
- android 给LinearLayout中添加一定数量的控件,并让着一定数量的控件从右到左移动,每隔若干秒停顿一下,最后一个view链接第一个view,然后继续移动循环往复,形成一个死循环简单动画效果
主类:IndexAnimationLinearLayout.java package com.yw.sortlistview; import java.util.ArrayList; import j ...
- Winform----自定义控件之半透明遮罩(蒙版遮盖指定控件)
先贴运行效果图,源码点击这里下载 1.新建自定义控件 2.实现功能 namespace UserControlLib { [ToolboxBitmap(typeof(ZhLoading)) ...
- 自学Zabbix3.10.2-事件通知Notifications upon events-Actions报警配置
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.10.2-事件通知Notifications upon events-Acti ...
- Iocomp控件教程之Analog Display—模拟显示控件(优于EDIT控件)
Analog Display是简洁的显示控件.用于显示指定准确度和单位的模拟值(实数),能够将准确度设置为0.使显示结果为整数. 第一步:建立MFC对话框 第二步:插入AnalogDisplay控件 ...
- Iocomp控件教程之LinearGauge--线性刻度尺控件
线性刻度尺-线性刻度尺控件(LinearGauge)是一个具有线性表达式刻度的图像控件.支持多达5种颜色断面和4种指示器样式,相同功能,查看线性对数刻度尺(Linear Log Gauge)控件内容 ...
- 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”
接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...
- 问题解决——基于MSCOMM32.OCX控件的类在客户机不能创建控件
大家不要笑我了,我不喜欢用那个人家写的串口类. 所以导出了MSCOMM32.OCX的类,然后在此基础上写了一个串口打印机的小工具类. -------------声明--------------- 本文 ...
- PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...
随机推荐
- 第14周 项目三-OOP版电子词典
做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对比的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词.显示词性和中文释义. ...
- 辛星和您一起手写CSS气泡
上文中我公布了一篇手写导航条的博客,那么这一篇博客我将和大家一起手写气泡.那么什么是气泡呢?先给那些刚入门的童鞋一个截图,来更好的认识一下什么是气泡把: 这就是一个简单的气泡啦,那么它主要用来干什么呢 ...
- (1)ActivityThread分析
1. 入口. 曾经一直都说Activity的人口是onCreate方法.事实上android上一个应用的入口,应该是ActivityThread.和普通的java类一样,入口是一个main方法. pu ...
- JavaScript实现获取table中某一列的值
JavaScript实现获取table中某一列的值 1.实现源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...
- HDOJ 5088 Revenge of Nim II 位运算
位运算.. .. Revenge of Nim II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- 基于JSP+SERVLET的新闻发布系统(二)
接下来讲解的是通过AJAX验证用户名是否已经添加 用户名: <input type="text" name="userName" id="use ...
- 在MySql中实现MemberShip的权限管理
步骤: 1.在MySql种创建一个数据库,名称任意取,我们只是要得到一个空的数据库,我们假设这个数据库的名称为authentication. 2.在VS种创建一个Web应用程序,File——new—— ...
- MVCC浅析(转)
在并发读写数据库时,读操作可能会不一致的数据(脏读).为了避免这种情况,需要实现数据库的并发访问控制,最简单的方式就是加锁访问.由于,加锁会将读写操作串行化,所以不会出现不一致的状态.但是,读操作会被 ...
- 列举一些常见的Python HTTP服务器
要使 Python 写的程序能在 Web 上被访问,还需要搭建一个支持 Python 的 HTTP 服务器.下面列举一些常见的 Python HTTP 服务器,以及它们目前的大致发展情况,以便用户的对 ...
- python 读取图片的尺寸、分辨率
#需要安装PIL模块 #encoding=gbk#--------------------------------------------------------------------------- ...