使用VC编程,如何在运行程序时,可以隐藏主窗体

xrbeck 2004-08-26 03:48:40
使用VC编程,如何在运行程序时,可以隐藏主窗体?
...全文
456 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
重载 OnNcPaint() 是我最常用和效果最好的办法(不知你是否重载正确)。
如果要得到更好的效果,可以在 C***App 类的 InitInstance()函数中将对话框的创建方式
改一下。

C***Dlg* pDlg = new C***Dlg;
m_pMainWnd = pDlg;
return pDlg->Create(C***Dlg::IDD);

需要注意的是,改动后要在对话框的 PreTranslateMessage()函数中处理“回车”和“Esc”
的响应,并在 OnSysCommand() 中处理“关闭”按钮的响应。另外,如果你使用了 IDOK 和
IDCANCEL 按钮,其响应函数都要重新处理。即使用 DestroyWindow() 函数退出。OnDestroy
中的内容也要移至 OnDestroyWindow() 中。
xrbeck 2004-09-01
  • 打赏
  • 举报
回复
HI,怎么回事啊..
888atao 2004-09-01
  • 打赏
  • 举报
回复
搞什么
为什么要把它给隐藏呢?

如果真想在一开始就不显示
在任务栏里也没有

可能把程序的代码写在CWinApp::InitInstance()里
然后RETURN FALSE
不管后面有什么就可以了
bm1408 2004-09-01
  • 打赏
  • 举报
回复
可以说因为你用了MFC,所以这个功能达不到!
MFC在程序在开始的时候,是隐藏不掉的!

只能用API来写了!
xrbeck 2004-08-31
  • 打赏
  • 举报
回复
不行啊,兄弟们,用ShowWindow的方法会闪一下dialog,用PreCreateWindow的方法根本就不行啊。我用的是dialog。不是doc/view
  • 打赏
  • 举报
回复
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style =WS_POPUP;//使主窗口不可见
cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}

http://community.csdn.net/Expert/topic/3311/3311980.xml?temp=7.381839E-02
  • 打赏
  • 举报
回复
有很多应用程序要求一起动就隐藏起来,这些程序多作为后台程序运行,希望不影响其他窗口,往往只在托盘区显示一个图标。这些程序通常都是对话框程序,而对话框在初始化的过程上与SDI、MDI的初始化是不同的,对话框只需要DoModule或者是CreateDialog等等对话框函数调用一次便可,SDI、MDI则要好几步才行。这样看来,对话框在使用方法上面是隐藏了不少细节的,其中就没有SDI、MDI所要求的ShowWindow(nCmdShow)这一步。因此对话框要想一运行就隐藏,并不是很直接的。有一些方法可以做到这一点,下面我们就来看看几种方案。

1.定时器
最直观,又是最无奈的一个方法就是使用定时器。既然我们在对话框开始显示之前不能用ShowWindow(SW_HIDE)将其隐藏,那就给一个时间让它显示,完了我们在隐藏它。

方法:

1.在OnInitDialog()函数里设置定时器:(WINDOWS API里面响应消息WM_INITDIALOG)

SetTimer(1, 1, NULL);

2.添加处理WM_TIMER的消息处理函数OnTimer,添加代码:

if(nIDEvent == 1)

{

DeleteTimer(1);

ShowWindow(SW_HIDE);

}

这种方法的缺点是显而易见的,使用定时器,使得程序的稳定性似乎打一个折扣;窗口是要先显示出来的,那么效果就是窗口闪了一下消失。

2.改变对话框显示状况
在对话框初始化时改变其显示属性可以让它隐藏起来。方法是调用SetWindowPlacement函数:


BOOL CDialogExDlg::OnInitDialog()

{

CDialog::OnInitDialog();

//DO something


WINDOWPLACEMENT wp;

wp.length=sizeof(WINDOWPLACEMENT);

wp.flags=WPF_RESTORETOMAXIMIZED;

wp.showCmd=SW_HIDE;

SetWindowPlacement(&wp);

return TRUE;

}

 

在需要显示时(通常是响应热键或者托盘图标的鼠标消息):


WINDOWPLACEMENT wp;

wp.length=sizeof(WINDOWPLACEMENT);

wp.flags=WPF_RESTORETOMAXIMIZED;

wp.showCmd=SW_SHOW;

SetWindowPlacement(&wp);


这样的效果很不理想:窗口显示在屏幕的左上角,并且是只有标题栏,要正常显示,还需加上如下代码:

定义一个成员变量CRect rect;

在OnInitDialog()里面:

GetWindowRect(&rect);

在需要显示的地方:

SetWindowPos(&wndNoTopMost, wndRc.left, wndRc.top, wndRc.right, wndRc.bottom, SWP_SHOWWINDOW);

CenterWindow();

即使这样,效果还是很差。

这种方法还有一个弊端是当程序开始运行并且隐藏起来后,原来激活的窗口变成了非激活状态了,而当对话框显示出来后,对话框自身也是非激活状态的。


