四、关于Button的其他那些
来源:互联网 发布:阿里巴巴一键传淘宝 编辑:程序博客网 时间:2024/06/11 21:34
一、SendMessage()函数
在Win32的消息处理机制中,分别有两种消息:一种是对于事件(如鼠标点击、移动等)发生产生的消息,被系统放入消息队列中,提交给相应程序的相应消息处理函数处理;另一种则是由程序本身发送给系统,来提交某个请求或获取信息。
例如,修改窗口标题SetWindowText()的API实际上也可以通过发送WM_SETTEXT消息来实现:
SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)"OK");
二、单选按钮
创建单选按钮,只需要在CreateWindowEx()的时候将普通按钮的BS_PUSHBUTTON风格换成BS_RADIOBUTTON或者BS_AUTORADIOBUTTON。
BS_RADIOBUTTON:
CreateWindowEx(0,BUTTON,Radio1,WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 4,4,150,32,hWnd,(HMENU)40001,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Radio2",WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, 4,40,150,32,hWnd,(HMENU)40002,g_hInstance,NULL);这样就创建了两个单选按钮,但初始状态均为未选中状态,所以可以向其中一个单选按钮发送BM_SETCHECK消息来更改其选择/未选择状态:SendMessage(GetDlgItem(hWnd,40001),BM_SETCHECK,BST_CHECKED,0);其中BST_CHECKED表示设置为选中状态,设置未选中时使用BST_UNCHECKED。为了保证两个单选按钮能够正常的进行切换,则需要在消息处理函数里作出相应处理,当单选按钮被点击时,与按钮性质一样会发出BN_CLICKED消息,而消息的wParam参数则记录了按钮ID。所以消息处理函数需要添加如下代码:
if(HIWORD(wParam)==BN_CLICKED){ if(LOWORD(wParam)==40001) { SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0); SendMessage(GetDlgItem(hWnd,IDC_BTN_RADIO2),BM_SETCHECK,BST_UNCHECKED,0); } else if(LOWORD(wParam)==40002) { SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0); SendMessage(GetDlgItem(hWnd,IDC_BTN_RADIO1),BM_SETCHECK,BST_UNCHECKED,0); }}BS_AUTORADIOBUTTON风格则是自动属性的单选按钮:
CreateWindowEx(0,"BUTTON","AutoRadio1",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP, 4,4,150,32,hWnd,(HMENU)40001,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","AutoRadio2",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, 4,40,150,32,hWnd,(HMENU)40002,g_hInstance,NULL);SendMessage(GetDlgItem(hWnd,IDC_BTN_AUTORADIO1),BM_SETCHECK,BST_CHECKED,0);
由于是自动性质的单选按钮,故不再在消息处理函数中需要添加切换选中状态代码,由系统自动维护。但是必须在创建时将第一个单选按钮的风格上加上WS_GROUP,表示以此单选按钮起ID连续的全部单选按钮均属于组。
三、复选按钮
不带自动属性的两状态复选按钮:
//创建:CreateWindowEx(0,"BUTTON","Check Box",WS_CHILD|WS_VISIBLE|BS_CHECKBOX,4,40,150,32,hWnd,(HMENU)40001,g_hInstance,NULL);//消息处理函数中:if(LOWORD(wParam)==IDC_BTN_CHECK){ if(HIWORD(wParam)==BN_CLICKED) { int res=SendMessage((HWND)lParam,BM_GETCHECK,0,0); if(res==BST_CHECKED) SendMessage((HWND)lParam,BM_SETCHECK,BST_UNCHECKED,0); else if(res==BST_UNCHECKED) SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0); }}带自动属性的两状态复选按钮:
CreateWindowEx(0,"BUTTON","Autocheck Box",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, 4,40,150,32,hWnd,(HMENU)40002,g_hInstance,NULL);不带自动属性的三状态复选按钮://创建:CreateWindowEx(0,"BUTTON","3 State",WS_CHILD|WS_VISIBLE|BS_3STATE, 4,40,150,32,hWnd,(HMENU)40003,g_hInstance,NULL);//消息处理函数中:if(LOWORD(wParam)==IDC_BTN_3STATE){ if(HIWORD(wParam)==BN_CLICKED) { int res=SendMessage((HWND)lParam,BM_GETCHECK,0,0); if(res==BST_CHECKED) SendMessage((HWND)lParam,BM_SETCHECK,BST_INDETERMINATE,0); else if(res==BST_INDETERMINATE) SendMessage((HWND)lParam,BM_SETCHECK,BST_UNCHECKED,0); else if(res==BST_UNCHECKED) SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0); }}带自动属性的三状态复选按钮:
CreateWindowEx(0,"BUTTON","Auto 3 State",WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, 4,40,150,32,hWnd,(HMENU)40004,g_hInstance,NULL);
四、其他特殊按钮
分组框
CreateWindowEx(0,"BUTTON","Group Box",WS_CHILD|WS_VISIBLE|BS_GROUPBOX, 4,40,150,96,hWnd,(HMENU)40000,g_hInstance,NULL);PushLikeCreateWindowEx(0,"BUTTON","PushLike",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, 4,40,150,32,hWnd,(HMENU)40000,g_hInstance,NULL);
五、代码实例
创建简单Win32工程(Simple Win32):
#include"stdafx.h"#include<stdio.h>#define IDC_BTN_PUSH4001#define IDC_BTN_DEFPUSH4002#define IDC_BTN_GROUP4003#define IDC_BTN_CHECK4004#define IDC_BTN_AUTOCHECK4005#define IDC_BTN_3STATE4006#define IDC_BTN_AUTO3STATE4007#define IDC_BTN_RADIO14008#define IDC_BTN_RADIO24009#define IDC_BTN_AUTORADIO14010#define IDC_BTN_AUTORADIO24011#define IDC_BTN_PUSHLIKE4012LPCSTR g_pszAppName="WinButton";LPCSTR g_pszMainWndClass="MAIN";HINSTANCE g_hInstance=NULL;void OnCreate(HWND hWnd,LPARAM lParam){int x=4,y=4;CreateWindowEx(0,"BUTTON","Push",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, x,y,150,32,hWnd,(HMENU)IDC_BTN_PUSH,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Default Push",WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_DEFPUSH,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Group Box",WS_CHILD|WS_VISIBLE|BS_GROUPBOX, x,y+=36,150,96,hWnd,(HMENU)IDC_BTN_GROUP,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Check Box",WS_CHILD|WS_VISIBLE|BS_CHECKBOX, x,y+=100,150,32,hWnd,(HMENU)IDC_BTN_CHECK,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Autocheck Box",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_AUTOCHECK,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","3 State",WS_CHILD|WS_VISIBLE|BS_3STATE, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_3STATE,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Auto 3 State",WS_CHILD|WS_VISIBLE|BS_AUTO3STATE, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_AUTO3STATE,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Radio1",WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON|WS_GROUP, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_RADIO1,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","Radio2",WS_CHILD|WS_VISIBLE|BS_RADIOBUTTON, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_RADIO2,g_hInstance,NULL);SendMessage(GetDlgItem(hWnd,IDC_BTN_RADIO1),BM_SETCHECK,BST_CHECKED,0);CreateWindowEx(0,"BUTTON","AutoRadio1",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_AUTORADIO1,g_hInstance,NULL);CreateWindowEx(0,"BUTTON","AutoRadio2",WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_AUTORADIO2,g_hInstance,NULL);SendMessage(GetDlgItem(hWnd,IDC_BTN_AUTORADIO1),BM_SETCHECK,BST_CHECKED,0);CreateWindowEx(0,"BUTTON","PushLike",WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE, x,y+=36,150,32,hWnd,(HMENU)IDC_BTN_PUSHLIKE,g_hInstance,NULL);}void OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam){if(LOWORD(wParam)==IDC_BTN_DEFPUSH||LOWORD(wParam)==IDC_BTN_PUSH){if(HIWORD(wParam)==BN_CLICKED){CHAR szText[256]={0};GetWindowText((HWND)lParam,szText,sizeof(szText)/sizeof(szText[0]));MessageBox(hWnd,szText,"Push",MB_OK);}}if(LOWORD(wParam)==IDC_BTN_CHECK){if(HIWORD(wParam)==BN_CLICKED){int res=SendMessage((HWND)lParam,BM_GETCHECK,0,0);if(res==BST_CHECKED)SendMessage((HWND)lParam,BM_SETCHECK,BST_UNCHECKED,0);else if(res==BST_UNCHECKED)SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0);}}if(LOWORD(wParam)==IDC_BTN_3STATE){if(HIWORD(wParam)==BN_CLICKED){int res=SendMessage((HWND)lParam,BM_GETCHECK,0,0);if(res==BST_CHECKED)SendMessage((HWND)lParam,BM_SETCHECK,BST_INDETERMINATE,0);else if(res==BST_INDETERMINATE)SendMessage((HWND)lParam,BM_SETCHECK,BST_UNCHECKED,0);else if(res==BST_UNCHECKED)SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0);}}if(LOWORD(wParam)==IDC_BTN_RADIO1){if(HIWORD(wParam)==BN_CLICKED){SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0);SendMessage(GetDlgItem(hWnd,IDC_BTN_RADIO2),BM_SETCHECK,BST_UNCHECKED,0);}}if(LOWORD(wParam)==IDC_BTN_RADIO2){if(HIWORD(wParam)==BN_CLICKED){SendMessage((HWND)lParam,BM_SETCHECK,BST_CHECKED,0);SendMessage(GetDlgItem(hWnd,IDC_BTN_RADIO1),BM_SETCHECK,BST_UNCHECKED,0);}}}LRESULT CALLBACK MainWndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_COMMAND:OnCommand(hWnd,wParam,lParam);break;case WM_CREATE:OnCreate(hWnd,lParam);break;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hWnd,uMsg,wParam,lParam);}ATOM InitApplication(HINSTANCE hInstance){WNDCLASSEX wcex={0};wcex.cbSize=sizeof(wcex);wcex.style=CS_HREDRAW|CS_VREDRAW;wcex.lpfnWndProc=MainWndProc;wcex.cbClsExtra=0;wcex.cbWndExtra=0;wcex.hInstance=hInstance;wcex.hIcon=LoadIcon(NULL,IDI_APPLICATION);wcex.hIconSm=LoadIcon(NULL,IDI_WARNING);wcex.hCursor=LoadCursor(NULL,IDC_ARROW);wcex.hbrBackground=GetSysColorBrush(COLOR_3DFACE);wcex.lpszMenuName=NULL;wcex.lpszClassName=g_pszMainWndClass;return RegisterClassEx(&wcex);}BOOL InitInstance(HINSTANCE hInstance,int nCmdShow){g_hInstance=hInstance;HWND hWnd=CreateWindowEx(WS_EX_CLIENTEDGE,g_pszMainWndClass,g_pszAppName,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,170,15*36,NULL,NULL, hInstance,NULL);if(!hWnd) return 0;ShowWindow(hWnd,nCmdShow);UpdateWindow(hWnd);return 1;}int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){if(!hPrevInstance)if(!InitApplication(hInstance))return 0;if(!InitInstance(hInstance,nCmdShow)) return 0;MSG msg={0};while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}
0 0
- 四、关于Button的其他那些
- 关于四种基本布局的那些事(笔记)
- android中关于美化Button按钮的一些简单操作(其他控件也类似)
- Android问题关于Button控件在布局中正常顺序出现的遮盖其他控件
- 关于Button的监听
- 关于button的用法
- 关于选择的那些
- 关于脚手架的那些
- 四、浏览器的那些事
- 关于DEFAULT BUTTON的疑问
- 关于button的小问题
- 关于按钮button的使用
- 关于button的默认类型
- 关于button按钮的操作
- 关于盒须图的那些事——四分位数,插值法
- 那些年,关于 Java 的那些事儿
- Button的四种Click响应方法
- 四种android的Button监听
- 最小公倍数,最大公约数
- PHP 取整函数 ceil 与 floor
- 安卓自定义view学习_2
- BOM——浏览器对象模型(Browser Object Model)
- 数组指针和指针数组的区别
- 四、关于Button的其他那些
- 获取系统当前时间C/C++
- Makefile的.a 文件的依赖关系
- Mybatis与Hibernate的比较
- linux挂载 安装 fstab 详解
- openwrt编译curl及错误解决
- 在cocos2dx里访问/互调android里的activity方法/变量
- gdb中调试stl
- Sprite添加阴影摇摆动画(Unity3D开发之九)