Duilib 父窗口无效化和消息传递

当使用duillib界面库时,我们往往需要建立多个窗口,子窗口和父窗口之间有一定的逻辑需要,比如当子窗口弹出时,让父窗口无法处理父窗口内的控件的消息,即将父窗口无效化,直到子窗口关闭再恢复。

建立多个窗口,我们可以定义多个窗口类来一一对应。我建立窗口类的时候继承的是duilib库里面封装的窗口类WindowImpBase。重载父类里的消息处理函数,就可以实现对消息的过滤。

     virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam);//消息处理函数

在建立子窗口的前面将父窗口无效化,然后在子窗口的WM_CLOSE消息处理中使父窗口还原,并获得焦点。代码如下:

     ::EnableWindow(m_hwnd , false);    //父窗口无效化
     CMyChildWND * pChildWindow = new CMyChildWND;     //建立子窗口 m_hwnd 为父窗口句柄
     pChildWindow->Create(m_hwnd , Null ,  UI_WNDSTYLE_DIALOG , Null);
     pChildWindow->CentrWindow();
     PChildWindow->ShowWindow();
     LRESULT HandleMessage(uMsg,  wParam, lParam)//子窗口消息处理
     {
         if(uMsg == WM_CLOSE)
         {
             ::EnableWindow(::GetParent(m_hwnd) , TRUE);  // 父窗口还原 m_hwnd为子窗口句柄
             ::SetFocus(::GetParent(m_hwnd));//设置焦点到父窗口return CWindowImpBase::HandleMessage(uMsg,  wParam, lParam);
    }     

这样就实现了父窗口的无效化,还可以给用户一点反馈。

这里我设计的是在父窗口的总布局内添加一个Control控件,让他覆盖整个父窗口,初始化为不可见,背景颜色设置为半透明的黑色。当父窗口无效化后,将Control控件设为可见,这样父窗口变灰,告诉用户父窗口不可用,还原后再设为不可见,这样就实现了一个父窗口无效化的反馈。这里就没写代码了,因为很简单就能实现。

你可能感兴趣的:(界面,duillib,父窗口无效化,界面反馈)