http://www.cnblogs.com/zplutor/archive/2011/02/20/1958973.html

在Win32编程中,如果要显示一个模态窗口,一般是先创建对话框模板,然后使用DialogBox来显示对话框。这种做法很简单,但存在一个问题:对话框是以资源的形式保存在可执行文件中的,如果可执行文件没有进行加壳处理的话,任何人都可以通过ExeScope等资源修改工具修改对话框的内容,这对于含有版权信息的“关于”对话框来说是非常危险的,怀有不良目的的人只需进行简单的操作就可以将一个软件变成是自己的。

保护软件的版权信息不被修改有很多种方法,在这里我想说的一种方法是用代码来创建“关于”对话框的内容,在运行时才创建这个对话框,而不是通过对话框模板早早就创建好。既然不使用对话框模板,那就不能使用DialogBox函数来显示模态的对话框了,所以这种方法的一个难点就是如何不使用DialogBox来创建一个模态的窗口。本文的重点在于如何解决这个难点,而不在于如何在运行时创建窗口的内容。

通过查阅MSDN,可以知道DialogBox实际上是一个宏,它调用DialogBoxParam函数来创建对话框。而后者通过CreateWindowEx函数创建窗口,然后disables父窗口,并开启一个新的消息循环来处理对话框的消息。我们可以自己实现这个过程。

首先创建一个父窗口:

#include <windows.h>
#include "resource.h"LRESULT CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DisplayModelDialog(HWND hParent);int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpfnWndProc = DialogProc;wndclass.lpszMenuName = NULL;wndclass.lpszClassName = TEXT("Dialog");RegisterClass(&wndclass);wndclass.lpfnWndProc = WndProc;wndclass.lpszMenuName = TEXT("Menu");wndclass.lpszClassName = TEXT("Parent");RegisterClass(&wndclass);HWND hwnd = CreateWindow(TEXT("Parent"), TEXT("Parent"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);MSG msg;while(GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message) {case WM_COMMAND:if (LOWORD(wParam) == ID_FILE_DIALOG) {DisplayModelDialog(hwnd);}return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

在WinMain函数的开头注册了两个窗口类,第一个“Dialog”窗口类是供模态窗口使用的,它使用DialogProc窗口过程;第二个“Parent”窗口是供父窗口使用的,它使用WndProc窗口过程。

父窗口含有一个名为“Menu”的菜单,该菜单有一个“Dialog”菜单项,点击这个菜单项之后调用DisplayModelDialog函数来显示模态的窗口。

DisplayModelDialog函数是显示模态窗口的关键,下面是它的实现代码:

void DisplayModelDialog(HWND hParent) {EnableWindow(hParent, FALSE);HWND hDlg = CreateWindow(TEXT("Dialog"),TEXT("Dialog"),WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hParent,NULL,(HINSTANCE)GetWindowLong(hParent, GWL_HINSTANCE),NULL);ShowWindow(hDlg, SW_SHOW);UpdateWindow(hDlg);MSG msg;while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}EnableWindow(hParent, TRUE);SetForegroundWindow(hParent);
}LRESULT CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {switch (message) {case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd, message, wParam, lParam);
}

上面的代码看上去几乎就是一个新的Windows应用程序,不同的地方在于,函数的开头和结尾增加了对EnableWindow和SetForegroundWindow的调用。如果没有对SetForegroundWindow的调用,在关闭模态窗口之后父窗口会最小化。

运行程序,点击菜单上的Dialog项,就可以弹出一个模态窗口,点击父窗口任意位置,模态窗口会闪烁,就像模态对话框的行为一样。现在,可以修改模态窗口的样式,并处理WM_CREATE消息在窗口中增加内容了。

