当使用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控件设为可见,这样父窗口变灰,告诉用户父窗口不可用,还原后再设为不可见,这样就实现了一个父窗口无效化的反馈。这里就没写代码了,因为很简单就能实现。