void InitBackgroundImage(CDC* pDC)
{
if (m_nModMove==VIEW_MOD_MOVE)
return;
DestroyBackgroundImage();
CRect rectClient;
GetClientRect(&rectClient);
CDC dcBkgnd;
m_dcMemory.CreateCompatibleDC(pDC);
ASSERT(m_dcMemory.GetSafeHdc());
m_bitmapTemp.CreateCompatibleBitmap(pDC,m_nScreenWidth, m_nScreenHeight);
ASSERT(m_bitmapTemp.GetSafeHandle());
m_pOldBitmap = m_dcMemory.SelectObject(&m_bitmapTemp);
m_dcMemory.FillSolidRect(0,0,m_nScreenWidth, m_nScreenHeight,VIEWCOLOR);
DrawBox(&m_dcMemory);//繪制自定義背景圖
}
void OnPaint()
{
InitBackgroundImage(&dc);//回背景,背景不改變時不繪制
CDC dcMemory;
dcMemory.CreateCompatibleDC(&m_dcMemory);
CBitmap bmp;
bmp.CreateCompatibleBitmap(&m_dcMemory, m_nScreenWidth, m_nScreenHeight);
CBitmap *pOldBitmap = dcMemory.SelectObject(&bmp);
dcMemory.SetBkMode(TRANSPARENT);
dcMemory.BitBlt(0, 0, m_nScreenWidth, m_nScreenHeight, &m_dcMemory, 0, 0, SRCCOPY);//CDC拷貝
DrawMoveingBox(&dcMemory);//畫移動的矩形
dc.BitBlt(0,0,m_nScreenWidth,m_nScreenHeight,&dcMemory,0,0,SRCCOPY);//繪制圖片到主DC
dcMemory.SelectObject(pOldBitmap);
dcMemory.DeleteDC();
bmp.DeleteObject();
}
如代碼所示m_dcMemory是成員變數,在InitBackgroundImage函式中生成目的是保存背景,不用頻繁畫背景,只需要在背景上畫移動的的矩形即可
理論上我認為這樣繪圖應該是很快的,但實際測驗卻發現這樣繪圖竟然也會在矩形多的時候很卡
uj5u.com熱心網友回復:
上DrawMoveingBox(&dcMemory);//畫移動的矩形
代碼
uj5u.com熱心網友回復:
不需要InitBackgroundImage(&dc);//回背景,背景不改變時不繪制
uj5u.com熱心網友回復:
dcMemory 和對應的 位圖 也可以做成類變數BitBlt 背景 到dcMemory
然后再繪制
BitBlt 到目標DC
DrawMoveingBox 里進行了那些操作?
uj5u.com熱心網友回復:
是的,對應的位圖也是類成員變數
CDC m_dcMemory;
CBitmap m_bitmapTemp;
CBitmap *m_pOldBitmap;
uj5u.com熱心網友回復:
背景也是會改變的的,只是沒那么頻繁的改變
uj5u.com熱心網友回復:
//DrawMoveingBox()里面是繪制移動的矩形,保存在m_vSelectCard向量中,測驗的時候這個向量的size僅為1
int nBoxCount=m_vSelectCard.size();
for (int i=0;i<nBoxCount;i++)
{
//測驗矩形
int l=m_vSelectCard[i].nCrdStartX;
int t=m_vSelectCard[i].nCrdStartY;
int r=m_vSelectCard[i].nCrdStartX+m_vSelectCard[i].nCrdWidth;
int b=m_vSelectCard[i].nCrdStartY+m_vSelectCard[i].nCrdHeight;
CRect BoxRect=CRect(l,t,r,b);
BoxRect.OffsetRect(-m_nScrollPos_X,-m_nScrollPos_Y);
pDC->FillSolidRect(BoxRect,SRECTCOLOR);
CPen pen(PS_SOLID,1,RCLINECOLORS);
CPen *pOldPen = pDC->SelectObject((&pen));
pDC->MoveTo(BoxRect.left,BoxRect.top);
pDC->LineTo(BoxRect.right,BoxRect.top);
pDC->LineTo(BoxRect.right,BoxRect.bottom);
pDC->LineTo(BoxRect.left,BoxRect.bottom);
pDC->LineTo(BoxRect.left,BoxRect.top);
pDC->SelectObject(pOldPen);
pen.DeleteObject();
pOldPen=NULL;
pDC->SetBkMode(TRANSPARENT);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/7425.html
標籤:界面
上一篇:c++記憶體影像轉矩陣
