Microsoft > Visual Studio 论坛 > Visual C++ > [HLP]MFC窗体运行时自动隐藏的问题~

已答复 [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属性为FALSE


    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年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属性为FALSE


    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日 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

    =,=|||||