如图红色区域是怎么做出来的?mfc

解决方案 »

  1.   

     
    我试着做了一个 
    1:class CTreeCtrlV1 : public CTreeCtrl
    2:class CTreeCtrlV2 : public CTreeCtrl
    3:class CTestPane : public CDockablePane
    然后在CTestPane里定义三个对象
            CTreeCtrlV1 *m_TreeCtrlUp; //类视图 - 上面的TreeCtrl
            CWnd* m_btnTest;             // 分割线
    CTreeCtrlV2 *m_TreeCtrlDown;//类试图 - 下面的TreeCtrl
    在CTestPane的oncreate里
     m_TreeCtrlUp = new CTreeCtrlV1();
    m_TreeCtrlUp->Create(WS_VISIBLE|WS_CHILD|TVS_LINESATROOT|TVS_HASLINES |TVS_HASBUTTONS ,CRect(0,0,0,0),this,9105);
    m_TreeCtrlUp->ShowWindow(SW_SHOW); m_TreeCtrlDown = new CTreeCtrlV2();
    m_TreeCtrlDown->Create(WS_VISIBLE|WS_CHILD|TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS,CRect(0,0,0,0),this,9106);
    m_TreeCtrlDown->ShowWindow(SW_SHOW); m_btnTest = new CWnd();
    m_btnTest->Create(afxGlobalData.RegisterWindowClass(_T("MYWnd")),_T(""),WS_CHILD|WS_VISIBLE,CRect(0,0,0,0),this,9107);
    m_btnTest->ShowWindow(SW_SHOW);然后在CTestPane的PreTranslateMessage里 写了鼠标左键按下 鼠标移动 鼠标抬起的事件 可以达到差不多的效果 但是有个问题是当拖动分割线后 鼠标移出dockpanel以后就不能移动了。
    PreTranslateMessage里的实现如下
    if (pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_btnTest->m_hWnd)
    {
    m_bDown = true;
    m_ptMouseDown = pMsg->pt;
    ScreenToClient(&m_ptMouseDown);
    }
    else if(pMsg->message == WM_MOUSEMOVE)
    {
    if (m_bDown)
    {
    m_bMouse = true; m_ptMouseMove = pMsg->pt;
    ScreenToClient(&m_ptMouseMove);
    int nHeight = m_ptMouseMove.y - m_ptMouseDown.y;
    m_ptMouseDown = m_ptMouseMove;
    nUpTreeH += nHeight;
    nDownTreeH -= nHeight;
    CRect rect;
    GetClientRect(rect);
    int nCha = 0;;
    if (nUpTreeH <= 0)
    {
    int temp = nUpTreeH;
    nUpTreeH = 1;
    nCha = nUpTreeH - temp;
    nDownTreeH += nCha;
    }
    else if (nUpTreeH >= rect.Height() - 6)
    {
    nUpTreeH = rect.Height() - 6;
    nDownTreeH = 1;
    }
    m_TreeCtrlUp->SetWindowPos(NULL,0,0,rect.Width(),nUpTreeH,SWP_NOACTIVATE|SWP_NOZORDER);
    m_btnTest->SetWindowPos(NULL,0,nUpTreeH,rect.Width(),5,SWP_NOACTIVATE|SWP_NOZORDER);
    m_TreeCtrlDown->SetWindowPos(NULL,0,nUpTreeH + 5 ,rect.Width(),nDownTreeH,SWP_NOACTIVATE|SWP_NOZORDER); Invalidate(TRUE);
    UpdateWindow();
    }
    }
    else if(pMsg->message == WM_LBUTTONUP)
    {
    if (m_bDown)
    {
    m_bDown = false;
    Invalidate(TRUE);
    UpdateWindow();
    }
    }
    如何捕获鼠标在当前窗口外的鼠标移动事件呢?
      

  2.   

    鼠标 按下后 就 capturemouse ,然后无论鼠标在哪都可以捕获了
      

  3.   

    我在鼠标按下的时候 SetCapture();
    然后在鼠标弹起的时候 ReleaseCapture();没有效果呢