⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sizecbar.cpp

📁 C++中的单元测试类库
💻 CPP
📖 第 1 页 / 共 3 页
字号:
}void CSizingControlBar::OnCaptureChanged(CWnd *pWnd) {    if (m_bTracking && (pWnd != this))        StopTracking();    baseCSizingControlBar::OnCaptureChanged(pWnd);}void CSizingControlBar::OnNcCalcSize(BOOL bCalcValidRects,                                     NCCALCSIZE_PARAMS FAR* lpncsp) {    // compute the the client area    CRect rcClient = lpncsp->rgrc[0];    rcClient.DeflateRect(5, 5);    m_dwSCBStyle &= ~SCBS_EDGEALL;    switch(m_nDockBarID)    {    case AFX_IDW_DOCKBAR_TOP:        m_dwSCBStyle |= SCBS_EDGEBOTTOM;        rcClient.DeflateRect(m_cyGripper, 0, 0, 0);        break;    case AFX_IDW_DOCKBAR_BOTTOM:        m_dwSCBStyle |= SCBS_EDGETOP;        rcClient.DeflateRect(m_cyGripper, 0, 0, 0);        break;    case AFX_IDW_DOCKBAR_LEFT:        m_dwSCBStyle |= SCBS_EDGERIGHT;        rcClient.DeflateRect(0, m_cyGripper, 0, 0);        break;    case AFX_IDW_DOCKBAR_RIGHT:        m_dwSCBStyle |= SCBS_EDGELEFT;        rcClient.DeflateRect(0, m_cyGripper, 0, 0);        break;    default:        break;    }    if (!IsFloating() && m_pDockBar != NULL)    {        CSCBArray arrSCBars;        GetRowSizingBars(arrSCBars);        for (int i = 0; i < arrSCBars.GetSize(); i++)            if (arrSCBars[i] == this)            {                if (i > 0)                    m_dwSCBStyle |= IsHorzDocked() ?                        SCBS_EDGELEFT : SCBS_EDGETOP;                if (i < arrSCBars.GetSize() - 1)                    m_dwSCBStyle |= IsHorzDocked() ?                        SCBS_EDGERIGHT : SCBS_EDGEBOTTOM;            }    }    // make room for edges only if they will be painted    if (m_dwSCBStyle & SCBS_SHOWEDGES)        rcClient.DeflateRect(            (m_dwSCBStyle & SCBS_EDGELEFT) ? m_cxEdge : 0,            (m_dwSCBStyle & SCBS_EDGETOP) ? m_cxEdge : 0,            (m_dwSCBStyle & SCBS_EDGERIGHT) ? m_cxEdge : 0,            (m_dwSCBStyle & SCBS_EDGEBOTTOM) ? m_cxEdge : 0);    // "hide" button positioning    CPoint ptOrgBtn;    if (IsHorzDocked())        ptOrgBtn = CPoint(rcClient.left - m_cyGripper - 1,            rcClient.top - 1);    else        ptOrgBtn = CPoint(rcClient.right - 11,            rcClient.top - m_cyGripper - 1);    m_biHide.Move(ptOrgBtn - CRect(lpncsp->rgrc[0]).TopLeft());    lpncsp->rgrc[0] = rcClient;}void CSizingControlBar::OnNcPaint() {    // get window DC that is clipped to the non-client area    CWindowDC dc(this);    CRect rcClient, rcBar;    GetClientRect(rcClient);    ClientToScreen(rcClient);    GetWindowRect(rcBar);    rcClient.OffsetRect(-rcBar.TopLeft());    rcBar.OffsetRect(-rcBar.TopLeft());    // client area is not our bussiness :)    dc.ExcludeClipRect(rcClient);    // draw borders in non-client area    CRect rcDraw = rcBar;    DrawBorders(&dc, rcDraw);    // erase parts not drawn    dc.IntersectClipRect(rcDraw);    // erase NC background the hard way    HBRUSH hbr = (HBRUSH)GetClassLong(m_hWnd, GCL_HBRBACKGROUND);    ::FillRect(dc.m_hDC, rcDraw, hbr);    if (m_dwSCBStyle & SCBS_SHOWEDGES)    {        CRect rcEdge; // paint the sizing edges        for (int i = 0; i < 4; i++)            if (GetEdgeRect(rcBar, GetEdgeHTCode(i), rcEdge))                dc.Draw3dRect(rcEdge, ::GetSysColor(COLOR_BTNHIGHLIGHT),                    ::GetSysColor(COLOR_BTNSHADOW));    }    if (m_cyGripper && !IsFloating())        NcPaintGripper(&dc, rcClient);    ReleaseDC(&dc);}void CSizingControlBar::NcPaintGripper(CDC* pDC, CRect rcClient){    // paints a simple "two raised lines" gripper    // override this if you want a more sophisticated gripper    CRect gripper = rcClient;    CRect rcbtn = m_biHide.GetRect();    BOOL bHorz = IsHorzDocked();        gripper.DeflateRect(1, 1);    if (bHorz)    {   // gripper at left        gripper.left -= m_cyGripper;        gripper.right = gripper.left + 3;        gripper.top = rcbtn.bottom + 3;    }    else    {   // gripper at top        gripper.top -= m_cyGripper;        gripper.bottom = gripper.top + 3;        gripper.right = rcbtn.left - 3;    }    pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),        ::GetSysColor(COLOR_BTNSHADOW));    gripper.OffsetRect(bHorz ? 3 : 0, bHorz ? 0 : 3);        pDC->Draw3dRect(gripper, ::GetSysColor(COLOR_BTNHIGHLIGHT),        ::GetSysColor(COLOR_BTNSHADOW));    m_biHide.Paint(pDC);}void CSizingControlBar::OnPaint(){    // overridden to skip border painting based on clientrect    CPaintDC dc(this);}UINT CSizingControlBar::OnNcHitTest(CPoint point){    if (IsFloating())        return baseCSizingControlBar::OnNcHitTest(point);    CRect rcBar, rcEdge;    GetWindowRect(rcBar);    for (int i = 0; i < 4; i++)        if (GetEdgeRect(rcBar, GetEdgeHTCode(i), rcEdge))            if (rcEdge.PtInRect(point)) return GetEdgeHTCode(i);    CRect rc = m_biHide.GetRect();    rc.OffsetRect(rcBar.TopLeft());    if (rc.PtInRect(point))        return HTCLOSE;    return HTCLIENT;}void CSizingControlBar::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) {    baseCSizingControlBar::OnSettingChange(uFlags, lpszSection);    m_bDragShowContent = FALSE;    ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0,        &m_bDragShowContent, 0); // update}/////////////////////////////////////////////////////////////////////////// CSizingControlBar implementation helpersvoid CSizingControlBar::StartTracking(UINT nHitTest){    SetCapture();    // make sure no updates are pending    RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_UPDATENOW);        BOOL bHorz = IsHorzDocked();    m_szOld = bHorz ? m_szHorz : m_szVert;    CRect rc;    GetWindowRect(&rc);    CRect rcEdge;    VERIFY(GetEdgeRect(rc, nHitTest, rcEdge));    m_ptOld = rcEdge.CenterPoint();    m_htEdge = nHitTest;    m_bTracking = TRUE;    CSCBArray arrSCBars;    GetRowSizingBars(arrSCBars);    // compute the minsize as the max minsize of the sizing bars on row    m_szMinT = m_szMin;    for (int i = 0; i < arrSCBars.GetSize(); i++)        if (bHorz)            m_szMinT.cy = max(m_szMinT.cy, arrSCBars[i]->m_szMin.cy);        else            m_szMinT.cx = max(m_szMinT.cx, arrSCBars[i]->m_szMin.cx);    if (!IsSideTracking())    {        // the control bar cannot grow with more than the size of         // remaining client area of the mainframe        m_pDockSite->RepositionBars(0, 0xFFFF, AFX_IDW_PANE_FIRST,            reposQuery, &rc, NULL, TRUE);        m_szMaxT = m_szOld + rc.Size() - CSize(4, 4);    }    else    {        // side tracking: max size is the actual size plus the amount        // the neighbour bar can be decreased to reach its minsize        for (int i = 0; i < arrSCBars.GetSize(); i++)            if (arrSCBars[i] == this) break;        CSizingControlBar* pBar = arrSCBars[i +            ((m_htEdge == HTTOP || m_htEdge == HTLEFT) ? -1 : 1)];        m_szMaxT = m_szOld + (bHorz ? pBar->m_szHorz :            pBar->m_szVert) - pBar->m_szMin;    }    OnTrackInvertTracker(); // draw tracker}void CSizingControlBar::StopTracking(){    OnTrackInvertTracker(); // erase tracker    m_bTracking = FALSE;    ReleaseCapture();        m_pDockSite->DelayRecalcLayout();}void CSizingControlBar::OnTrackUpdateSize(CPoint& point){    ASSERT(!IsFloating());    CPoint pt = point;    ClientToScreen(&pt);    CSize szDelta = pt - m_ptOld;    CSize sizeNew = m_szOld;    switch (m_htEdge)    {    case HTLEFT:    sizeNew -= CSize(szDelta.cx, 0); break;    case HTTOP:     sizeNew -= CSize(0, szDelta.cy); break;    case HTRIGHT:   sizeNew += CSize(szDelta.cx, 0); break;    case HTBOTTOM:  sizeNew += CSize(0, szDelta.cy); break;    }    // enforce the limits    sizeNew.cx = max(m_szMinT.cx, min(m_szMaxT.cx, sizeNew.cx));    sizeNew.cy = max(m_szMinT.cy, min(m_szMaxT.cy, sizeNew.cy));    BOOL bHorz = IsHorzDocked();    szDelta = sizeNew - (bHorz ? m_szHorz : m_szVert);        if (szDelta == CSize(0, 0)) return; // no size change    OnTrackInvertTracker(); // erase tracker    (bHorz ? m_szHorz : m_szVert) = sizeNew; // save the new size    CSCBArray arrSCBars;    GetRowSizingBars(arrSCBars);    for (int i = 0; i < arrSCBars.GetSize(); i++)        if (!IsSideTracking())        {   // track simultaneously            CSizingControlBar* pBar = arrSCBars[i];            (bHorz ? pBar->m_szHorz.cy : pBar->m_szVert.cx) =                bHorz ? sizeNew.cy : sizeNew.cx;        }        else        {   // adjust the neighbour's size too            if (arrSCBars[i] != this) continue;            CSizingControlBar* pBar = arrSCBars[i +                ((m_htEdge == HTTOP || m_htEdge == HTLEFT) ? -1 : 1)];            (bHorz ? pBar->m_szHorz.cx : pBar->m_szVert.cy) -=                bHorz ? szDelta.cx : szDelta.cy;        }    OnTrackInvertTracker(); // redraw tracker at new pos    if (m_bDragShowContent)        m_pDockSite->DelayRecalcLayout();}void CSizingControlBar::OnTrackInvertTracker(){    ASSERT(m_bTracking);    if (m_bDragShowContent)        return; // don't show tracker if DragFullWindows is on    BOOL bHorz = IsHorzDocked();    CRect rc, rcBar, rcDock, rcFrame;    GetWindowRect(rcBar);    m_pDockBar->GetWindowRect(rcDock);    m_pDockSite->GetWindowRect(rcFrame);    VERIFY(GetEdgeRect(rcBar, m_htEdge, rc));    if (!IsSideTracking())        rc = bHorz ?             CRect(rcDock.left + 1, rc.top, rcDock.right - 1, rc.bottom) :            CRect(rc.left, rcDock.top + 1, rc.right, rcDock.bottom - 1);    rc.OffsetRect(-rcFrame.TopLeft());    CSize sizeNew = bHorz ? m_szHorz : m_szVert;    CSize sizeDelta = sizeNew - m_szOld;    if (m_nDockBarID == AFX_IDW_DOCKBAR_LEFT && m_htEdge == HTTOP ||        m_nDockBarID == AFX_IDW_DOCKBAR_RIGHT && m_htEdge != HTBOTTOM ||        m_nDockBarID == AFX_IDW_DOCKBAR_TOP && m_htEdge == HTLEFT ||        m_nDockBarID == AFX_IDW_DOCKBAR_BOTTOM && m_htEdge != HTRIGHT)        sizeDelta = -sizeDelta;    rc.OffsetRect(sizeDelta);    CDC *pDC = m_pDockSite->GetDCEx(NULL,        DCX_WINDOW | DCX_CACHE | DCX_LOCKWINDOWUPDATE);    CBrush* pBrush = CDC::GetHalftoneBrush();    CBrush* pBrushOld = pDC->SelectObject(pBrush);    pDC->PatBlt(rc.left, rc.top, rc.Width(), rc.Height(), PATINVERT);        pDC->SelectObject(pBrushOld);    m_pDockSite->ReleaseDC(pDC);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -