VC 重绘问题 例如:画线画矩形画圆等等都由用户操作(类似WINDOW自带的画图软件),要怎么解决重绘问题
展开全部
用MetaFile来解决
MetaFile是绘图函数二进制记录的集合,MetaFile可以保存在内存,也可以保存在磁盘
每次用户绘图,既在hdc上绘制,也在MetaFile中绘制,在WM_PAINT中播放MetaFile
case WM_CREATE:
hdc=GetDC(hwnd);
hmetadc=CreateMetaFile("D:\\1.wmf");
// hbitmap=CreateCompatibleBitmap(hmetadc,50,100);
// SelectObject(hmetadc,hbitmap);
SelectObject(hmetadc,GetStockObject(BLACK_BRUSH));
Ellipse(hmetadc,0,0,50,100);
CloseMetaFile(hmetadc);
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hmetafile=GetMetaFile("D:\\1.wmf");
SetWindowOrgEx(hdc,-100,-100,NULL);
PlayMetaFile(hdc,hmetafile);
DeleteMetaFile(hmetafile);
EndPaint(hwnd,&ps);
break;
我习惯了用旧版的MetaFile,还有增强版的MetaFile,比较复杂
MetaFile是绘图函数二进制记录的集合,MetaFile可以保存在内存,也可以保存在磁盘
每次用户绘图,既在hdc上绘制,也在MetaFile中绘制,在WM_PAINT中播放MetaFile
case WM_CREATE:
hdc=GetDC(hwnd);
hmetadc=CreateMetaFile("D:\\1.wmf");
// hbitmap=CreateCompatibleBitmap(hmetadc,50,100);
// SelectObject(hmetadc,hbitmap);
SelectObject(hmetadc,GetStockObject(BLACK_BRUSH));
Ellipse(hmetadc,0,0,50,100);
CloseMetaFile(hmetadc);
ReleaseDC(hwnd,hdc);
break;
case WM_PAINT:
hdc=BeginPaint(hwnd,&ps);
hmetafile=GetMetaFile("D:\\1.wmf");
SetWindowOrgEx(hdc,-100,-100,NULL);
PlayMetaFile(hdc,hmetafile);
DeleteMetaFile(hmetafile);
EndPaint(hwnd,&ps);
break;
我习惯了用旧版的MetaFile,还有增强版的MetaFile,比较复杂
更多追问追答
追问
OnPaint的写在OnDraw里了,能运行了,文件1.wmf也有保存下来,不过没图的,也没解决重绘
void CDrawView::OnDraw(CDC* pDC)
{
// TODO: add draw code for native data here
pDC->BeginPath();
HMETAFILE hmetafile=GetMetaFile("D:\\1.wmf");
SetWindowOrgEx(pDC->m_hDC,-100,-100,NULL);
PlayMetaFile(pDC->m_hDC,hmetafile);
DeleteMetaFile(hmetafile);
pDC->EndPath();
}
追答
DeleteMetaFile(hmetafile);
要去掉这句,删除了再次PAINT的时候又清空了
2011-10-24
展开全部
采用双缓冲区了。
画图在内存上画,然后Bitblt上去。
画图在内存上画,然后Bitblt上去。
追问
刚才我去看了一下,不过这些都是写在OnDraw里的,而我的绘画都在鼠标弹起事件里
追答
鼠标弹起,只是用来记录一些点吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
记录下你画图的参数(如线的两个端点、圆的圆心与半径等),在OnDraw或OnPaint中再把已经画好的图形重新绘制一次。
更多追问追答
追问
怎么保存?能详细点么,谢谢,(要是这样保存了,怎么实现橡皮刷?(可以不用考虑= =))
追答
比如,矩形,记录下左上角顶点坐标和右下角顶点坐标就可以了,而圆,记下圆的外接矩形就成了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询