3.不绘制窗口
当对话框显示时将要响应消息WM_PAINT绘制客户区,相应消息WM_NCPAINT绘制窗口边框。我们在窗口第一次自绘自身时隐藏窗口,可以收到比较良好的效果。由于窗口是先画窗口边框,所以我们仅需处理WM_NCPAINT即可。代码如下:

添加WM_NCPAINT处理函数。

void CMyDialog::OnNcPaint()

{

static int i = 2;

if(i > 0)

{

i --;

ShowWindow(SW_HIDE);

}

else

CDialog::OnNcPaint();

}

这里有个问题:为什么要定义静态变量i而且设其值为2呢?

我们只要窗口隐藏第一次,所以定义这个变量可以判断是否时首次显示窗口。当程序开始运行时,系统发送(SendMessage)WM_NCPAINT消息,此时程序的窗口边框应该被显示,但是此时我们没有作任何显示的操作,而是将窗口隐藏,ShowWindow(SW_HIDE)将把窗口的WS_VISIBLE属性去掉,继续执行,程序将检查WS_VISIBLE属性,如果没有则显示窗口,所以又发送了一个WM_NCPAINT消息。所以我们要处理两次WM_NCPAINT消息。

在需要窗口显示时,调用ShowWindow(SW_SHOW)即可。

程序执行的结果是,原来处于激活状态的窗口可能会闪动两下,然后仍然处于激活状态。这种处理方式比上面的方式要优越得多。


4.将对话框作为子窗口
这种方法是采用SDI框架,主窗口始终隐藏,对话框作为主窗口的成员变量,在CMainFrame::OnCreate()里面加入下代码:

if(!dlg.Create(IDD_MYDIALOG, this))

{

return –1;

}

dlg.ShowWindow(SW_HIDE);

在要显示对话框的地方用dlg.ShowWindow(SW_SHOW);即可。注意,主窗口一定要隐藏,否则对话框可能会闪现一下。

隐藏状态栏窗口
上面介绍了几种检查对话框的方法,大家如果试过的话可能已经注意到系统状态栏里在程序启动时会有程序的图标闪过,在隐藏对话框的时候这个也是要隐藏的,方法很简单:

在OnInitDialog()函数里面加上ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);即可。在要显示窗口的地方加上代码ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);即将窗口的扩展样式改回来。
Kudeet 2004-08-30
  • 打赏
  • 举报
回复
WM_WINDOWPOSCHANGING事件

你把类向导的最后一想class info 的左下的message filter改为windows应该可以看到
zhaogaojian 2004-08-30
  • 打赏
  • 举报
回复
主要运用SetWindowPos隐藏对话框
http://dev.csdn.net/Develop/article/11/11634.shtm
xrbeck 2004-08-30
  • 打赏
  • 举报
回复
我是放在一个对话框里啊,最简单的那种,就是放在OnInitDialog里,不行啊..
martingod 2004-08-30
  • 打赏
  • 举报
回复
你是对话框的还是多文档或者是单文档??不同的情况显然是需要不同的方法的
Mr-Chen 2004-08-30
  • 打赏
  • 举报
回复

这个绝对没问题
AfxGetMainWnd()->ShowWindow(SW_HIDE);
oyljerry 2004-08-30
  • 打赏
  • 举报
回复
把ShowWindow(SW_HIDE)放到初始化函数里,就可以实现了啊
lzzqqq 2004-08-30
  • 打赏
  • 举报
回复
在对话框的OnInitDlg函数里
ShowWindow(SW_HIDE);
就OK了.
hiiiiiijiang 2004-08-30
  • 打赏
  • 举报
回复
你放在Init函数里面当然可以啊,为什么不可以,你是不是放到别的窗口了?
xrbeck 2004-08-30
  • 打赏
  • 举报
回复
不行啊.我把ShowWindow(SW_HIDE);放在OnShowWindow里不行啊..放在Init函数里也不行..
WM_WINDOWPOSCHANGING事件我怎么没找到。
auly403 2004-08-30
  • 打赏
  • 举报
回复
ShowWindow(SW_HIDE);
gflpower 2004-08-30
  • 打赏
  • 举报
回复

CBursh br;

HBRUSH h_b = (HBURSH) br;
gflpower 2004-08-30
  • 打赏
  • 举报
回复
ShowWindow(SW_HIDE);


Kudeet 2004-08-30
  • 打赏
  • 举报
回复
1
重载对话框的WM_WINDOWPOSCHANGING消息
void C*****Dlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CDialog::OnWindowPosChanging(lpwndpos);
lpwndpos->flags&=~SWP_SHOWWINDOW;
}
就不会出现对话框了
2
SetWindowPos(wndNoTopMost,0,0,0,0,SWP_HIDEWINDOW);
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
3
AfxGetMainApp()->ShowWindow(SW_HIDE);
上面看那种是你要的效果
加载更多回复(5)

16,548

社区成员

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

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

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