[Win32]创建模态窗口相关推荐

  1. 使用jQuery创建模态窗口登陆效果

    来源:GBin1.com 在线下载 在线演示 隐藏模态窗口技术是一种很好的解决方案,用于处理不是特有必要出现在网页上的界面元素.社交网络可以使用模态窗口传达私人讯息以及只针对会员才能看 到的表单.在博 ...

  2. (面试题)html中创建模态窗口的方法有哪些?

    一.创建模态和非模态对话框 除了alert(""); confirm(""); prompt("");之外还有 创建模态对话框: vRetu ...

  3. jquery.reveal_使用jQuery Reveal插件构建弹出模态窗口

    jquery.reveal 今天,我们将采用Orman的弹出模态窗口 ,并使用HTML和CSS重新创建它. 然后,我们将使用jQuery Reveal插件为其提供全部功能. 我们甚至会更进一步,添加一 ...

  4. 【转】win32 的DLL中创建windows窗口

    转自:https://blog.51cto.com/wangyw/1071967 因工作需求,需要写一个DLL,并在其中创建windows窗口,网上有很多关于DLL创建窗口的文章,不过都是基于MFC的 ...

  5. Qt 模态和非模态窗口的创建与关闭

    首先应该明确的是,不仅仅Qt中包含模态窗口和非模态窗口,任何一个窗口界面开发的工具都应该具备此项功能. 模态窗口最简单的理解是在模态窗口打开之后,用户只能与这个窗口进行交互,而在其关闭之前不能与其他窗 ...

  6. win32创建窗口及其消息循环

    转自:http://anyzixin.blog.163.com/blog/static/365289122007103031657355/ http://anyzixin.blog.163.com/b ...

  7. php模态窗口,php – 如何在yii2中的模态窗口中使用pjax更新小部件

    我在一个模态窗口中有两个ActiveForms,在提交第一个表单后,我需要更新第二个表单并保持模态. 据我所知,pjax可以处理,但无法让它正常工作. 在_form.php中,我有ActiveForm ...

  8. duilib : 模态窗口

    void CMainDlg::DoTask() { CTaskDlg * pDlg = NULL; pDlg = new CTaskDlg(XML_FILE_NAME_TASK_DLG, WND_CL ...

  9. 移动端模态窗口的滚动和橡皮筋问题解决方案

    1.什么是模态窗口[浮层]? 模态窗口就是用户只能与该窗口进行交互,而其他用户界面收不到输入信息.只有关闭该窗口后,其他界面才能与用户交互,且仍可以读取模态窗口中的信息.  其特点就是: a.用户的交 ...

  10. MFC模态窗口与非模态窗口

    MFC模态窗口与非模态窗口 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年07月25日 模态窗口的意思是指主窗口在打开模态窗口后,没法再操作主窗口,这就是模态 ...

最新文章

  1. php中 一行上显示多个数字,php – 打印图案以显示最多5行和5列的数字,如5 4 3 2 1和下一行4 3 2 1 5到第5行...
  2. Linux系统编程----8(竞态条件,时序竞态,pause函数,如何解决时序竞态)
  3. python视频网站分类_媒资分类_Python SDK_服务端SDK_视频点播 - 阿里云
  4. php 5.0打印数据库,thinkphp5.0数据库操作
  5. Mac如何制作分屏视频
  6. Julia: 如何读出csv文件中的中文字符?
  7. Matlab的语言概述
  8. 计算机离散数学及其应用
  9. 华为od面试全流程总结
  10. 电脑常用快捷键的使用
  11. 高压开关柜无线测温系统(高压开关柜在线监测系统应用案例)
  12. 在excel里插入图表_如何在Excel中锁定图表的位置
  13. 内存报错:Cannot allocate memory
  14. 高分一号数据处理(一):数据下载
  15. 计算机安全会议2017,科学网-第四届中国密码学与数据安全学术会议(CCDS2017)在衡阳师院召开-李浪的博文...
  16. 秒表计时器(Timeout 实现 Interval)
  17. IE安全系列:IE的自我介绍 (II)
  18. Angular------win10搭建Angular环境并运行hello-world
  19. 前端基于element组件的语音文件上传
  20. IMX6ULL SPI

热门文章

  1. 同步方案java_【Java基础】多线程中同步的两种解决方案
  2. java http请求_零基础学Java,掌握Java基础难不难?
  3. 使用python对学生表的查询_python + mysql 实现查询表数据
  4. java socket聊天_java_基于Java Socket实现一个简易在线聊天功能(一),最近做了一个项目,其中有一 - phpStudy...
  5. rdp如何禁止映射本地磁盘_什么是磁盘阵列?什么是NAS?该怎么选择?
  6. 凯撒密码的实践使用-2--加密,解密的python代码事项
  7. 帆软填报JS不刷新页面排序表格
  8. Jquery通过ajax加载json,jquery ajax json 异步加载数据
  9. 如何设置照片的高度没有滚条_10分钟看懂Photoshop 照片修饰(照片修复工具)
  10. 深度学习基础系列(十)| Global Average Pooling是否可以替代全连接层?