Ejemplo n.º 1
0
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();
}
Ejemplo n.º 3
0
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;
}