1.对话框介绍
1、对话框标题修改
-
直接在资源界面修改:
-
代码修改:
//对话框初始化消息, (对话框还没有显示出来,但是对话框已经创建好了)
case WM_INITDIALOG:
{
//修改对话框标题
SetWindowText(hWnd, L"这是对话框初始化消息");
//设置窗口透明度
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 125, LWA_COLORKEY);
break;
}
2、应用程序exe图标设置:添加图标资源
//设置窗口图标
HICON hIcon1 = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON1));
HICON hIcon2 = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON2));
//设置图标
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon1); //任务栏显示图标
SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon2); //exe界面显示的图标
3、对话框居中
- 属性—>Center—>True
4、响应WM_COMMAND消息
- 当用户从菜单中选择命令项,控件将通知消息发送到其父窗口或按快捷键时发送WM_COMMAND。
Message Source | wParam(高字) | wParam(低字) | lParam |
---|---|---|---|
Menu菜单 | 0 | 菜单ID | 0 |
Accelerator加速器 | 1 | 快捷键ID | 0 |
Control控制 | Control-defined notification code控件定义的通知代码 | 控件ID | Handle to the control window处理到控制窗口 |
//命令消息
case WM_COMMAND:
{
int wID = LOWORD(wParam);
switch (wID)
{
//确定
case IDOK:
MessageBox(hWnd, L"点了OK", NULL, MB_OK);
break;
//取消
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
//关于框
case IDC_BTN_ABOUT:
//弹出一个模态对话窗口
DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT_DLG), hWnd, AboutProc);
break;
}
break;
}
5、GetDlgItemText函数
- 在对话框中检索与控件关联的标题或文本。
UINT GetDlgItemText(
HWND hDlg, // 包含控件的对话框的句柄。
int nIDDlgItem, // 要检索其标题或文本的控件的标识符。
LPTSTR lpString, // 接收标题或文本的缓冲区。
int nMaxCount // 要复制到lpString指向的缓冲区的字符串的最大长度(以字符为单位)
);
- 可以用来获取控件的文本信息进而校验密码等
//获取用户名和密码
TCHAR szUsername[200];
TCHAR szPassword[200];
GetDlgItemText(hWnd, IDC_EDIT1, szUsername, 200);
GetDlgItemText(hWnd, IDC_EDIT2, szPassword, 200);
if (wcscmp(szUsername, L"admin") == 0 && wcscmp(szPassword, L"123456") == 0)
{
//关闭登录
EndDialog(hWnd, IDOK);
}
else
{
MessageBox(hWnd, L"用户名或密码不对", L"提示", MB_OK);
return TRUE;
}
2.模态对话框的创建
使用DialogBox函数来创建,EndDialog来结束对话框
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DLG), NULL, MainDialogProc);
EndDialog(hWnd, IDOK);
对话框窗口处理函数声明
//定义全局变量 因为处理函数中没有句柄 但是加载图标要有句柄
HINSTANCE g_hInstance;
//登录窗口处理函数
BOOL CALLBACK LoginProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//对话框窗口处理函数
BOOL CALLBACK MainDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//关于窗口处理函数
BOOL CALLBACK AboutProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
//定义全局变量实例句柄
g_hInstance = hInstance;
//模态对话框 只能操作当前对话框
//登录
int loginResult = DialogBox(hInstance, MAKEINTRESOURCE(IDD_LOGIN_DLG), NULL, LoginProc); //MAKEINTRESOURCE(IDD_LOGIN_DLG)强制转换 因为IDD_LOGIN_DLG是整数
if (loginResult == IDCANCEL)
return 0;
else
{
//主窗口,阻塞函数
int result = DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DLG), NULL, MainDialogProc);
}
return 0;
}
对话框窗口处理函数
登录窗口处理函数
//登录窗口处理函数
BOOL CALLBACK LoginProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
{
int wID = LOWORD(wParam);
switch (wID)
{
//点击确定按钮时获取用户账号密码并进行判断
case IDOK:
{
//获取用户名和密码
TCHAR szUsername[200];
TCHAR szPassword[200];
GetDlgItemText(hWnd, IDC_EDIT1, szUsername, 200);
GetDlgItemText(hWnd, IDC_EDIT2, szPassword, 200);
if (wcscmp(szUsername, L"admin") == 0 && wcscmp(szPassword, L"123456") == 0)
{
//关闭登录窗口
EndDialog(hWnd, IDOK);
}
else
{
MessageBox(hWnd, L"用户名或密码不对", L"提示", MB_OK);
return TRUE;
}
}
break;
}
break;
}
//窗口关闭消息
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
return TRUE;//用户自己处理
}
return FALSE;//用户不作处理 系统帮处理 即使之前都是true但是到最后还是系统会处理
}
主对话框窗口处理函数
//主对话框窗口处理函数
BOOL CALLBACK MainDialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TCHAR szMsg[250];
wsprintf(szMsg, L"uMsg:%#x\r\n", uMsg);//先setfont initdialog settext
OutputDebugString(szMsg);
switch (uMsg)
{
case WM_INITDIALOG://对话框初始化消息, (对话框还没有显示出来,但是对话框已经创建好了)
{
//设置窗口图标
HICON hIcon1 = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON1));
HICON hIcon2 = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON2));
//设置图标
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon1);
SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon2);
SetWindowText(hWnd, L"这是对话框初始化消息");
//设置窗口透明度
SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 125, LWA_COLORKEY);
break;
}
//命令消息
case WM_COMMAND:
{
int wID = LOWORD(wParam);
switch (wID)
{
case IDOK:
MessageBox(hWnd, L"点了OK", NULL, MB_OK);
break;
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
case IDC_BTN_ABOUT:
//弹出一个窗口
DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT_DLG), hWnd, AboutProc);
break;
}
break;
}
//窗口关闭消息
case WM_CLOSE:
if (IDNO == MessageBox(hWnd, L"您确定要关闭嘛?", L"提示", MB_YESNO))
return TRUE;
else
{
EndDialog(hWnd, IDCANCEL);//EndDialog调用就销毁了
}
//窗口销毁消息
case WM_DESTROY:
//MessageBox(NULL, L"WM_DESTROY消息", NULL, MB_OK);
break;
//文件拖拽消息
case WM_DROPFILES:
{
HDROP hDrop = (HDROP)wParam;
TCHAR szPath[MAX_PATH];
int nCount = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
for (int i = 0; i < nCount;i++)
{
DragQueryFile(hDrop, i, szPath, MAX_PATH);
MessageBox(hWnd, szPath, NULL, MB_OK);
}
break;
}
}
//return TRUE; //返回真,表示 所有消息我们自己处理了,系统不会在给我们处理
return FALSE; //凡回假 表示 所有消息我们自己没处理了,系统给我们处理
}
关于-窗口处理函数
//关于-窗口处理函数
BOOL CALLBACK AboutProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
//窗口关闭消息
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
return TRUE;
}
return FALSE;
}