• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

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

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);
}
}
是不行的,虽然窗口的确不显示了(闪都不闪一下),但把鼠标移动到对话上面的按钮、编辑框等控件上时(或点一下,注意我是指移动到按钮等控件的位置上,因为控件是看不见的,所以要多试几次才能找到),这个时候控件会显示出来,最后的效果就是屏幕上出现一堆看起来没有容器包装的按钮、编辑框等(就是一堆按钮挂在屏幕上,看不到主窗口,让不懂人感觉是被黑了)。

申明一下,不确定者请先自己试试,不要盲目自信,我要的效果是不闪。
...全文
583 点赞 收藏 56
写回复
56 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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();
}
}
保证一点都不闪
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-12-06 11:26
社区公告

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