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 = ;
wndclass.cbWndExtra = ;
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, , )) { 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 ; case WM_DESTROY:
PostQuitMessage();
return ;
} 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, , )) { 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();
return ;
} return DefWindowProc(hwnd, message, wParam, lParam);
}

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

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

[Win32]创建模态窗口的更多相关文章

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

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

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

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

  3. Win32创建异形窗口

    大家都见过在windows下各种气泡窗口.输入法窗口以及其他一些窗口,这些窗口看起来不像传统的windows窗那样,上面是标题栏,下面是窗口的客户区.这些窗口形状各异,可以是一个多边形,一幅图,甚至是 ...

  4. vs2010通过添加资源文件,修改win32创建的窗口

    1.右键项目的“资源”,新建资源,生成.rc文件 2.进入资源视图创建icon或menu等资源 3.退出资源视图,编译这个.rc文件 4.项目源代码中添加如下几个头文件 #include " ...

  5. 基于vue3.0+electron新开窗口|Electron多开窗体|父子模态窗口

    最近一直在折腾Vue3+Electron技术结合的实践,今天就来分享一些vue3.x和electron实现开启多窗口功能. 开始本文之前,先来介绍下如何使用vue3和electron来快速搭建项目. ...

  6. 十、ios 模态窗口[实例]

    一.模态窗口概念 对话框一般分为两种类型:模态类型( modal )与非模态类型( modeless ).所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话 ...

  7. [转]Ionic最佳实践-使用模态窗口modal

    本文转自:http://m.blog.csdn.net/blog/betreex/45649689 原文地址:Ionic最佳实践-使用模态窗口modal 模态窗口的结构 在Ionic中,模态窗口通过$ ...

  8. win32手动创建windows窗口的,小记

    摘抄自文档,其中的函数需要以后花时间看 向 WinMain 添加功能 首先,在 WinMain 函数内部创建 WNDCLASSEX 类型的窗口类结构. 此结构包含有关窗口的信息,如应用程序图标.窗口的 ...

  9. win32 htmlayout点击按钮创建新窗口,以及按钮图片样式

    最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...

随机推荐

  1. webstrom 里面使用github

    1.输入github的账号和密码,点击登录 2.复制github的项目地址,现在clone就行了

  2. Django 1.10文档中文版Part1

    目录 第一章.Django1.10文档组成结构1.1 获取帮助1.2 文档的组织形式1.3 第一步1.4 模型层1.5 视图层1.6 模板层1.7 表单1.8 开发流程1.9 admin站点1.10 ...

  3. supervisor 的使用

    1.通过yum安装 supervisor: 2.supervisorctl 查看状态: 3.supervisor.d 下查看配置文件,修改命令和日志目录 4.tail -f /var/log/supe ...

  4. 非常粗糙的react网页ppt

    import React, {Component} from 'react'; import './slide.css'; class Page extends Component { constru ...

  5. CentOS7中开机出现end_request:I/O error,dev fd0,sector 0的解决办法

    https://blog.csdn.net/wangjinyang_123/article/details/40583635

  6. 大理石在哪儿(UVa10474)

    题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&a ...

  7. Git & GitHub 学习

    学习资料: Git版本控制软件结合GitHub从入门到精通常用命令学习手册:http://www.ihref.com/read-16369.html 官方中文手册:http://git-scm.com ...

  8. ElasticSearch部署文档(Ubuntu 14.04)

    ElasticSearch部署文档(Ubuntu 14.04) 参考链接 https://www.elastic.co/guide/en/elasticsearch/guide/current/hea ...

  9. Educational Codeforces Round 45 (Rated for Div. 2) F - Flow Control

    F - Flow Control 给你一个有向图,要求你给每条边设置流量,使得所有点的流量符合题目给出的要求. 思路:只有在所有点的流量和为0时有解,因为增加一条边的值不会改变所有点的总流量和, 所以 ...

  10. c++ 单例模式研究

    一篇博文:C++ 单例模式的几种实现研究 中 看到的几段代码 懒汉模式 class Singleton { public: static Singleton* GetInstance() { if ( ...