[HLP]MFC窗体运行时自动隐藏的问题~
-
2008年7月25日 8:41
RT,在MFC的主Dialog启动时想隐藏它,我首先想到了ShowWindow,然后在dialog的OnInitDialog函数中加了这条,结果发现根本没用……汗。
后来想从源头入手,就找到theApp的CPP文件,在Instance的函数里找到下面的代码:CTimeMythDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
//对话框的代码
}然后将它改成了下面的样子:
CTimeMythDlg dlg;
m_pMainWnd = &dlg;
dlg.Create(IDD_MAIN);
m_pMainWnd->ShowWindow(SW_HIDE);
m_pMainWnd.RunModalLoop();后来发现窗体是可以自动隐藏了,但是,每次隐藏,都会有闪烁一下,所以,不知道怎么解决这个闪烁的问题?
答案
-
2008年8月7日 5:59
汗。我这边切换列表里面不在了。
下面是我所有改动的地方。
App文件中
CHostTestControlDlg dlg;
m_pMainWnd = &dlg;
dlg.Create( IDD_HOSTTESTCONTROL_DIALOG );
m_pMainWnd->ShowWindow(SW_HIDE);
INT_PTR nResponse = m_pMainWnd->RunModalLoop();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
RC中
Dialog的Visible属性为FALSEOnInitDialog中
LockSetForegroundWindow( LSFW_LOCK );
// put the window at the bottom of z-order, so it isn't activated
SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
无其他修改。
全部回复
-
2008年7月26日 2:28版主我以前碰到过, 具体代码我忘记了,
大概是重载一个Window窗口的消息(不是对话框的),
设一个风格就可以完美解决,
我晚上回去找一下. -
2008年7月26日 2:39
嗯,好的,谢谢~!
-
2008年8月4日 1:32版主去掉这句m_pMainWnd.RunModalLoop();
试试
-
2008年8月4日 1:54版主重载WM_WINDOWPOSCHANGING消息, (是windos窗口消息,不是对话框消息)
OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
if(!m_IsVisible)
lpwndpos->flags &= ~SWP_SHOWWINDOW;
}
设一个变量来控制,m_IsVisible,如上, 如果开始是设m_IsVisible为FALSE,则打开时隐藏,并且没有闪烁 -
2008年8月4日 3:08
谢谢你啊,不过MS还是有点问题~
首先我有两个Class,一个是theApp的Class:MyNewApp,另外一个是主Dialog的Class:MyNewDlg。你说是在Windows窗口消息中重载不是在Dialog消息中,我不是很理解这句话。于是我对两个Dialog分别重载。
经过验证,MyNewApp这个无效,重载消息居然都没有被触发- -
于是我直接在Dialog中重载消息。我直接在属性框旁边那个消息框中点击WM_WINDOWPOSCHANGING重载,结果发现Main Dialog的确可以自动隐藏,而且不会闪烁~但是又出了一个比较细微的问题
虽然MainDialog隐藏了,但是它不会自动失去焦点,而这个时候我用ALT+TAB切换的时候,仍然能看到MainDialog在那个切换栏中。但是如果点击其它窗体,在用ALT+TAB,切换栏中就看不到了,于是MainDialog真正意义上的隐藏了- -
不知道是不是我理解有误,所以导致了这样的结果~还希望闲人大哥解答下,谢谢了~
-
2008年8月7日 3:26
在CTimeMythDlg的OnInitDialog()里面用ShowWindow( SW_HIDE )没效果吗? -
2008年8月7日 3:32
嗯,试过了
没有效果……
MFC基本WS这个命令……
-
2008年8月7日 5:20还真是的哦。以前木有注意过。
-
2008年8月7日 5:43搞定。
对窗口的property属性Behavior中的Visible设置成FALSE就不会闪一下了。
至少我这边是这样的。 -
2008年8月7日 5:46
直接在Dialog的属性框里面改Visible?
MS我这里同样没有效果哦
-
2008年8月7日 5:48你原来的代码不变。我这边采用你一样的代码。不过是visible设置成false。
-
2008年8月7日 5:50
最开始的那个代码么?
-
2008年8月7日 5:50实在不行在OnInitDialog里面放
LockSetForegroundWindow( LSFW_LOCK );
// put the window at the bottom of z-order, so it isn't activated
SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); -
2008年8月7日 5:55
嗯,的确可以了
但是这个还有一个和上面闲人给的方法一样的问题,就是运行时,按ALT+TAB仍可以看到Dialog在切换列表中~
但是如果让Dialog失去焦点,比如点下VS,再按ALT+TAB就不会再出现Dialog了~
这个要怎么解决?
-
2008年8月7日 5:59
汗。我这边切换列表里面不在了。
下面是我所有改动的地方。
App文件中
CHostTestControlDlg dlg;
m_pMainWnd = &dlg;
dlg.Create( IDD_HOSTTESTCONTROL_DIALOG );
m_pMainWnd->ShowWindow(SW_HIDE);
INT_PTR nResponse = m_pMainWnd->RunModalLoop();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
RC中
Dialog的Visible属性为FALSEOnInitDialog中
LockSetForegroundWindow( LSFW_LOCK );
// put the window at the bottom of z-order, so it isn't activated
SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0,
SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);
无其他修改。 -
2008年8月7日 6:11
不行耶,我这里按ALT+TAB还是可以看到=,=
-
2008年8月7日 6:13我是VS2008 + Feature Pack. WINXP
-
2008年8月7日 6:16
datablader 写: 我是VS2008 + Feature Pack. WINXP 汗……
我是2k3……SP1 + WinXp+SP3
=,=|||||