Windows MFC 全局模态 实现 (二)

上一篇 Windows MFC 全局模态 实现 介绍了一下第一种方法,但是这个方法有个问题是,即使在对话框外不能点击,框外点击鼠标,当前需要操作的窗口也是失去了焦点的。这样用户体验影响比较严重。而且还有个问题是,如果要适配32位、64位系统,要达到全局模态(禁止鼠标效果)需要32、64位两种库,而且要分别被32、64位系统调用。使用条件限制比较严格。

所以这里记录一下使用透明窗口的实现方法:

1、工程中插入一个对话框

2、设置对话框属性 去掉Title bar的勾

3、增加一个OnInitDialog函数,在这个函数里实现后续调用

4、在OnInitDialog内增加设置对话框全屏

<span style="white-space:pre">	</span>CRect m_FullScreenRect;
	int nFullWidth=GetSystemMetrics(SM_CXSCREEN);
	int nFullHeight=GetSystemMetrics(SM_CYSCREEN);

	m_FullScreenRect.left = 0;
	m_FullScreenRect.top = 0;
	m_FullScreenRect.right = m_FullScreenRect.left + nFullWidth;
	m_FullScreenRect.bottom = m_FullScreenRect.top + nFullHeight;

	MoveWindow(0,0,m_FullScreenRect.Width(),m_FullScreenRect.Height(),1);

5、在OnInitDialog内增加设置对话框透明

<span style="white-space:pre">	</span>typedef BOOL (WINAPI *lpfnSetLayeredWindowAttributes)(HWND hWnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags);
	lpfnSetLayeredWindowAttributes SetLayeredWindowAttributes;

	//设置成边缘透明

	COLORREF maskColor=RGB(0,0,0);

	HMODULE hUser32 = GetModuleHandle(TEXT("user32.dll")); //加载动态链接库
	SetLayeredWindowAttributes = (lpfnSetLayeredWindowAttributes)GetProcAddress(hUser32,"SetLayeredWindowAttributes");

	//取得SetLayeredWindowAttributes函数指针
	//为窗口加入WS_EX_LAYERED扩展属性
	SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE)^WS_EX_LAYERED);

	//调用SetLayeredWinowAttributes函数
	SetLayeredWindowAttributes(this->GetSafeHwnd(), maskColor, 1, LWA_ALPHA); // 至少要设置为1透明度,0表示不存在该对话框

	FreeLibrary(hUser32);   //释放动态链接库

6、在需要模态的对话框的原父窗口调用透明全屏框的DoModal

7、在透明全屏框的OnInitDialog最后增加线程调用需要模态的对话框的DoModal。使用线程调用的原因是为了防止阻塞正常弹出全屏透明框

8、在线程调用需要模态框的DoModal之后,增加透明框的退出代码

over

工程源码

这种方法最需要改善的地方是对话框的封装:假设有多个需要全局模态的对话框,直接继承某个类,就自动成了具有全局模态特性的对话框,而不需要每个对话框单独写代码弄一次。

时间: 2024-08-09 06:34:27

Windows MFC 全局模态 实现 (二)的相关文章

Windows MFC 全局模态 实现

windows本身没有提供针对整个桌面全局模态对话框的实现方式,需要自己实现. 两种方法: 1.弹出一个全屏幕透明的对话框,再在它的基础上弹出模态框 2.当鼠标在弹出框外时,禁用键盘.鼠标所有功能 第一种不好的是可能有闪一下的效果,影响体验:而且还要让修改密码框在它上面,还要考虑到这个窗口的释放. 第二种相对来说较方便,但是需要多一个动态库来实现全局钩子. 笔者只实现了第二种方法. 实现方法: // 用此函数判断是否在内,以决定是否使能鼠标 BOOL CMFC_MouseMoveTest2Dlg

MFC中模态对话框和非模态对话框

