前面写过一篇文章是关于最小化窗口到托盘的方法,那只是一个测试用的版本,用来说明实现原理还是可以的,但是在实际的开发过程中可能我们的需求与此有很大的不同。
例如 在程序开始启动的时候,窗体最小化到托盘,而窗体不显示在桌面上。
起初实现了一个版本,但是会出现闪一下的效果,这很不爽,我想肯定是哪里出了问题。实现的方法是在OnPaint()消息处理函数中,加入ShowWindow(SW_HIDE)函数,这很显然不是最好的解决方案,所以继续探索第二种方法。
第二种方法中涉及到了两个关键性的函数:CWnd::MoveWindow()和CWnd::ModifyStyle()
CWnd::MoveWindow()函数用来把窗体消失,但是虽然在桌面上看不见了,但是在最下面的任务栏中仍然可以看见。所以第二个函数CWnd::ModifyStyle()就该发挥作用了,我们用这个函数将窗口的扩展模式增加WS_EX_TOOLWINDOW ,删除WS_EX_APPWINDOW,这样最下面任务栏中就不见了这个窗体了。
具体的思路就是,当你的对话框窗体处理WM_INITDIALOG消息的时候,就开始调用隐藏窗体的函数,这样就不会显示窗体了,而且也没有闪一下的BUG了。当我们想让窗体复原显示的时候,我们在通过上面那两个函数将窗体的位置,显示模式更改回来。
具体的代码如下:
//隐藏窗体
void CTestboxDlg::HideMainDlg(){
GetWindowRect((LPRECT)m_normal);
MoveWindow((LPRECT)m_disapear);
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
}
//显示窗体
void CTestboxDlg::ShowMainDlg(){
CRect r;
GetWindowRect((LPRECT)r);
if (r!=m_normal||!IsWindowVisible())
{
ModifyStyleEx(WS_EX_TOOLWINDOW,WS_EX_APPWINDOW);
MoveWindow((LPRECT)m_normal);
if (IsIconic())
{
ShowWindow(SW_RESTORE);
}
ShowWindow(SW_NORMAL);
}
SetForegroundWindow();
}