分享

在MFC中隐藏对话框 - 风向标的日志 - 网易博客

 丫头暴抱 2010-08-11
由于基于dialog的mfc程序在启动时要比sdi/mdi的诡异一点。。所以在OnInitDialog是我设置ShowWindow(SW_HIDE);无效。。google了一下。。发现可以用定时器解决。。目前也采用这个方法。。

1. 在OnInitDialog中setTimer;
    SetTimer(1 , 55 , NULL); // 第一个参数是id..等下onTimer要用到;
                                      // 第二个参数是间隔时间,单位毫秒。。;
2. 添加WM_TIMER消息宏;
    BEGIN_MESSAGE_MAP(CDesktopDlg, CDialog)
        ........
        ON_WM_TIMER()   // 其他的我拿掉了。。这个添加到这个位置。。
    END_MESSAGE_MAP()
3. 添加响应事件;
// .h
1protected:
2    .
3    afx_msg void OnTimer(UINT nIDEvent);   // 声明

// .cpp

1void CDesktopDlg::OnTimer(UINT nIDEvent)  
2在MFC中隐藏对话框 - 风向标 - 网事如疯{
3    if (nIDEvent == 1)
4在MFC中隐藏对话框 - 风向标 - 网事如疯    {
5        KillTimer(1);    // 这个貌似应该有DeleteTimer之类的。。不过我没找到。。
6        ShowWindow(SW_HIDE);  // 隐掉它。。
7    }

8}

这里对话框还是会闪一下,然后就隐藏了。

第二种方法:

    第一步,声明一个响应函数afx_msg void OnNcPaint();用于阻止绘制对话框操作。将这个函数放入Dlg类的声明中,作为Dlg类的一个成员。

    第二步,注册消息WM_NCPAINT(),也就是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之间添加ON_WM_NCPAINT()。

    第三步,OnNcPaint函数代码如下:
    void CMyDialog::OnNcPaint()
    {
        static int i = 2;
        if(i > 0)
        {

            i --;
            ShowWindow(SW_HIDE);
        }
        else
            CDialog::OnNcPaint();
    }

    OnNcPaint函数解释:程序的需求是只要窗口在初始运行时隐藏,所以定义static int i = 2;
变量可以判断是否是首次显示窗口。之所以定义为2,是因为当程序开始运行时,系统发送(SendMessage)ON_WM_NCPAINT消息,此时程序的窗口边框应该被显示,但是此时我们没有作任何显示的操作,而是将窗口隐藏,ShowWindow(SW_HIDE)将把窗口的WS_VISIBLE属性去掉,继续执行,程序将检查WS_VISIBLE属性,如果没有则显示窗口,所以又发送了一个ON_WM_NCPAINT消息。所以我们要处理两次ON_WM_NCPAINT消息。其次,也可以定义static int i = 1;如果将i定义为1,则必须把窗口的Visible属性去掉,也就是在窗口上右键点击属性,选择More Styles,将Visible前面的勾去掉。

    有了以上三步就可以实现对话框隐藏,但在程序启动的时候,系统状态栏里会有程序的图标闪一下,这就需要再做一些工作:

    第一,在OnInitDialog()函数中添加ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);使对话框不在系统任务栏中显示。

    第二,在需要对话框显示的程序中添加ModifyStyleEx(WS_EX_TOOLWINDOW, WS_EX_APPWINDOW);使对话框显示在系统任务栏中。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多