MFC的对话框非为两种,一种叫模态对话框(Modal  Dialog  Box,又叫做模式对话框),一种叫做非模式对话框(Modaless Dialog Box,又叫无模式对话框).两者的区别在于当对话框打开的时候,是否允许用户进行其他对象的操作. 一.模态对话框 模态对话框指,当用户需要对该对话框之外的其他对话框或者模块进行操作时,必须该对话框关闭,才能去编辑其他对话框或者模块. 创建如下: //创建模态对话框 CModalDialog modalDialog; modalDialog.DoM

mfc非模态对话框

按照我们的之前的做法,先新建工程. 把基本的内容都添加上. 形成这样一个样子: 并且进行试运行,让程序能够完成加法运算. 值的注意的是,静态文本那里要改一下名字,否则无法将成员变量进行添加. 前期准备: 然后就可以开始做我们的非模态对话框了. 一.创建这样一个对话框 到资源视图下面的,找到Dialog右击,出现下拉菜单.点击插入Dialog. 这步,应该都很熟练,先拖动两个按钮(否则可能会发生问题),然后稍微调整对话框的大小,最后添加一个静态文本.输入一些文字. 二.右键当前对话框,然后找到添加

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

全局模态框组件实现

一.项目目录如下: 二.向model组封装一个模态框:Modal.vue <template> <div> <!-- 定义全局模态框 --> <div class="md-modal modal-msg md-modal-transition md-show" v-bind:class="{'md-show':mdShow}"> <div class="md-modal-inner">

MFC中模态对话框和非模态对话框的区别

在MFC中有模态对话框和非模态对话框,那这两种有什么区别呢.又都是用于什么场合呢. 首先,要弄清楚2种对话框是如何创建的. 然后要弄清楚2种对话框有什么区别,可能从表面上看,模态会阻塞主对话框,可原理是什么呢. 还有就是,当有模态和非模态对话框没有关闭的时候,在任务栏中,关闭主窗体,会有什么样的效果呢. 虽然,现在有很多优秀的开源库比如QT,DUI等,但是这些原理,我们还是要了解的,不能停留在用的层面.有人说MFC过时了,有人说,现在有很多开源库,知道怎么用就可以了.但是现在界面要的交互好,界面

(原)IOS之Metro实现,拥有windows磁帖效果(二 设计思路)

(原)IOS之Metro实现,拥有windows磁帖效果(二 设计思路) 在上一篇博客(IOS之Metro实现,拥有windows磁帖效果(一 动画效果的实现)中主要阐述了动画内容.这篇主要阐述功能的设计. 所有转出博客园,请您注明原文出处:http://www.cnblogs.com/xiaobajiu/p/4106663.html 考虑到metro控件的功能主要属性如下: 1.提供当前是否正在动画的属性.当metro正在动画的时候我们可以选择性的不去响应一些事件. 2.提供当前是否在动画事件

再谈MFC学习——模态对话框的数据传递

学习c++的目的就是为了使用封装好的类,而最最经典的封装类当然是微软的MFC窗口程序类.学习MFC编程之前要学习c++的主要知识,掌握c++的基本编程思想.下面就看下我学习的MFC模态对话框的数据传递. 首先,什么叫做模态对话框呢?模态对话框指的是当弹出这样的对话框的时候,程序不能相应除了此对话框外其他的窗口的响应,直到关闭了这个对话框,程序才能响应其他的对话框的响应.非模态对话框即使弹出也能响应程序其他的窗口而不需要等到此窗口的关闭.那么MFC中怎么才能弹出模态对话框呢?其实很简单,首先创建这

Windows/MFC,C++中的TCHAR体系/char体系/WCHAR体系及其相互转换

</pre><pre> Windows/MFC,C++编程中经常遇到UNICODE.ANSI字符串,并需要对这些字符串进行转换,本文对这些体系与其转换进行了总结. 第一篇:基础篇 3大体系常用函数及解析详见博文:http://blog.csdn.net/u010003835/article/details/47344775  此外,接下来我书写的函数以Windows对char*,TCHAR*,const  TCHAR*的命名规则来书写 不熟悉的童鞋可以参考博文: http://bl