MFC中C++的GDI+的双缓存

qq_894323438 2017-09-18 04:16:32
加精
Bitmap bmp = new Bitmap(600, 600);
Graphics g = Graphics.FromImage(bmp);
这个死活编译不过
error C2660: “Gdiplus::GdiplusBase::operator new”: 函数不接受 3 个参数
error C2512: “Gdiplus::Bitmap”: 没有合适的默认构造函数可用
error C2275: “Gdiplus::Graphics”: 将此类型用作表达式非法
error C2228: “.FromImage”的左边必须有类/结构/联合
error C2512: “Gdiplus::Graphics”: 没有合适的默认构造函数可用
网上的这个代码是用来GDI+双缓冲画图,几乎都是这个答案,而我编译不过,然后我去百度原因,说注释什么debug这个肯定不好吧,还有其他建新文件拷贝那个GDI+的重载代码我也试了,没有效果。我现在在做的是画了一些图然后由于太多导致视图刷新滚动滑动条时有点卡。所以想要做双缓存。求各位大神
上述代码我也有改成
Bitmap *bmp =:: new Bitmap(600, 600);
Graphics *g = Graphics.FromImage(bmp);
但编译还是不过
...全文
6878 65 打赏 收藏 转发到动态 举报
写回复
用AI写文章
65 条回复
切换为时间正序
请发表友善的回复…
发表回复
pthread_life 2017-11-01
  • 打赏
  • 举报
回复
haogaoduan
huanglin03 2017-10-27
  • 打赏
  • 举报
回复
兄弟完全不用在这里纠结了,MFC新特性里提供了双缓冲CMemDC的类了
nettman 2017-10-07
  • 打赏
  • 举报
回复
mcbozhou 2017-09-29
  • 打赏
  • 举报
回复
高大上。。。。。。。。
weixin_40424226 2017-09-28
  • 打赏
  • 举报
回复
很棒的帖子,值得学习
qq_34007249 2017-09-27
  • 打赏
  • 举报
回复
学习了!!!
nettman 2017-09-25
  • 打赏
  • 举报
回复
goforit2017 2017-09-25
  • 打赏
  • 举报
回复
建议 codeproject.com
qq_36612338 2017-09-24
  • 打赏
  • 举报
回复
学习学习,不错。
木女Dawn 2017-09-23
  • 打赏
  • 举报
回复
帖子对我用,不错,多谢了。
  • 打赏
  • 举报
回复
好难那,根本看不懂啊
_圯 2017-09-22
  • 打赏
  • 举报
回复
learn~
零隐 2017-09-22
  • 打赏
  • 举报
回复
怎么就双缓存的问题,还没解决。。 早知道代码不贴了。。 咦。。
cattpon 2017-09-22
  • 打赏
  • 举报
回复
learning~
schlafenhamster 2017-09-22
  • 打赏
  • 举报
回复
即 for 每个 数组的 94 个 点
schlafenhamster 2017-09-22
  • 打赏
  • 举报
回复
Status DrawCurve(IN const Pen* pen, IN const Point* points, IN INT count) 你有 40个 points 数组 吧, 这还是 每次画 一条 ,我的意思是 是 一次 画 40 个 数组中的 一个 改 GDI moveto lineto 吧
yhl2006 2017-09-22
  • 打赏
  • 举报
回复
不错不错!!!
qq_894323438 2017-09-22
  • 打赏
  • 举报
回复
引用 37 楼 schlafenhamster 的回复:
看看你的 bmpGraphics.DrawCurve(&initpen,points,94,0.0f); 一个for里画 40个 ,不要 40 for
我就是一个for循环,画四十条啊 for(int j=0;j<40;j++) { // 开始画图 (这里省略一些其他代码) graphics.DrawCurve(&initpen,points,94,0.0f); } 这有错?
nettman 2017-09-22
  • 打赏
  • 举报
回复
零隐 2017-09-22
  • 打赏
  • 举报
回复
引用 32 楼 qq_37475310 的回复:
[quote=引用 31 楼 fly0413 的回复:] [quote=引用 25 楼 qq_37475310 的回复:] [quote=引用 24 楼 fly0413 的回复:] 话说我以前弄过,双缓冲,我还弄过三缓冲。。 代码发上来能给分吗?
嗯,对我有帮助我会给的[/quote] 绘制都是由CDC 控制,所谓双缓存。就是同时控制两个CDC对象,然后根据所需进行复制黏贴 CDC m_MemDC;//内存DC CDC m_oldDataDC;//保存当前数据绘制结果,这样当选择重绘时,就不用重绘数据图. CBitmap m_oldDataBmp; CBitmap m_bmp; 看以上解释就知道了。两个DC的作用,第一个是用于当下绘制,第二个用于保存旧图。 初始化代码,就初始化一次ondraw。

 if(!m_bHadCreateDC)
	{
		gdiGetClientRect(m_rcClient);
		m_MemDC.CreateCompatibleDC(pDC);
		m_oldDataDC.CreateCompatibleDC(pDC);
		//创建图像
		//初始化屏幕位图
		int with= GetSystemMetrics(SM_CXFULLSCREEN);
		int heigh= GetSystemMetrics(SM_CYFULLSCREEN);
		m_bmp.CreateCompatibleBitmap(pDC, with, heigh);
		m_oldDataBmp.CreateCompatibleBitmap(pDC, with, heigh);
		m_MemDC.SelectObject(&m_bmp);
		m_oldDataDC.SelectObject(&m_oldDataBmp);
		m_bHadCreateDC = true;
		drawFilter(true);//第一次绘制,ture代表是绘制在m_MemDC,false代表绘制在m_oldDataDC
	}
	//将图像绘制到视图DC上
	pDC->BitBlt(0,0,int(m_rcClient.Width),int(m_rcClient.Height),&m_MemDC,0,0,SRCCOPY);

调用缓冲代码

void FilterView::drawFilter(bool bChangeData)
{
	//创建gra
	Graphics drawGra(m_MemDC.GetSafeHdc());
	if(bChangeData)
	{
		//设置绘制区域
		setRectSize(drawGra);
		//绘制背景
		drawBackGround(drawGra);

		m_oldDataDC.BitBlt(0,0,int(m_rcClient.Width),int(m_rcClient.Height),&m_MemDC,0,0,SRCCOPY);
	}
	else
		m_MemDC.BitBlt(0,0,int(m_rcClient.Width),int(m_rcClient.Height),&m_oldDataDC,0,0,SRCCOPY);
}
记得给分[/quote] if(!m_bHadCreateDC)这什么鬼,然后gdiGetClientRect(m_rcClient);这不是应该GetClientRect,分等我结贴会按均给[/quote] m_bHadCreateDC 是否创建了dc ,是否已经创建缓冲。只创建一次。 gdiGetClientRect(m_rcClient); 这个是GDI+的Rect,这个只是把CRect 转换为Rect。
加载更多回复(43)

19,468

社区成员

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

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