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

Handle moving with CSplitterWindowImpl and invalidate child panes

本文关键字:无效 CSplitterWindowImpl 处理 移动 使用      更新时间:2023-10-16

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

通常不需要显式失效,因为拆分器会移动子窗口,并且它们会收到导致 UI 更新的常规消息WM_SIZE。问题本身表明子窗口的某些内容不正确。

您当然可以覆盖拆分器的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,以便在移动过程中强制重绘。