如果要谈控件的话那就要先来谈一下控件的载体——对话框:
对话框分为模态对话框和非模态对话框两种对话框
1、模态对话框:阻塞(同步)对话框,对这个对话框之外的应用程序窗口来进行操作,必须要先操作完当前对话框。
2、非模态对话框:非阻塞(异步)对话框模式,对这个对话框之外的应用程序窗口来进行操作,可以直接进行操作。
对话框创建的步骤(四步)
1、添加对话框资源
2、调用一个函数去创建一个对话框(模态:DialogBox;非模态:CreateDialog)
3、释放一个对话框的窗口处理函数(对话框是一个特殊的窗口,窗口就应该有和窗口对应的消息处理函数)
4、释放对话框(模态:EndDialog;非模态:DestoryWidow)
HWND g_hDlgWnd;//用做非模态对话框窗口句柄(模态不需要,其原因可以理解为:模态对话框窗口没有操作完之前,无法操作其他窗口)
INT_PTR CALLBACK DlgProc(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)
{
DestroyWindow(g_hDlgWnd);
return (INT_PTR)TRUE;
}
创建一个模态对话框
//switch (LOWORD(wParam))
//{
//case IDC_BUTTON1:
// MessageBox(0, 0, 0, 0);
//case IDOK:
//case IDCANCEL:
// EndDialog(hDlg, LOWORD(wParam));
// return (INT_PTR)TRUE;
//}
//break;
///*if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
//{
// EndDialog(hDlg, LOWORD(wParam));//模态对话框的释放
// 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_CREATE:
//CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 100, 100,
// 300, 50, hWnd, NULL, hInst, NULL);
//break;
case WM_RBUTTONDOWN:
//DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);//模态对话框的创建
//非模态对话框的创建
//(hInstance, lpName, hWndParent, lpDialogFunc)
g_hDlgWnd = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
ShowWindow(g_hDlgWnd,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;
}
了解完对话框,下面开始了解控件:
控件 是用来帮助用户输入的(缩小用户的输入范围或提示用户的操作)
控件可以在窗口上显示,一般不会在主窗口上显示
控件需要通过对话框来进行承载
控件:也是一个特殊的子窗口
1、控件是窗口,只要是窗口就会有消息
2、控件是一个子窗口,必须有一个父窗口
3、控件是特殊的子窗口
子窗口的类型在系统中已经定义好了,直接用,系统通过小写表示来定义控件的窗口类名
INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG://初始化对话框消息(在这里可以参照wm_create来进行理解)
//控件的动态添加
//button 是类名(按钮类),包含很多派生类,通过按钮风格来确定使用哪一种按钮
//WS_CHILD 子窗口 WS_VISIBLE 可见的
//BS_PUSHBUTTON 下压式按钮 BS_GROUPBOX组框
//注意:控件是不需要菜单的,那么菜单这个参数会在控件中用来保存id号,来标记对应的控件
CreateWindow(_T("button"), _T("这是一个按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 400, 400, 100, 30, hDlg, (HMENU)5001, hInst, NULL);
//组框
CreateWindow(_T("button"), _T("这是一个调查问卷"), WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 500, 350, hDlg, (HMENU)5002, hInst, NULL);
//静态文本
CreateWindow(_T("static"), _T("谁是长得最帅的人"), WS_CHILD | WS_VISIBLE, 20, 40, 150, 30, hDlg, (HMENU)5003, hInst, NULL);
//单选框//注意:如果没有选择一种风格,那么所有单选就默认为一组
//WS_GROUP 表示单选的分组,直到下一个WS_GROUP宏作为一组,或者没有单选
CreateWindow(_T("button"), _T("道明寺"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 40, 70, 100, 30, hDlg, (HMENU)5004, hInst, NULL);
CreateWindow(_T("button"), _T("花泽类"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 40, 100, 100, 30, hDlg, (HMENU)5005, hInst, NULL);
CreateWindow(_T("button"), _T("西门"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 40, 130, 100, 30, hDlg,(HMENU)5006, hInst, NULL);
CreateWindow(_T("static"), _T("这是谁评的"), WS_CHILD | WS_VISIBLE , 20, 160, 150, 30,hDlg, (HMENU)6001, hInst, NULL);
CreateWindow(_T("button"), _T("最帅的人评的"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 40, 190, 120, 30, hDlg, (HMENU)6002, hInst, NULL);
CreateWindow(_T("button"), _T("最衰的人评的"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 40, 220, 120, 30, hDlg,(HMENU)6003,hInst, NULL);
CreateWindow(_T("static"), _T("评选人的学历"), WS_CHILD | WS_VISIBLE, 200, 40, 150, 30, hDlg, (HMENU)7001, hInst, NULL);
CreateWindow(_T("button"), _T("幼儿园毕业"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON | WS_GROUP, 220, 70, 120, 30, hDlg, (HMENU)7002, hInst, NULL);
CreateWindow(_T("button"), _T("家里蹲大学"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 220, 100, 120, 30, hDlg, (HMENU)7003, hInst, NULL);
SendMessage(GetDlgItem(hDlg, 5004), BM_SETCHECK, 1, 0);
SendMessage(GetDlgItem(hDlg, 6002), BM_SETCHECK, 1, 0);
SendMessage(GetDlgItem(hDlg, 7003), BM_SETCHECK, 1, 0);
return (INT_PTR)TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 5005:
MessageBox(0, 0, 0, 0);
}
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
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:
DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc);
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;
}