如何使一个对话框程序不显示(闪一下也不行)?

yangl79 2004-12-06 11:26:05
如题。
注意:网上有一种自认为不错的解决方法是这样的:
把对话框属性的visible属性去掉,然后重载WM_SHOWWINDOW消息,如下:
void CTestDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
if( GetStyle() & WS_VISIBLE )
CDialog::OnShowWindow(bShow, nStatus);
else
{
long Style = ::GetWindowLong(*this, GWL_STYLE);
::SetWindowLong(*this, GWL_STYLE, Style | WS_VISIBLE);
CDialog::OnShowWindow(SW_HIDE, nStatus);
}
}
是不行的,虽然窗口的确不显示了(闪都不闪一下),但把鼠标移动到对话上面的按钮、编辑框等控件上时(或点一下,注意我是指移动到按钮等控件的位置上,因为控件是看不见的,所以要多试几次才能找到),这个时候控件会显示出来,最后的效果就是屏幕上出现一堆看起来没有容器包装的按钮、编辑框等(就是一堆按钮挂在屏幕上,看不到主窗口,让不懂人感觉是被黑了)。

申明一下,不确定者请先自己试试,不要盲目自信,我要的效果是不闪。
...全文
729 56 打赏 收藏 转发到动态 举报
写回复
用AI写文章
56 条回复
切换为时间正序
请发表友善的回复…
发表回复
echoxue 2004-12-11
  • 打赏
  • 举报
回复
study after
UDX协议 2004-12-11
  • 打赏
  • 举报
回复
http://www.vczx.com/forum/showthread.php?s=&threadid=2097
ayanamiwww 2004-12-11
  • 打赏
  • 举报
回复
mark
yangl79 2004-12-10
  • 打赏
  • 举报
回复
你的当然不行了,楼上几乎所有人的都能达到你的那种效果,好多还比你的好。
你的程序一运行,以前的活动窗口变成了非活动窗口,而且自己不会变回来,瞎子都看出来了。
luolovegui 2004-12-10
  • 打赏
  • 举报
回复
发给你了,你收一下。决对可以运行。
dandycheung 2004-12-10
  • 打赏
  • 举报
回复
既然这样,我再多说几句。我们知道,MFC 中所有的对话框其实都是按照非模态对话框来创建的,模态对话框是用非模态对话框模拟实现的。换一句话说,MFC 中的所有对话框(文件、打印等对话框除外)都是用 CreateDialogIndirectParam 这一 API 来创建的,我们自己定义的回调在次函数返回之前只会得到一个 WM_INITDIALOG 消息,而该函数在我们处理完该消息之后,即将退出之前,会检查对话框的 WS_VISIBLE 属性,如果该属性不存在,则要强制显示对话框并更新之。我们无法阻止这个操作,所以你的目的很难达到。
luolovegui 2004-12-10
  • 打赏
  • 举报
回复
我的也不行吗?我这里没有一点问题,我说了我的程序第一次运行时要勾上“选上下次运行时不显示”的选项,下次运行的时候程序会照配置而不会显示,不知道我的问题在哪??

你的目的不会是收集别人写的代码吧!!!
yangl79 2004-12-10
  • 打赏
  • 举报
回复
楼上又有三位任兄给出了代码,但似乎成功的可能性不大,我相信你们的做法可以使窗口绝对的不显示,但你们能保证在运行程序的时候,原来的活动窗口也绝对的不受影响吗?如果做不到后一点,那么不是我的要求,而且前面已很多人给过代码,已经做到了第一点,只是做不到第二点。
smdt 2004-12-10
  • 打赏
  • 举报
回复
为什么我不能发问?
whwjn 2004-12-10
  • 打赏
  • 举报
回复
1. 如何有效地使初始窗口不显示
当我们想让窗口初始时不显示时,通常会用ShowWindow(SW_HIDE) ,但实际上还是在启动是可以看到窗口一闪而过的痕迹。所以,可以使用下面的方法来实现它:
(1.1)先在构造函数中设置布乐变量 visible值为false.

visible = false;
(1.2)重载 WM_WINDOWPOSCHANGING,并添加下面代码:void CTest_deleteDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
if(!visible)
lpwndpos->flags &= ~SWP_SHOWWINDOW;

CDialog::OnWindowPosChanging(lpwndpos);
}

(1.3)然后设布尔visible变量值为true,并在要显示窗口时,再用ShowWindow(SW_SHOW)既可。visible = true;
ShowWindow(SW_SHOW);

yangl79 2004-12-09
  • 打赏
  • 举报
回复
to luolovegui(我现在开始学英语:so I write english)
能把你做的发到我的邮箱里吗?你上面的程序根本运行不了,全是断言错。
我的邮箱是mail2tao@163.com 请复制,以免出错。
goodboyaxj 2004-12-09
  • 打赏
  • 举报
回复
学习
hyamw 2004-12-09
  • 打赏
  • 举报
