绘图效率如何提升的问题

绿色盒子 2020-09-08 05:53:19

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函数中生成目的是保存背景,不用频繁画背景,只需要在背景上画移动的的矩形即可
理论上我认为这样绘图应该是很快的,但实际测试却发现这样绘图竟然也会在矩形多的时候很卡
...全文
124 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿色盒子 2020-09-10
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
dcMemory 和对应的 位图 也可以做成类变量
BitBlt 背景 到dcMemory
然后再绘制
BitBlt 到目标DC

DrawMoveingBox 里进行了那些操作?


//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);
}
绿色盒子 2020-09-10
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
不需要
InitBackgroundImage(&dc);//回背景,背景不改变时不绘制

背景也是会改变的的,只是没那么频繁的改变
绿色盒子 2020-09-10
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
dcMemory 和对应的 位图 也可以做成类变量
BitBlt 背景 到dcMemory
然后再绘制
BitBlt 到目标DC

DrawMoveingBox 里进行了那些操作?

是的,对应的位图也是类成员变量
CDC m_dcMemory;
CBitmap m_bitmapTemp;
CBitmap *m_pOldBitmap;
zgl7903 2020-09-09
  • 打赏
  • 举报
回复
dcMemory 和对应的 位图 也可以做成类变量
BitBlt 背景 到dcMemory
然后再绘制
BitBlt 到目标DC

DrawMoveingBox 里进行了那些操作?

schlafenhamster 2020-09-09
  • 打赏
  • 举报
回复
不需要
InitBackgroundImage(&dc);//回背景,背景不改变时不绘制
schlafenhamster 2020-09-09
  • 打赏
  • 举报
回复

DrawMoveingBox(&dcMemory);//画移动的矩形
代码

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