Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1073530
  • 博文数量: 77
  • 博客积分: 11498
  • 博客等级: 上将
  • 技术积分: 1840
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 11:10
文章分类

全部博文(77)

文章存档

2011年(1)

2010年(16)

2009年(5)

2008年(55)

分类: C/C++

2008-05-21 00:41:18


    本文简单介绍一下VC中基于对话框的程序启动后的自动隐藏技术。
    作者:tyc611.cublog.cn,2008-05-21
    有的程序需要在启动后立即隐藏主窗口,只在系统托盘区域显示一个图标,这常见于很多后台服务程序。对于基于对话框的程序,要实现此功能需要一点技巧。
 
    该技术的关键点在于,需要使用非模态对话框,而不是默认的模态对话框。模态对话框的DoModal()事实上执行了对话框的创建、显示、消息循环等一系列过程。我们这里要做的就是把这个过程重现,并控制中间的显示过程来达到我们隐藏主窗口的目的。现实起来非常简单,我们只需要把CXXXApp中的InitInstance()函数中默认的对话框显示代码:
 

BOOL CXXXApp::InitInstance()
{
    // ... 其它代码

    // 主窗口对话框实例
    CXXXDlg dlg;
    m_pMainWnd = &dlg;

    // 模态对话框
    dlg.DoModal();

    return FALSE;
}

 
改变为如下代码即可,其它地方的代码完全不用修改:
 

BOOL CXXXApp::InitInstance()
{
    // ... 其它代码

    // 主窗口对话框实例
    CXXXDlg dlg;
    m_pMainWnd = &dlg;

    // 非模态对话框
    dlg.Create(CXXXDlg::IDD);
    dlg.DoSomethingBeforeMsgLoop(); // 可以在此函数隐藏窗口及执行其它操作
    dlg.RunModalLoop();

    return FALSE;
}

在上面的代码中,可以在DoSomethingBeforeMsgLoop()函数中使用ShowWindow()来隐藏窗口,同时还可以执行其它一些操作,也可以直接在DoSomethingBeforeMsgLoop()函数调用处调用ShowWindow()函数来隐藏窗口。

    也有人提出了其它方法。比如仍然使用模态对话框,但使用计数器设定很短一个时间来触发事件,并在处理该计数器事件中隐藏窗口。该方法可行,但太麻烦,没有上面的方法方便。


阅读(2387) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-04-18 12:40:32

dlg.Create(CXXXDlg::IDD); dlg.DoSomethingBeforeMsgLoop(); // 可以在此函数隐藏窗口及执行其它操作 dlg.RunModalLoop(); dlg.DestroyWindow 应该还要加上 dlg.DestroyWindow,不然dlg接受不到WM_DESTROY消息