[Win32]创建模态窗口
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]创建模态窗口的更多相关文章
- 使用jQuery创建模态窗口登陆效果
日期:2013-8-22 来源:GBin1.com 隐藏模态窗口技术是一种很好的解决方案,用于处理不是特有必要出现在网页上的界面元素.社交网络可以使用模态窗口传达私人讯息以及只针对会员才能看 到的表 ...
- (面试题)html中创建模态窗口的方法有哪些?
一.创建模态和非模态对话框除了alert(""); confirm(""); prompt("");之外还有创建模态对话框:vReturnV ...
- Win32创建异形窗口
大家都见过在windows下各种气泡窗口.输入法窗口以及其他一些窗口,这些窗口看起来不像传统的windows窗那样,上面是标题栏,下面是窗口的客户区.这些窗口形状各异,可以是一个多边形,一幅图,甚至是 ...
- vs2010通过添加资源文件,修改win32创建的窗口
1.右键项目的“资源”,新建资源,生成.rc文件 2.进入资源视图创建icon或menu等资源 3.退出资源视图,编译这个.rc文件 4.项目源代码中添加如下几个头文件 #include " ...
- 基于vue3.0+electron新开窗口|Electron多开窗体|父子模态窗口
最近一直在折腾Vue3+Electron技术结合的实践,今天就来分享一些vue3.x和electron实现开启多窗口功能. 开始本文之前,先来介绍下如何使用vue3和electron来快速搭建项目. ...
- 十、ios 模态窗口[实例]
一.模态窗口概念 对话框一般分为两种类型:模态类型( modal )与非模态类型( modeless ).所谓模态对话框,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话 ...
- [转]Ionic最佳实践-使用模态窗口modal
本文转自:http://m.blog.csdn.net/blog/betreex/45649689 原文地址:Ionic最佳实践-使用模态窗口modal 模态窗口的结构 在Ionic中,模态窗口通过$ ...
- win32手动创建windows窗口的,小记
摘抄自文档,其中的函数需要以后花时间看 向 WinMain 添加功能 首先,在 WinMain 函数内部创建 WNDCLASSEX 类型的窗口类结构. 此结构包含有关窗口的信息,如应用程序图标.窗口的 ...
- win32 htmlayout点击按钮创建新窗口,以及按钮图片样式
最近在做一个C++ win32的桌面图形程序,我不是C++程序员,做这个只是因为最近没什么java的活. windows api,之前接触的时候,还是大学,那时用这个开发打飞机游戏纯粹是娱乐.现在基本 ...
随机推荐
- u-boot中的Makefile
在windos下,pc机上电之后,BIOS会初始化硬件配置,为内核传递参数,引导操作系统启动,并且识别C盘.D盘.等整个操作系统启动起来之后,才可以运行应用程序比如QQ.QQ音影.同理,在嵌入式Lin ...
- 解决uc浏览器不支持vw单位的方法
插入下段代码,使用rem来代替vw <script type="text/javascript"> (function (doc, win) { var docEl = ...
- LightOJ - 1010 Knights in Chessboard(规律)
题目链接:https://vjudge.net/contest/28079#problem/B 题目大意:给你一个nxm的棋盘,问你最多可以放几个骑士让他们互相攻击不到.骑士攻击方式如下图: 解题思路 ...
- php正则匹配以“abc”开头且不能以“xyz”结尾的字符串
本文介绍下,用php正则区配以"abc"开头的,且不能以"xyz"结尾的字符串的方法,有需要的朋友参考下. 要求:用php正则表达式匹配以“abc”开头,但结尾 ...
- scrollview 滚动布局
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layou ...
- Web前端开发最佳实践(5):正确闭合HTML标签,停止使用不标准的标签和属性
正确闭合HTML标签 HTML元素的内容模型定义了元素的结构,表明元素可以包含哪些内容以及元素可以有哪些属性.元素可以包含的内容包括其他元素和字符,但是也有一些元素是空元素,即不能包含任何内容,这些元 ...
- CentOS7.5 firefox Flash插件更新
CentOS7自带的firefox没有flash插件,所以是没有办法在网页上看视频的,需要自己手动安装 1.下载 打开flash官网https://get.adobe.com/flashplayer/ ...
- CentOS7.6安装screenfetch
方法1:yum install -y gitcd /usr/local/srcgit clone https://github.com/KittyKatt/screenFetch.gitcp scre ...
- 运行SparkStreaming的NetworkWordCount实例出错:Error connecting to localhost:9999 java.net.ConnectException: Connection refused 解决办法
一.背景 首先按照Spark的官方文档来运行此实例,具体方法参见这里,当运行命令$ nc -lk 9999开启端口后,再运行命令$ ./bin/run-example streaming.Networ ...
- 转:一步一步学ROP之linux_x86篇 - 蒸米
原文地址:http://drops.wooyun.org/tips/6597 0×00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击 ...