MFC在静态文本上使用双缓冲画图
最好能发一个工程给我。229235561@qq.com我在OnPain中的函数CDCpDC_Mem;pDC_Mem.CreateCompatibleDC(&dc);CBi...
最好能发一个工程给我。229235561@qq.com
我在OnPain中的函数
CDC pDC_Mem;
pDC_Mem.CreateCompatibleDC(&dc);
CBitmap bmp_Mem;
GetClientRect(&rect_map);
bmp_Mem.CreateCompatibleBitmap(&dc, rect_map.Width(), rect_map.Height());
CBitmap* pOldBmp = pDC_Mem.SelectObject(&bmp_Mem);
pDC_Mem.FillSolidRect(0,0,rect_map.Width(),rect_map.Height(),RGB(0,200,180));
pDC_Mem.MoveTo(0,0);
pDC_Mem.LineTo(12,12);
pDC_Mem.BitBlt(0, 0, rect_map.Width(), rect_map.Height(),&dc, 0, 0, SRCCOPY);
pDC_Mem.SelectObject(pOldBmp);
bmp_Mem.DeleteObject();
dc.BitBlt(0, 0, rect_map.Width(), rect_map.Height(),&pDC_Mem, 0, 0, SRCCOPY); 展开
我在OnPain中的函数
CDC pDC_Mem;
pDC_Mem.CreateCompatibleDC(&dc);
CBitmap bmp_Mem;
GetClientRect(&rect_map);
bmp_Mem.CreateCompatibleBitmap(&dc, rect_map.Width(), rect_map.Height());
CBitmap* pOldBmp = pDC_Mem.SelectObject(&bmp_Mem);
pDC_Mem.FillSolidRect(0,0,rect_map.Width(),rect_map.Height(),RGB(0,200,180));
pDC_Mem.MoveTo(0,0);
pDC_Mem.LineTo(12,12);
pDC_Mem.BitBlt(0, 0, rect_map.Width(), rect_map.Height(),&dc, 0, 0, SRCCOPY);
pDC_Mem.SelectObject(pOldBmp);
bmp_Mem.DeleteObject();
dc.BitBlt(0, 0, rect_map.Width(), rect_map.Height(),&pDC_Mem, 0, 0, SRCCOPY); 展开
3个回答
展开全部
双缓冲想必是你是知道的了。你从CStatic类派生一个自己的静态文本框类CXXStatic,重载OnDrawItem,那个结构体里lpDrawItemStruct(名字好像是这样的)有个结构体里有个CDC的句柄m_hdc(好像是这样的),用这个句柄就是静态控件的绘图句柄,这样使用这个句柄:
CDC dc;
dc.Attach(m_hdc);
//然后就和普通dc一样用了...
CDC memDC;
memDC.Craete...
CBitmap memBmp;
memBmp.Create...
memDC.SelectObject(&memBmp);
memDC....//画图
dc.bitblt(....);//贴上位图
可以禁用对CStaitci::OnDrawItem的调用,应该要设置静态控件为OwnerDraw属性吧,记不清了
如果框架没有自动发送消息给CXXStatic,就自己重载对话框的OnDrawItem,在这里面给静态控件发送WM_DRAWITEM(好像是这个名字,记不清拉)。
大概就是这样的了,和自绘按钮是一样的伎俩。。。。
CDC dc;
dc.Attach(m_hdc);
//然后就和普通dc一样用了...
CDC memDC;
memDC.Craete...
CBitmap memBmp;
memBmp.Create...
memDC.SelectObject(&memBmp);
memDC....//画图
dc.bitblt(....);//贴上位图
可以禁用对CStaitci::OnDrawItem的调用,应该要设置静态控件为OwnerDraw属性吧,记不清了
如果框架没有自动发送消息给CXXStatic,就自己重载对话框的OnDrawItem,在这里面给静态控件发送WM_DRAWITEM(好像是这个名字,记不清拉)。
大概就是这样的了,和自绘按钮是一样的伎俩。。。。
更多追问追答
追问
如何把派生的静态文本框类和自己的静态文本框相关联啊,要不然DC怎么关联我的自己的文本框啊
追答
这个。。。在用资源编辑器添加一个静态文本框,然后为它添加变量,然后在头文件中把刚才添加的变量的类型从CStatic改成CXXStatic就行了。
展开全部
void CRussia::DrawJiemian(CDC *pDC)//画界面
{
int nOldDC=pDC->SaveDC();
//背景
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(cBkgound);
//画分数、级别、速度
DrawScore(&memDC);//已实现
CDC memDC1;
memDC1.CreateCompatibleDC(pDC);
memDC1.SelectObject(cBlock);
//画方块
//m_RowCount,m_ColCount为格子行列数
//Russia[][]是存储方块的数组,为1表示当前位置有方块
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
if(Russia[i][j]==1)
memDC.BitBlt(j*20+300,i*20+100,20,20,&memDC1,0,0,SRCCOPY);
//预览方块
//Will[4][4]是下一个方块的数组,为1表示当前位置有方块
for(int n=0;n<4;n++)
for(int m=0;m<4;m++)
if(Will[n][m]==1)
memDC.BitBlt(542+m*20,115+n*20,20,20,&memDC1,0,0,SRCCOPY);
pDC->BitBlt(0,0,800,600,&memDC,0,0,SRCCOPY);
pDC->RestoreDC(nOldDC);
}
{
int nOldDC=pDC->SaveDC();
//背景
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(cBkgound);
//画分数、级别、速度
DrawScore(&memDC);//已实现
CDC memDC1;
memDC1.CreateCompatibleDC(pDC);
memDC1.SelectObject(cBlock);
//画方块
//m_RowCount,m_ColCount为格子行列数
//Russia[][]是存储方块的数组,为1表示当前位置有方块
for(int i=0;i<m_RowCount;i++)
for(int j=0;j<m_ColCount;j++)
if(Russia[i][j]==1)
memDC.BitBlt(j*20+300,i*20+100,20,20,&memDC1,0,0,SRCCOPY);
//预览方块
//Will[4][4]是下一个方块的数组,为1表示当前位置有方块
for(int n=0;n<4;n++)
for(int m=0;m<4;m++)
if(Will[n][m]==1)
memDC.BitBlt(542+m*20,115+n*20,20,20,&memDC1,0,0,SRCCOPY);
pDC->BitBlt(0,0,800,600,&memDC,0,0,SRCCOPY);
pDC->RestoreDC(nOldDC);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
差不多就是楼上的这样了。用兼容DC来双缓存的,和静态文本没有多大关系。
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询