接:Windows --- 模态对话框_小雪菜本菜的博客-CSDN博客
#include <Windows.h>
#include "resource.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
/* CreateDialog 创建非模态对话框 */
/* DestroyWindow关闭非模态对话框 */
return 0;
}
CreateDialogA macro (winuser.h) - Win32 apps | Microsoft Docs
按钮统一写成 IDC_BTN_
聊天:点一下弹出一个窗口,再点一下弹出第二个窗口. . .
EndDialog 并不是真正地关闭非模态对话框,而是隐藏对话框,只有 DestroyWindow 才能真正地关闭非模态对话框
点击聊天的时候产生了一个对话框,点击关闭对话框并没有真正关闭,只是对话框被隐藏了,窗口句柄还在,点击 IDC_BTN_SHOW 可以被还原
点击还原后发现窗口被还原了
注意:显示窗口ShowWindow() 和 重绘UpdateWindow() 都会响应绘图 WM_PAINT
#include <Windows.h>
#include "resource.h"
//应用程序实例句柄
HINSTANCE g_hInstance;
//登陆对话框处理函数
BOOL CALLBACK LoginDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//对话框窗口处理函数
BOOL CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//关于对话框处理函数
BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//聊天对话框处理函数
BOOL CALLBACK CHATDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
g_hInstance = hInstance;
//创建登陆窗口
int nResult = DialogBox(hInstance, MAKEINTRESOURCE(IDD_LOGIN_DLG), NULL, LoginDlgProc);
if (nResult == IDOK)
{
//只有nResult == IDOK才创建主窗口 点击取消返回 IDCANCEL 不会创建主窗口
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DLG), NULL, MainDlgProc);
}
//创建模态对话框
/* 需要把整数类型转换成字符串类型 */
/* 没有父窗口 值为 NULL */
return 0;
}
BOOL CALLBACK MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
//聊天窗口用 static 修饰 静态变量
static HWND hChatDlg = NULL;
switch (uMsg)
{
case WM_CREATE:
MessageBox(hWnd, L"这是WM_CREATE消息", L"提示", MB_OK);
// 对话框初始化消息
case WM_INITDIALOG:
{
// 设置对话框标题
//SetWindowText(hWnd, L"这是一个对话框程序");
// 加载图标
HICON hICON = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAIN));
//发送消息
//发送大图标
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hICON);
//发送小图标
SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hICON);
break;
}
// 窗口关闭消息
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
break;
// 命令消息
case WM_COMMAND:
switch (LOWORD(wParam))
{
// 点了取消按钮
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
case IDOK:
MessageBox(hWnd, L"点击确定",L"提示", MB_OK);
break;
//关于按钮
case IDC_BTN_ABOUT:
//阻塞
DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT_DLG), hWnd, AboutDlgProc);
break;
//聊天
case IDC_BTN_CHAT:
/* 创建的非模态对话框会返回窗口句柄 */
//非阻塞 break 一结束就没有了说明生命周期结束了 主窗口是聊天窗口的父窗口
hChatDlg = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_CHAT_DLG),hWnd, CHATDlgProc);
//显示
ShowWindow(hChatDlg,SW_SHOW);
break;
//刷新
UpdateWindow(hChatDlg);
// 关闭对话框必须要用 DestroyWindow
//DestroyWindow(hChatDlg);
}
//还原非模态对话框 看 hChatDlg 这个变量能否再显示出来
case IDC_BTN_SHOW:
// 显示已经关闭的窗口
ShowWindow(hChatDlg,SW_SHOW);
break;
}
/* 一定要返回 FALSE */
return FALSE;
}
BOOL CALLBACK LoginDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// 窗口关闭消息
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
break;
// 命令消息
case WM_COMMAND:
switch (LOWORD(wParam))
{
//点了取消按钮 退出、关闭当前对话框
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
// 点击登陆按钮 登陆
case IDOK:
//获取控件的值
/*
控件的值如下
用户名:admin
密 码:123456
*/
wchar_t szUsername[100];
wchar_t szPassword[100];
//获取对话框控件里面的文本 传入控件ID 字符串保存在 szUsername
GetDlgItemText(hWnd, IDC_USERNAME, szUsername,100);
GetDlgItemText(hWnd, IDC_PASSWORD, szPassword, 100);
//查看是否获取成功
MessageBox(hWnd,szUsername,L"提示",MB_OK);
/*
字符串判断
szUsername 与 admin 判断
等于 0 表示相等
*/
if(wcscmp(szUsername,L"admin") == 0 && wcscmp(szPassword,L"123456") == 0)
{
//成功 关闭当前登陆窗口
EndDialog(hWnd, IDOK);
}
else
{
//失败
MessageBox(hWnd, L"用户名或密码错误!", L"温馨提示", MB_OK);
}
break;
}
}
return FALSE;
}
BOOL CALLBACK AboutDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
// 点击确定和取消都是关闭窗口
case WM_COMMAND:
switch (wParam)
{
case IDOK:
case IDCANCEL:
EndDialog(hWnd,IDCANCEL);
break;
}
}
return FALSE;
}
BOOL CALLBACK CHATDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
// 窗口关闭消息
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
//改为DestroyWindow(hChatDlg);真正地关闭
break;
// 命令消息
case WM_COMMAND:
switch (LOWORD(wParam))
{
//点了取消按钮 退出、关闭当前对话框
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
//DestroyWindow(hChatDlg);
break;
}
}
return FALSE;
}