处理使用CSplitterWindowImpl移动并使子窗格无效

时间:2013-09-07 20:13:15

标签: c++ windows wtl

当分割器在WTL中移动时,我需要使两个窗格无效。目前其中一个在分离器移动时无效,而另一个在分离器移动停止时无效。 如何处理分离器移动?

1 个答案:

答案 0 :(得分:1)

您通常不需要显式无效,因为拆分器会移动子窗口,并且会收到WM_SIZE等常规消息,从而导致UI更新。问题本身表明儿童窗户的某些内容是不正确的。

您当然可以覆盖拆分器的UpdateWindow来处理拆分器重新定位的结束,但通常不需要这样做。拆分器本身无效自身将SetWindowPos应用于其帮助器UpdateSplitterLayout方法中的窗格,您可以使用调试器逐步执行以确保正在执行此代码。

LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    // [...]
            if(m_bFullDrag)
            {
                if(pT->SetSplitterPos(xyNewSplitPos, true))
                    pT->UpdateWindow();

bool SetSplitterPos(int xyPos = -1, bool bUpdate = true)
{
    // [...]
        UpdateSplitterLayout();

void UpdateSplitterLayout()
{
    // [...]
        for(int nPane = 0; nPane < m_nPanesCount; nPane++)
        {
            // [...]
                    ::SetWindowPos(m_hWndPane[nPane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);

您可能希望确保m_bFullDrag设置为TRUE,以便在移动过程中强制重新绘制。