HRESULT CMatrixBox::QuickPaint(CRect rcClip0) { //拖拽时直接向窗口绘制缓存的dc,提高效率 CRect rcParent(0,0,0,0); if(m_pParentFrame) { rcParent = m_pParentFrame->GetPaintRect(); } CRect rcClip; CRect rcTmp; if(IntersectRect(&rcTmp,&rcParent,&m_rcPaint) == 0) { return E_FAIL; } if(IntersectRect(&rcClip,&rcTmp,&rcClip0) == 0) { return E_FAIL; } CRect rcWin; ::GetWindowRect(GetHwnd(),&rcWin); HDC hdcMem = ::CreateCompatibleDC(m_hMemDC); HBITMAP hbmp = ::CreateCompatibleBitmap(m_hMemDC,rcWin.Width(),rcWin.Height()); HBITMAP hOldBmp = (HBITMAP)::SelectObject(hdcMem,hbmp); ::BitBlt(hdcMem,rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),m_hMemDC,rcClip.left,rcClip.top,SRCCOPY); int nCount = GetFrameCount(); for(int i= 0;i<nCount;i++) { CMatrixItem* pItem = (CMatrixItem*)GetFrameByIndex(i); if(pItem) { CRect rcItem = pItem->GetPaintRect(); if ( IntersectRect( &rcTmp,&rcItem,&rcClip ) != 0 ) { pItem->QuickPaint(hdcMem); } } } HDC hdcWin = ::GetDC(GetHwnd()); ::BitBlt(hdcWin,rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),hdcMem,rcClip.left,rcClip.top,SRCCOPY); ReleaseDC(GetHwnd(),hdcWin); ::SelectObject(hdcMem,hOldBmp); ::DeleteObject(hbmp); ::DeleteDC(hdcMem); return S_OK; }
void CXTPCustomizeMenusPage::OnSelectionChangedContextmenus() { CXTPCommandBars* pCommandBars = m_pSheet->GetCommandBars(); CommitContextMenu(); int nSel = m_cmbContextMenus.GetCurSel(); if (nSel < 1) { GetDlgItem(XTP_IDC_BUTTON_RESETCONTEXT)->EnableWindow(FALSE); return; } GetDlgItem(XTP_IDC_BUTTON_RESETCONTEXT)->EnableWindow(TRUE); CXTPPopupBar* pPopupBar = (CXTPPopupBar*)m_cmbContextMenus.GetItemData(nSel); CXTPToolBar* pContextMenu = (CXTPToolBar*)pCommandBars->Add(_T("Standard"), xtpBarTop, RUNTIME_CLASS(CXTPFloatingPopupBar)); if (!pContextMenu) { TRACE0("Failed to create toolbar\n"); return; } CXTPControls* pControls = pPopupBar->GetControls()->Duplicate(); pContextMenu->SetControls(pControls); pContextMenu->SetBarID(pPopupBar->GetBarID()); pContextMenu->SetTitle(pPopupBar->GetTitle()); pContextMenu->SetCustomizeDialogPresent(FALSE); pContextMenu->SetPosition(xtpBarFloating); pContextMenu->EnableDocking(xtpFlagFloating); pContextMenu->OnRecalcLayout(); CXTPWindowRect rcContext(pContextMenu); CXTPWindowRect rcParent(GetParent()); CPoint pt = m_ptContextMenu; if (pt == CPoint(0, 0)) pt = CPoint(rcParent.left - rcContext.Width(), rcParent.top); pContextMenu->MoveWindow(pt.x, pt.y, rcContext.Width(), rcContext.Height()); m_pContextMenu = pContextMenu; pContextMenu->SetCommandBarData((DWORD_PTR)pPopupBar); pContextMenu->OnUpdateCmdUI(); }
HRESULT CMatrixBox::Relayout() { CRect rc = GetRect(); CRect rcParent(0,0,0,0); if(m_bWidthAsParent) { CXFrame* pParent = GetParent(); if(pParent) { rcParent = pParent->GetRect(); rc.right = rc.left + rcParent.Width(); } } CSize szRemain = rc.Size(); int nCount = GetFrameCount(); int nVolum = (szRemain.cx - m_rcGaps.left - m_rcGaps.right + m_szItemGpas.cx)/(m_szItem.cx + m_szItemGpas.cx); if(nVolum == 0) { return E_FAIL; } int nLine = nCount/nVolum; if(nCount % nVolum ) { nLine ++; } int nBeginX = m_rcGaps.left; int nBeginY = m_rcGaps.top; for(int y = 0;y < nLine;y++) { for(int x = 0;x<nVolum;x++) { if(y*nVolum + x >= nCount) { break; } CRect rcItem; rcItem.left = nBeginX + x*(m_szItem.cx + m_szItemGpas.cx); rcItem.top = nBeginY + y*(m_szItem.cy + m_szItemGpas.cy); rcItem.right = rcItem.left + m_szItem.cx; rcItem.bottom = rcItem.top + m_szItem.cy; CMatrixItem* pChild = (CMatrixItem*)m_vecItem[y*nVolum + x]; if(pChild && !pChild->GetDrag()) { pChild->SetRect(rcItem); } } } if(GetAutoHeight()) { int nFrameHeight = m_rcGaps.top + m_rcGaps.bottom + nLine*m_szItem.cy + (nLine - 1)*m_szItemGpas.cy; if(nFrameHeight < rcParent.Height()) { nFrameHeight = rcParent.Height(); } SetRect(CRect(rc.left,rc.top,rc.right,rc.top + nFrameHeight)); } __super::Relayout(); return S_OK; }