回复
不好意思
我的是p4的机器,看不到闪动 :(
dandycheung 2004-12-09
  • 打赏
  • 举报
回复
sorry, flag 应该为 pwp->flags
dandycheung 2004-12-09
  • 打赏
  • 举报
回复
终极解决办法:

CXXXDlg::OnWindowPosChanging(WINDOWPOS FAR* pwp)
{
if(pwp->flags & SWP_SHOWWINDOW)
flag &= ~SWP_SHOWWINDOW;

CDialog::OnWindowPosChanging(pwp);
}
yangl79 2004-12-09
  • 打赏
  • 举报
回复
to aoosang(智慧的鱼)
你的方法可以肯定会闪(程序运行前的活动窗口会闪)!

楼上所有人的方法,其实本质上是一样的,也就是处理时间太晚了,系统已经准备要绘制窗口了(此时原来活动窗口已变成非活动)才告诉系统不要绘制,为时已晚!这正是这个问题的难度所在!
yangl79 2004-12-09
  • 打赏
  • 举报
回复
首先谢谢 hyamw(林锋) 的热心回复!
不过你的程序有点小问题:
一:应该重载OnCancel函数,并且写入:
PostMessage(WM_QUIT, 0, 0);
CDialog::OnCancel();
DestroyWindow();
否则程序无法点取消键结束(用ctrl+alt+del可以看到进程)。

二:似乎不应该用EndDialog函数。

当然这些都是小问题,不是本质的。

本质的问题你的程序还是存在:
一:会闪,我是指运行程序之前的活动窗口会闪!
二:桌面上的任务栏会有显示,效果就是先显示最小化后的程序,再消失(当然,这在速度快的电脑上几乎看不出来)。

我想大家不应该只在表面上去解决这个问题,无模式和有模式是没有本质差别的(无模式只是不启动消息循环而已),我一楼提到的那位高手,解决这个问题已深入到了MFC源码,他得到的结果可以达到完全的不闪,包括运行前的活动窗口也不受影响,只是出现了另外一些问题。
yangl79 2004-12-09
  • 打赏
  • 举报
回复
aoosang(智慧的鱼)
谢谢你的回复,你这种方法我知道,但没亲自试,作者说有点缺陷就是原来的活动窗口会闪动两下,最终还是活动窗口,他认为算是效果较好的了。

其它人的回复我试试先!
handsomepine 2004-12-09
  • 打赏
  • 举报
回复
给我也发一个,handsomepine@tom.com 谢谢!
aoosang 2004-12-09
  • 打赏
  • 举报
回复
没有楼上的说得那么复杂
给楼主提供一个简单的方法,
重载一下WM_NCPAINT消息,这个消息一般在画对话框的边框之前发送,下面是消息的实现函数
void CClientDlg::OnNcPaint()
{
static int i = 1;
if(i > 0)
{
i --;
ShowWindow(SW_HIDE);
}
else
{
CDialog::OnNcPaint();
}
}
保证一点都不闪
加载更多回复(36)
代码转载自:https://pan.quark.cn/s/2af55a97eb0f **INA226测试程序参考** 在电子工程和嵌入式系统开发领域,INA226被认为是一款高精度且低功耗的电流与电源监控器,其应用范围广泛,涵盖电池管理系统、电源路径管理以及智能能源监测等多个方面。该芯片由德州仪器(Texas Instruments)负责生产,能够提供精确的电流和电压测量结果,并具备灵活的配置选择。 **INA226芯片功能详解** INA226的核心特性包括: 1. **双向电流测量**:能够测量流经设备的正向电流和反向电流。 2. **高压和低压测量**:支持高达60V的电压测量,同时可以测量从微安到安培范围内的电流。 3. **内置模拟电路**:集成了一个精密运算放大器、一个电流检测放大器以及一个高精度电压基准。 4. **I2C接口**:通过标准的I2C接口与微控制器进行通信,便于读取测量数据。 5. **多种配置模式**:允许选择不同的电流和电压范围,以适应不同应用场景的需求。 6. **低功耗**:在待机状态下,功耗非常低,适合用于电池供电的设备。 **平台IO与ESP8266开发环境** `PlatformIO`是一个开源的跨平台集成开发环境,专注于物联网(IoT)项目的开发。它整合了构建系统、库管理和设备支持,显著简化了嵌入式开发流程。`ESP8266`是由乐鑫科技推出的一款低成本且高性能的Wi-Fi微控制器,常用于智能家居和物联网领域。 在`PlatformIO`中配置和编写针对`ESP8266`的INA226测试程序,需要遵循以下步骤: 1. **安装PlatformIO**:在IDE(例如Visual Studio Code、Atom等...
已经博主授权,源码转载自 https://pan.quark.cn/s/6b24333d46cf 这里所说的激光扫描测距仪的实质就是3D激光雷达。 如上面视频中展现的那样,扫描仪可 以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像 是由很多小点组成的云团,因此常被称之为:点云(PointClould)。 在获得扫描的点云后,可以在计算机中重现扫描物体/场景的三维信息。 自制激光3D扫描仪的知识点涵盖了多个方面,包括激光雷达的基本概念、激光扫描测距的原理、以及如何低成本实现3D激光扫描。 以下是对这些知识点的详细阐述。 激光雷达是一种通过激光测距获取物体表面信息的设备。 它通常用于机器人导航、3D模型重建和地图测绘等领域。 激光雷达能够获取目标物体在各个转角情况下的扫描截面到扫描仪的距离,并将这些数据可视化成点云(Point Cloud)。 点云是由大量小点组成的三维数据模型,这些小点模拟了物体或场景的三维结构。 在制造激光3D扫描仪时,需要考虑的关键原理包括激光三角测距原理和线状激光进行截面测距的原理。 激光三角测距原理是指通过测量发射激光与反射激光之间的角度差异来确定距离。 而线状激光进行截面测距原理则是指将点状激光改变成线型光束,一次性获得整个扫描截面的数据。 市面上的激光雷达产品价格昂贵,主要因素包括使用高速光学振镜进行大角度扫描、通过计算发射/反射激光束相位差的测距手段、以及矫正算法和人工成本。 但个人DIY自制激光雷达时,可以通过降低对精度和性能的要求来大幅降低成本。 例如,使用三角测距方式替代成本较高的TOF测距方式,或者使用普通电机机构驱动激光器来替代高速振镜。 自制激光3D扫描仪的实现,可以考虑制作一个能够测量一个点的设备,并采用类似的三角测距...

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