·控件:特殊的一类”子”窗口,系统已经定义好了窗口类型.
创建方式和创建窗口类似,调用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 : 定义应用程序的入口点。 // #include "stdafx.h" #include "控件练习.h" TCHAR TcharArr[1024] = _T("你好吧,你走吧大赛的恢复健康是的哈附近考虑水电费哈圣诞节快乐"); #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM); ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 MSG msg; HACCEL hAccelTable; // 初始化全局字符串 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_MY, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_MY)); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MY)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_MY); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // // 注释: // // 在此函数中,我们在全局变量中保存实例句柄并 // 创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 // // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_LBUTTONDOWN: { /*DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc);*/ HWND hDiawnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DialogProc); ShowWindow(hDiawnd, SW_SHOWNORMAL); } break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // “关于”框的消息处理程序。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } // “关于”框的消息处理程序。 INT_PTR CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 550, 500, hDlg, (HMENU)5002, hInst, nullptr); //喜欢选项 CreateWindow(_T("static"), _T("你喜欢谁:"), WS_CHILD | WS_VISIBLE, 15, 35, 100, 20, hDlg, (HMENU)5003, hInst, nullptr); CreateWindow(_T("button"), _T("花花:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 60, 100, 20, hDlg, (HMENU)5004, hInst, nullptr); CreateWindow(_T("button"), _T("草草:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 85, 100, 20, hDlg, (HMENU)5005, hInst, nullptr); //喜欢颜色选项 CreateWindow(_T("static"), _T("你喜欢什么颜色:"), WS_CHILD | WS_VISIBLE, 15, 115, 130, 20, hDlg, (HMENU)5006, hInst, nullptr); CreateWindow(_T("button"), _T("蓝色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 15, 140, 100, 20, hDlg, (HMENU)5007, hInst, nullptr); CreateWindow(_T("button"), _T("黄色:"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 15, 165, 100, 20, hDlg, (HMENU)5008, hInst, nullptr); //爱好 CreateWindow(_T("static"), _T("你喜欢做什么:"), WS_CHILD | WS_VISIBLE, 15, 200, 130, 20, hDlg, (HMENU)5009, hInst, nullptr); CreateWindow(_T("button"), _T("洗衣服:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX , 15, 225, 100, 20, hDlg, (HMENU)5010, hInst, nullptr); CreateWindow(_T("button"), _T("拖地:"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 15, 255, 100, 20, hDlg, (HMENU)5011, hInst, nullptr); //输入编辑框 CreateWindow(_T("edit"), _T("请输入:"), WS_CHILD | WS_VISIBLE | WS_BORDER | ES_MULTILINE, 15, 285, 400, 80, hDlg, (HMENU)5012, hInst, nullptr); return (INT_PTR)TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case 5001: SendMessage(hDlg, 5012, sizeof(TcharArr), (unsigned int)TcharArr); if(IsDlgButtonChecked(hDlg, 5004)) { MessageBox(0, _T("花花被选中了"), 0, 0); } else { SendMessage(GetDlgItem(hDlg, 5004), BM_SETCHECK, 1, 0); } break; case 5002: break; } if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { DestroyWindow(hDlg); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
运行结果:
// test08.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "test08.h" #define MAX_LOADSTRING 100 // 全局变量: HINSTANCE hInst; // 当前实例 TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本 TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); HWND g_hWnd; HWND g_hDlgWnd; int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代码。 MSG msg; HACCEL hAccelTable; // 初始化全局字符串 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_TEST08, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // 执行应用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TEST08)); // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { //MessageBox(g_hWnd, 00, 0, 0); if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; } // // 函数: MyRegisterClass() // // 目的: 注册窗口类。 // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST08)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST08); wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassEx(&wcex); } // // 函数: InitInstance(HINSTANCE, int) // // 目的: 保存实例句柄并创建主窗口 // // 注释: // // 在此函数中,我们在全局变量中保存实例句柄并 // 创建和显示主程序窗口。 // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); g_hWnd = hWnd; if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // // 函数: WndProc(HWND, UINT, WPARAM, LPARAM) // // 目的: 处理主窗口的消息。 // // WM_COMMAND - 处理应用程序菜单 // WM_PAINT - 绘制主窗口 // WM_DESTROY - 发送退出消息并返回 // // //对话框:特殊的窗口,主要用于用户的输入(有意识让缩小用户的输入范围),布局控件 //可以认为对话框是用来承载控件 //对话框分为2类: //模态对话框 阻塞(同步)模式,对这个对话框之外的应用程序主窗口要进行操作,必须先操作完这个对话框才行 //非模态对话框 非阻塞(异步)模式,对这个对话框之外的应用程序主窗口要进行操作,可以随时 //对话框的创建步骤: //1、添加对话框资源(资源去添加一个对话框) //2、调用一个函数去创建一个对话框(模态调用DialogBox,非模态调用createdialog) //3、创建一个对话框的窗口处理函数 //4、释放对话框(模态调用EndDialog,非模态调用DestroyWindow) //区别: //模态的创建没返回窗口句柄,非模态返回了窗口句柄,非模态需要调用ShowWindow,否则对话框不显示 //基本控件 //控件也是一个特殊的子窗口,是系统已经定义好的窗口类 //系统用小写的标识符来定义控件窗口类名,button(按钮),static(静态文本) //作业: //自定义账号和密码,实现一个登录功能,输入正确的账号和密码之后点确定后才能进入主窗口,输入错误,把两个输入清空 //重新输入 TCHAR strArr[1024] = {}; INT_PTR CALLBACK ModDialogRroc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG://初始化对话框(类似wm_create) //在对话框显示之前先响应消息 子控件的创建通过CreateWindow //WS_CHILD 子窗口 WS_VISIBLE 可见的 WS_BORDER 有边框 //BS_PUSHBUTTON 下压式的按钮 BS_GROUPBOX 组框 BS_AUTORADIOBUTTON 单选框 BS_AUTOCHECKBOX 复选框 //注意:创建控件的窗口是不需要菜单句柄(对话框及子控件没菜单),把控件的id号,做为参数放在菜单这个形参 CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 500, 450, 100, 30, hDlg, (HMENU)5001, hInst, NULL); //========================== //组框 CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 500, 400, hDlg, (HMENU)5002, hInst, NULL); //静态文本 CreateWindow(_T("static"), _T("谁最帅:"), WS_CHILD | WS_VISIBLE, 20, 40, 100, 30, hDlg, (HMENU)5003, hInst, NULL); //单选框 //WS_GROUP 代表从当前代码处开始分组,碰到下一个WS_GROUP代码处终止(或者没有单选按钮为止),为一组 CreateWindow(_T("button"), _T("小广广"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 50, 70, 100, 30, hDlg, (HMENU)6001, hInst, NULL); CreateWindow(_T("button"), _T("夏七"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 50, 100, 100, 30, hDlg, (HMENU)6002, hInst, NULL); CreateWindow(_T("button"), _T("凯文"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 50, 130, 100, 30, hDlg, (HMENU)6003, hInst, NULL); //静态文本 CreateWindow(_T("static"), _T("调查者的学历:"), WS_CHILD | WS_VISIBLE, 20, 170, 200, 30, hDlg, (HMENU)5004, hInst, NULL); //单选框 CreateWindow(_T("button"), _T("大专"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 50, 200, 100, 30, hDlg, (HMENU)6004, hInst, NULL); CreateWindow(_T("button"), _T("本科"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 50, 230, 100, 30, hDlg, (HMENU)6005, hInst, NULL); CreateWindow(_T("button"), _T("幼儿圆"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 50, 260, 100, 30, hDlg, (HMENU)6006, hInst, NULL); //静态文本 CreateWindow(_T("static"), _T("调查者的兴趣喜好:"), WS_CHILD | WS_VISIBLE, 220, 40, 200, 30, hDlg, (HMENU)5005, hInst, NULL); //复选框 CreateWindow(_T("button"), _T("吃饭"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 250, 70, 100, 30, hDlg, (HMENU)6007, hInst, NULL); CreateWindow(_T("button"), _T("睡觉"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 250, 100, 100, 30, hDlg, (HMENU)6008, hInst, NULL); CreateWindow(_T("button"), _T("打豆豆"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 250, 130, 100, 30, hDlg, (HMENU)6009, hInst, NULL); //编辑框: edit CreateWindow(_T("edit"), _T("请输入:"), WS_CHILD | WS_VISIBLE |WS_BORDER, 30, 290, 450, 100, hDlg, (HMENU)6010, hInst, NULL); //设置默认的控件 //没有保存窗口,可以通过GetDlgItem得到控件的窗口句柄 //第3个参数设置为1,代表6001id的这个控件被选中 SendMessage(GetDlgItem(hDlg, 6001), BM_SETCHECK, 1, 0); SendMessage(GetDlgItem(hDlg, 6007), BM_SETCHECK, 1, 0); return (INT_PTR)TRUE; case WM_COMMAND://命令消息 switch (LOWORD(wParam)) { case 6010: break; case 6007: break; case 6001: break; case 5001: _tcscpy_s(strArr, _T("谁最帅:")); if (IsDlgButtonChecked(hDlg, 6001))//判断6001这个按钮是否被选中 _tcscat_s(strArr,_T("小广广。")); _tcscat_s(strArr,_T("调查者的学历:")); if (IsDlgButtonChecked(hDlg, 6004)) _tcscat_s(strArr,_T("大专。")); _tcscat_s(strArr, _T("调查者的兴趣喜好:")); if (IsDlgButtonChecked(hDlg, 6007)) _tcscat_s(strArr, _T("吃饭。")); SetDlgItemText(hDlg, 6010, strArr); TCHAR aa[1024] = {}; GetDlgItemText(hDlg, 6010, aa, 1023); MessageBox(0, aa, 0, 0); break; } if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); //DestroyWindow(g_hDlgWnd);//非模态的释放 return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; switch (message) { case WM_RBUTTONDOWN: //模态 //第3个参数为父窗口句柄; //第4个参数为对话框的窗口处理函数指针 DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//创建模态对话框 //EndDialog模态对话框的释放 DialogBox模态对话框的创建 ////非模态 //g_hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, ModDialogRroc);//创建非模态对话框 //ShowWindow(g_hDlgWnd, SW_SHOWNORMAL);//非模态对话框创建之后必须要调用ShowWindow来显示 break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // 分析菜单选择: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: 在此添加任意绘图代码... EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // “关于”框的消息处理程序。 INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG://初始化对话框(类似wm_create) return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
运行结果