API创建窗口 按键 按钮 CreateWindowEx
作者:互联网
一.控件概念
·控件:特殊的一类”子”窗口,系统已经定义好了窗口类型.
创建方式和创建窗口类似,调用createWindows,每个控件都由ID
·父窗口直接通过sendmessage向控件发送消息.
控件事件发生后,会向所在的父窗口发送通知消息
·注意:创建窗口时必须添加两个属性
WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口
WS_CHILDWINDOW也一样,为了节约几个字母,用WS_CHILD吧。
WS_VISIBLE:设置可见,要想别人称赞你老婆漂亮,先让别人见你老婆
·创建窗口函数讲解
HWND WINAPI CreateWindow( 类名, 显示内容, 风格, nt x, int y,
int nWidth, int nHeight, 父窗口, 控件ID,
HINSTANCE hInstance, LPVOID lpParam );
·主要控件:按钮,编辑框,静态框,列表框,组合框,树控件,分组框,等
二.按钮
2.1基本概念
窗口类名 BUTTON
按钮分类:
下压式按钮 BS_PUSHIBUTTON/BS_DEFPUSHIBUTTON
复选框 BS_CHECKBOX/BS_AUTOCHECKBOX /BS_3STATE/ BS_AUTO3STATE
单选框BS_RADIOBUTTON/BS_AUTORADIOBUTTON
分组框BS_GROUPBOX
2.2下压式按钮
创建按钮:
CreateWindow(L"Button", L"按钮一", WS_VISIBLE | WS_CHILD |
BS_PUSHBUTTON, .... hwnd, (HMENU)IDB_ONE, hg_app, NULL);
按钮消息:WM_COMMAND
LOWORD(wParam) --- 保存的是按钮ID
HIWORD(wparam)---通知码BN_CLICKED
lParam 子窗口句柄
改变按钮文本信息: 向控件发送 WM_SETTEXT
2.3 分组框
窗口名称BUTTON
窗口风格 BS_GROUPBOX
2.4单选框
窗口名称BUTTON
窗口风格BS_RADIOBUTTON / BS_AUTORADIOBUTTON/WS_GROUP
WS_GROUP的单选框,到下一个WS_GROUP单选框之前,为1组
获取和设置选择状态(通知消息是BN_CLICKED)
BM_SETCHECK
BM_GETCHECK
案例:if( HIWORD(wParam)==BN_CLICKED ) {
HWND h3State = GetDlgItem( hWnd, 1005 );
LRESULT nRet = SendMessage( h3State, BM_GETCHECK, 0, 0 );
if( nRet == BST_CHECKED )}
2.5复选框
窗口类名:BUTTON
窗口风格:
BS_CHECKBOX - 点击选择时,需要自己维护选择状态
BS_AUTOCHECKBOX - 点击选择时,系统自动维护选择状态
BS_3STATE --变灰的三种状态
BS_AUTO3STATE-自动处理的三种状态
获取和设置选择状态(通知消息是BN_CLICKED)
BST_INDETERMINATE-设置灰色
BST_CHECKED ---设置选择
BST_UNCHECKED --设置不选择
设置状态SendMessage(... BM_SETCHECK,具体状态,必须为0);
获取状态SendMessage(... BM_GETCHECK,0,0);
案例SendMessage( 句柄, BM_SETCHECK,BST_INDETERMINATE, 0 );
三. 编辑框
3.1基本概念
窗口类名 EDIT
分类:
文字编辑框:显示单行文字/显示多行文字
密码编辑框:ES_PASSWORD,显示密码
窗口风格
3.2通知消息
在WM_COMMAND case下 处理这个参数
if (HIWORD(wParam) == EN_CHANGE && LOWORD(wParam) == nEditID)
3.2.1 WM_GETTEXT ---获取编辑框文本
wPararm - buffer 的大小 lPararm – buffer的首地址
SendMessage( (WPARAM) wParam, // number of characters to copy
(LPARAM) lParam // text buffer);
3.2.2 WM_GETTEXTLENGTH-获取文本长度
SendMessage( (WPARAM) 0, (LPARAM) 0)
3.2.3 WM_SETTEXT设置内容
wParam – 没用,lParam – 准备设置内容的buffer的首地址
补充:
· SendMessage( hWndEdit, WM_CUT, 0, 0 );
· SendMessage( hWndEdit, WM_COPY, 0, 0 );
· SendMessage( hWndEdit, WM_CLEAR, 0, 0 )
四. 静态框:
窗口名称 “STATIC” 用来用来显示文字,加载图片(设置属性 SS_ICON/SS_BITMAP)
窗口消息: sendMessage 发送到控件即可 例如 STM_SETICON
通知消息: 需要创建时增加SS_NOTIFY风格
通知消息通过WM_COMMAND 消息传递
LOWORD(wparam)---控件ID
HIWORD(wparam)---notify-code(STN_CLICKED)
Lparam---控件窗口句柄
CreateWindowEx的拓展风格
WS_EX_NODRAG:防止窗口被移动
WS_EX_ACCEPTFILES: 接受一个拖拽文件。
WS_EX_APPWINDOW:当窗口可见时,将一个顶层窗口放置到任务条上。
WS_EX_CLIENTEDGE:指定窗口有一个带阴影的边界。
WS_EX_CONTEXTHELP:在窗口的标题条包含一个问号标志。当用户点击了问号时,鼠标光标变为一个问号的指针、如果点击了一个子窗口,则子窗口接收到、
WS_EX_DLGMODALFRAME:创建一个带双边的窗口;
五.组合框
5.1组合框分类
简单组合框 CBS_SIMPLE (可以输入可以选择)
下拉式组合框 CBS_DROPDOWN (可以输入,可以选择)
下拉式列表组合框 CBS_DROPDOWNLIST (只可以选择不可以输入)
5.2组合框发送消息
CB_ADDSTRING ----添加项(WPARAM---没用 LPARAM----字符串指针)
CB_INSERTSTRING 添加项
CB_DELETESTRING 删除制定项
CB_RESETCONTENT 清除所有项
CB_SETCURSEL 设置当前项
CB_GETCURSLE 获取当前项
CB_FINDSTRING 查找某项字符串
CB_GETLBTEXTLEN 获取选择的字符长度
CB_GETLBTEXT 获取选项的一个字符内容
CB_DIR 在组合框中显示制定路径下的文件和目录名字
CB_SETITENDATA 将数据保存到指定选项中
CB_GETITEMDATA 从指定选项中获取数据
5.3向父窗口消息
当选择项发送改变时 会给父窗口发送 CBN_SELCHANGE消息
当输入内容发送改 变时 会给父窗口发送 CBN_EDITCHANGE
六.杂烩知识点
UNREFERENCED_PARAMETER
最高级别的警告 Level 4(/W4)进行编译时。例如在程序中定义一个变量未使用就会提出警告.你可以加上UNREFERENCED_PARAMETER为了骗过编译器。对某个变量不需要提供警告信息
LoadString把String Table里面的字符串读出来到CString对象里
LoadAccelerators加载快捷键,返回快捷键句柄
TranslateAccelerator把消息跟快捷键表里定义的按键进行比较,如果发现有快捷键,就会把这个按键消息转换为WM_COMMAND或者WM_SYSCOMMAND消息给窗口的消息处理函数发送过去,而不会发送wm_keydown消息
下面通过一些代码展示这些函数的用法(只是cpp部分的代码,不包含头文件)
1 // 控件练习.cpp : 定义应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "控件练习.h" 6 TCHAR TcharArr[1024] = _T("你好吧,你走吧大赛的恢复健康是的哈附近考虑水电费哈圣诞节快乐"); 7 #define MAX_LOADSTRING 100 8 // 全局变量: 9 HINSTANCE hInst; // 当前实例 10 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 11 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 12 13 // 此代码模块中包含的函数的前向声明: 14 INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); 15 ATOM MyRegisterClass(HINSTANCE hInstance); 16 BOOL InitInstance(HINSTANCE, int); 17 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 18 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 19 20 int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, 21 _In_opt_ HINSTANCE hPrevInstance, 22 _In_ LPTSTR lpCmdLine, 23 _In_ int nCmdShow) 24 { 25 UNREFERENCED_PARAMETER(hPrevInstance); 26 UNREFERENCED_PARAMETER(lpCmdLine); 27 28 // TODO: 在此放置代码。 29 MSG msg; 30 HACCEL hAccelTable; 31 32 // 初始化全局字符串 33 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 34 LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING); 35 MyRegisterClass(hInstance); 36 37 // 执行应用程序初始化: 38 if (!InitInstance (hInstance, nCmdShow)) 39 { 40 return FALSE; 41 } 42 43 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY)); 44 45 // 主消息循环: 46 while (GetMessage(&msg, NULL, 0, 0)) 47 { 48 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 49 { 50 TranslateMessage(&msg); 51 DispatchMessage(&msg); 52 } 53 } 54 55 return (int) msg.wParam; 56 } 57 58 59 60 // 61 // 函数: MyRegisterClass() 62 // 63 // 目的: 注册窗口类。 64 // 65 ATOM MyRegisterClass(HINSTANCE hInstance) 66 { 67 WNDCLASSEX wcex; 68 69 wcex.cbSize = sizeof(WNDCLASSEX); 70 71 wcex.style = CS_HREDRAW | CS_VREDRAW; 72 wcex.lpfnWndProc = WndProc; 73 wcex.cbClsExtra = 0; 74 wcex.cbWndExtra = 0; 75 wcex.hInstance = hInstance; 76 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY)); 77 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 78 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 79 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY); 80 wcex.lpszClassName = szWindowClass; 81 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 82 83 return RegisterClassEx(&wcex); 84 } 85 86 // 87 // 函数: InitInstance(HINSTANCE, int) 88 // 89 // 目的: 保存实例句柄并创建主窗口 90 // 91 // 注释: 92 // 93 // 在此函数中,我们在全局变量中保存实例句柄并 94 // 创建和显示主程序窗口。 95 // 96 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 97 { 98 HWND hWnd; 99 100 hInst = hInstance; // 将实例句柄存储在全局变量中 101 102 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 103 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 104 105 if (!hWnd) 106 { 107 return FALSE; 108 } 109 110 ShowWindow(hWnd, nCmdShow); 111 UpdateWindow(hWnd); 112 113 return TRUE; 114 } 115 116 // 117 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) 118 // 119 // 目的: 处理主窗口的消息。 120 // 121 // WM_COMMAND - 处理应用程序菜单 122 // WM_PAINT - 绘制主窗口 123 // WM_DESTROY - 发送退出消息并返回 124 // 125 // 126 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 127 { 128 int wmId, wmEvent; 129 PAINTSTRUCT ps; 130 HDC hdc; 131 132 switch (message) 133 { 134 case WM_LBUTTONDOWN: 135 { 136 /*DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);*/ 137 HWND hDiawnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc); 138 ShowWindow(hDiawnd, SW_SHOWNORMAL); 139 } 140 break; 141 case WM_COMMAND: 142 wmId = LOWORD(wParam); 143 wmEvent = HIWORD(wParam); 144 // 分析菜单选择: 145 switch (wmId) 146 { 147 case IDM_ABOUT: 148 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 149 break; 150 case IDM_EXIT: 151 DestroyWindow(hWnd); 152 break; 153 default: 154 return DefWindowProc(hWnd, message, wParam, lParam); 155 } 156 break; 157 case WM_PAINT: 158 hdc = BeginPaint(hWnd, &ps); 159 // TODO: 在此添加任意绘图代码... 160 EndPaint(hWnd, &ps); 161 break; 162 case WM_DESTROY: 163 PostQuitMessage(0); 164 break; 165 default: 166 return DefWindowProc(hWnd, message, wParam, lParam); 167 } 168 return 0; 169 } 170 171 // “关于”框的消息处理程序。 172 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 173 { 174 UNREFERENCED_PARAMETER(lParam); 175 switch (message) 176 { 177 case WM_INITDIALOG: 178 return (INT_PTR)TRUE; 179 180 case WM_COMMAND: 181 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 182 { 183 EndDialog(hDlg, LOWORD(wParam)); 184 return (INT_PTR)TRUE; 185 } 186 break; 187 } 188 return (INT_PTR)FALSE; 189 } 190 191 192 // “关于”框的消息处理程序。 193 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 194 { 195 UNREFERENCED_PARAMETER(lParam); 196 switch (message) 197 { 198 case WM_INITDIALOG: 199 CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 550, 500, hDlg, (HMENU)5002, hInst, nullptr); 200 201 //喜欢选项 202 CreateWindow(_T("static"), _T("你喜欢谁:"), WS_CHILD | WS_VISIBLE, 15, 35, 100, 20, hDlg, (HMENU)5003, hInst, nullptr); 203 CreateWindow(_T("button"), _T("花花:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 60, 100, 20, hDlg, (HMENU)5004, hInst, nullptr); 204 CreateWindow(_T("button"), _T("草草:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 85, 100, 20, hDlg, (HMENU)5005, hInst, nullptr); 205 206 //喜欢颜色选项 207 CreateWindow(_T("static"), _T("你喜欢什么颜色:"), WS_CHILD | WS_VISIBLE, 15, 115, 130, 20, hDlg, (HMENU)5006, hInst, nullptr); 208 CreateWindow(_T("button"), _T("蓝色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 140, 100, 20, hDlg, (HMENU)5007, hInst, nullptr); 209 CreateWindow(_T("button"), _T("黄色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 165, 100, 20, hDlg, (HMENU)5008, hInst, nullptr); 210 211 //爱好 212 CreateWindow(_T("static"), _T("你喜欢做什么:"), WS_CHILD | WS_VISIBLE, 15, 200, 130, 20, hDlg, (HMENU)5009, hInst, nullptr); 213 CreateWindow(_T("button"), _T("洗衣服:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX , 15, 225, 100, 20, hDlg, (HMENU)5010, hInst, nullptr); 214 CreateWindow(_T("button"), _T("拖地:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 15, 255, 100, 20, hDlg, (HMENU)5011, hInst, nullptr); 215 216 //输入编辑框 217 CreateWindow(_T("edit"), _T("请输入:"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 15, 285, 400, 80, hDlg, (HMENU)5012, hInst, nullptr); 218 return (INT_PTR)TRUE; 219 220 case WM_COMMAND: 221 switch (LOWORD(wParam)) 222 { 223 case 5001: 224 SendMessage(hDlg, 5012, sizeof(TcharArr), (unsigned int)TcharArr); 225 if(IsDlgButtonChecked(hDlg, 5004)) 226 { 227 MessageBox(0, _T("花花被选中了"), 0, 0); 228 } 229 else 230 { 231 SendMessage(GetDlgItem(hDlg, 5004), BM_SETCHECK, 1, 0); 232 } 233 break; 234 case 5002: 235 break; 236 } 237 238 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 239 { 240 DestroyWindow(hDlg); 241 return (INT_PTR)TRUE; 242 } 243 break; 244 } 245 return (INT_PTR)FALSE; 246 }
运行结果:
示例二
1 // test08.cpp : 定义应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include "test08.h" 6 7 #define MAX_LOADSTRING 100 8 9 // 全局变量: 10 HINSTANCE hInst; // 当前实例 11 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 12 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 13 14 // 此代码模块中包含的函数的前向声明: 15 ATOM MyRegisterClass(HINSTANCE hInstance); 16 BOOL InitInstance(HINSTANCE, int); 17 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 18 INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); 19 20 HWND g_hWnd; 21 22 HWND g_hDlgWnd; 23 24 int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, 25 _In_opt_ HINSTANCE hPrevInstance, 26 _In_ LPTSTR lpCmdLine, 27 _In_ int nCmdShow) 28 { 29 UNREFERENCED_PARAMETER(hPrevInstance); 30 UNREFERENCED_PARAMETER(lpCmdLine); 31 32 // TODO: 在此放置代码。 33 MSG msg; 34 HACCEL hAccelTable; 35 36 // 初始化全局字符串 37 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 38 LoadString(hInstance, IDC_TEST08, szWindowClass, MAX_LOADSTRING); 39 MyRegisterClass(hInstance); 40 41 // 执行应用程序初始化: 42 if (!InitInstance (hInstance, nCmdShow)) 43 { 44 return FALSE; 45 } 46 47 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST08)); 48 49 // 主消息循环: 50 while (GetMessage(&msg, NULL, 0, 0)) 51 { 52 //MessageBox(g_hWnd, 00, 0, 0); 53 if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 54 { 55 TranslateMessage(&msg); 56 DispatchMessage(&msg); 57 } 58 } 59 60 return (int) msg.wParam; 61 } 62 63 64 65 // 66 // 函数: MyRegisterClass() 67 // 68 // 目的: 注册窗口类。 69 // 70 ATOM MyRegisterClass(HINSTANCE hInstance) 71 { 72 WNDCLASSEX wcex; 73 74 wcex.cbSize = sizeof(WNDCLASSEX); 75 76 wcex.style = CS_HREDRAW | CS_VREDRAW; 77 wcex.lpfnWndProc = WndProc; 78 wcex.cbClsExtra = 0; 79 wcex.cbWndExtra = 0; 80 wcex.hInstance = hInstance; 81 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST08)); 82 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 83 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 84 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST08); 85 wcex.lpszClassName = szWindowClass; 86 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); 87 88 return RegisterClassEx(&wcex); 89 } 90 91 // 92 // 函数: InitInstance(HINSTANCE, int) 93 // 94 // 目的: 保存实例句柄并创建主窗口 95 // 96 // 注释: 97 // 98 // 在此函数中,我们在全局变量中保存实例句柄并 99 // 创建和显示主程序窗口。 100 // 101 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 102 { 103 HWND hWnd; 104 105 hInst = hInstance; // 将实例句柄存储在全局变量中 106 107 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 108 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 109 110 g_hWnd = hWnd; 111 112 if (!hWnd) 113 { 114 return FALSE; 115 } 116 117 ShowWindow(hWnd, nCmdShow); 118 UpdateWindow(hWnd); 119 120 return TRUE; 121 } 122 123 // 124 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) 125 // 126 // 目的: 处理主窗口的消息。 127 // 128 // WM_COMMAND - 处理应用程序菜单 129 // WM_PAINT - 绘制主窗口 130 // WM_DESTROY - 发送退出消息并返回 131 // 132 // 133 134 //对话框:特殊的窗口,主要用于用户的输入(有意识让缩小用户的输入范围),布局控件 135 //可以认为对话框是用来承载控件 136 137 //对话框分为2类: 138 //模态对话框 阻塞(同步)模式,对这个对话框之外的应用程序主窗口要进行操作,必须先操作完这个对话框才行 139 //非模态对话框 非阻塞(异步)模式,对这个对话框之外的应用程序主窗口要进行操作,可以随时 140 141 //对话框的创建步骤: 142 //1、添加对话框资源(资源去添加一个对话框) 143 //2、调用一个函数去创建一个对话框(模态调用DialogBox,非模态调用createdialog) 144 //3、创建一个对话框的窗口处理函数 145 //4、释放对话框(模态调用EndDialog,非模态调用DestroyWindow) 146 147 //区别: 148 //模态的创建没返回窗口句柄,非模态返回了窗口句柄,非模态需要调用ShowWindow,否则对话框不显示 149 150 //基本控件 151 //控件也是一个特殊的子窗口,是系统已经定义好的窗口类 152 //系统用小写的标识符来定义控件窗口类名,button(按钮),static(静态文本) 153 154 //作业: 155 //自定义账号和密码,实现一个登录功能,输入正确的账号和密码之后点确定后才能进入主窗口,输入错误,把两个输入清空 156 //重新输入 157 158 TCHAR strArr[1024] = {}; 159 160 INT_PTR CALLBACK ModDialogRroc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 161 { 162 UNREFERENCED_PARAMETER(lParam); 163 switch (message) 164 { 165 case WM_INITDIALOG://初始化对话框(类似wm_create) 166 //在对话框显示之前先响应消息 子控件的创建通过CreateWindow 167 //WS_CHILD 子窗口 WS_VISIBLE 可见的 WS_BORDER 有边框 168 //BS_PUSHBUTTON 下压式的按钮 BS_GROUPBOX 组框 BS_AUTORADIOBUTTON 单选框 BS_AUTOCHECKBOX 复选框 169 //注意:创建控件的窗口是不需要菜单句柄(对话框及子控件没菜单),把控件的id号,做为参数放在菜单这个形参 170 CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 171 500, 450, 100, 30, hDlg, (HMENU)5001, hInst, NULL); 172 173 //========================== 174 //组框 175 CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 176 10, 10, 500, 400, hDlg, (HMENU)5002, hInst, NULL); 177 //静态文本 178 CreateWindow(_T("static"), _T("谁最帅:"), WS_CHILD | WS_VISIBLE, 179 20, 40, 100, 30, hDlg, (HMENU)5003, hInst, NULL); 180 //单选框 181 //WS_GROUP 代表从当前代码处开始分组,碰到下一个WS_GROUP代码处终止(或者没有单选按钮为止),为一组 182 CreateWindow(_T("button"), _T("小广广"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 183 50, 70, 100, 30, hDlg, (HMENU)6001, hInst, NULL); 184 CreateWindow(_T("button"), _T("夏七"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 185 50, 100, 100, 30, hDlg, (HMENU)6002, hInst, NULL); 186 CreateWindow(_T("button"), _T("凯文"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 187 50, 130, 100, 30, hDlg, (HMENU)6003, hInst, NULL); 188 189 //静态文本 190 CreateWindow(_T("static"), _T("调查者的学历:"), WS_CHILD | WS_VISIBLE, 191 20, 170, 200, 30, hDlg, (HMENU)5004, hInst, NULL); 192 //单选框 193 CreateWindow(_T("button"), _T("大专"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 194 50, 200, 100, 30, hDlg, (HMENU)6004, hInst, NULL); 195 CreateWindow(_T("button"), _T("本科"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 196 50, 230, 100, 30, hDlg, (HMENU)6005, hInst, NULL); 197 CreateWindow(_T("button"), _T("幼儿圆"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 198 50, 260, 100, 30, hDlg, (HMENU)6006, hInst, NULL); 199 200 //静态文本 201 CreateWindow(_T("static"), _T("调查者的兴趣喜好:"), WS_CHILD | WS_VISIBLE, 202 220, 40, 200, 30, hDlg, (HMENU)5005, hInst, NULL); 203 //复选框 204 CreateWindow(_T("button"), _T("吃饭"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 205 250, 70, 100, 30, hDlg, (HMENU)6007, hInst, NULL); 206 CreateWindow(_T("button"), _T("睡觉"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 207 250, 100, 100, 30, hDlg, (HMENU)6008, hInst, NULL); 208 CreateWindow(_T("button"), _T("打豆豆"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 209 250, 130, 100, 30, hDlg, (HMENU)6009, hInst, NULL); 210 211 //编辑框: edit 212 CreateWindow(_T("edit"), _T("请输入:"), WS_CHILD | WS_VISIBLE |WS_BORDER, 213 30, 290, 450, 100, hDlg, (HMENU)6010, hInst, NULL); 214 215 //设置默认的控件 216 //没有保存窗口,可以通过GetDlgItem得到控件的窗口句柄 217 //第3个参数设置为1,代表6001id的这个控件被选中 218 SendMessage(GetDlgItem(hDlg, 6001), BM_SETCHECK, 1, 0); 219 220 SendMessage(GetDlgItem(hDlg, 6007), BM_SETCHECK, 1, 0); 221 return (INT_PTR)TRUE; 222 223 case WM_COMMAND://命令消息 224 switch (LOWORD(wParam)) 225 { 226 case 6010: 227 break; 228 case 6007: 229 break; 230 case 6001: 231 break; 232 case 5001: 233 _tcscpy_s(strArr, _T("谁最帅:")); 234 if (IsDlgButtonChecked(hDlg, 6001))//判断6001这个按钮是否被选中 235 _tcscat_s(strArr,_T("小广广。")); 236 _tcscat_s(strArr,_T("调查者的学历:")); 237 if (IsDlgButtonChecked(hDlg, 6004)) 238 _tcscat_s(strArr,_T("大专。")); 239 _tcscat_s(strArr, _T("调查者的兴趣喜好:")); 240 if (IsDlgButtonChecked(hDlg, 6007)) 241 _tcscat_s(strArr, _T("吃饭。")); 242 243 244 SetDlgItemText(hDlg, 6010, strArr); 245 246 TCHAR aa[1024] = {}; 247 GetDlgItemText(hDlg, 6010, aa, 1023); 248 MessageBox(0, aa, 0, 0); 249 break; 250 } 251 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 252 { 253 EndDialog(hDlg, LOWORD(wParam)); 254 //DestroyWindow(g_hDlgWnd);//非模态的释放 255 return (INT_PTR)TRUE; 256 } 257 break; 258 } 259 return (INT_PTR)FALSE; 260 } 261 262 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 263 { 264 int wmId, wmEvent; 265 PAINTSTRUCT ps; 266 HDC hdc; 267 268 switch (message) 269 { 270 case WM_RBUTTONDOWN: 271 //模态 272 //第3个参数为父窗口句柄; //第4个参数为对话框的窗口处理函数指针 273 DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//创建模态对话框 274 //EndDialog模态对话框的释放 DialogBox模态对话框的创建 275 276 非模态 277 //g_hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//创建非模态对话框 278 //ShowWindow(g_hDlgWnd, SW_SHOWNORMAL);//非模态对话框创建之后必须要调用ShowWindow来显示 279 break; 280 case WM_COMMAND: 281 wmId = LOWORD(wParam); 282 wmEvent = HIWORD(wParam); 283 // 分析菜单选择: 284 switch (wmId) 285 { 286 case IDM_ABOUT: 287 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); 288 break; 289 case IDM_EXIT: 290 DestroyWindow(hWnd); 291 break; 292 default: 293 return DefWindowProc(hWnd, message, wParam, lParam); 294 } 295 break; 296 case WM_PAINT: 297 hdc = BeginPaint(hWnd, &ps); 298 // TODO: 在此添加任意绘图代码... 299 EndPaint(hWnd, &ps); 300 break; 301 case WM_DESTROY: 302 PostQuitMessage(0); 303 break; 304 default: 305 return DefWindowProc(hWnd, message, wParam, lParam); 306 } 307 return 0; 308 } 309 310 // “关于”框的消息处理程序。 311 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 312 { 313 UNREFERENCED_PARAMETER(lParam); 314 switch (message) 315 { 316 case WM_INITDIALOG://初始化对话框(类似wm_create) 317 return (INT_PTR)TRUE; 318 319 case WM_COMMAND: 320 if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 321 { 322 EndDialog(hDlg, LOWORD(wParam)); 323 return (INT_PTR)TRUE; 324 } 325 break; 326 } 327 return (INT_PTR)FALSE; 328 }
运行结果
标签:wParam,CreateWindowEx,窗口,BS,hDlg,API,WS,按钮,hInst 来源: https://www.cnblogs.com/xdxf2000/p/16310483.html