其他分享
首页 > 其他分享> > API创建窗口 按键 按钮 CreateWindowEx

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