Windows --- 非模态对话框

接: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;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiuqiuyaq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值