一个MFC绘制图形的问题

bird1982 2005-08-04 02:25:04
在一个对话框窗体中放一个PICTURE控件,ONPAINT事件里给控件着了色,现在在空间上面用PEN绘图,绘制出的图形一切屏或者一碰屏幕就没了,这个问题该怎么处理阿?最好不要告诉我重画,实时显示,重画会很麻烦
...全文
452 点赞 收藏 33
写回复
33 条回复
bird1982 2005年08月05日
是不是我可以把所有的东西都画到一个MEMDC里去?
回复 点赞
future-coming 2005年08月05日
用memDC;
全黑的很正常,自己画一个想要的背景色。
回复 点赞
bird1982 2005年08月05日
搞明白了,那个,有个问题,我要换工具,即SelectObject是用pDC还是用memDC换?
另外就是,我的程序中出了个比较麻烦的事情,因为我的背景色是用pDC画的,现在要用BitBlt处理的话,马上就挂掉了,背景改全黑的了~~~~~-_-!真不知道该怎么办了~~~
回复 点赞
future-coming 2005年08月05日
http://www.vckbase.com/code/downcode.asp?id=2360,下下来看看
回复 点赞
bird1982 2005年08月05日
为啥我用就是不好使呢?
我整半天了,没啥错误为啥我就看不到图呢?
回复 点赞
future-coming 2005年08月05日
定义 CDC *pDC;
CDC MemDC;
CBitmap MemBitmap;
初始化里面
pDC = m_ctrlWave.GetDC();

MemDC.CreateCompatibleDC(pDC);

MemBitmap.CreateCompatibleBitmap(pDC,1024,768);

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

MemDC.FillSolidRect(0,0,1024,768,RGB(255,255,255));
弄个按钮触发画图事件
MemDC.MoveTo(0,0);
MemDC.LineTo(100,100);

pDC->BitBlt(0,0,1024,768,&MemDC,0,0,SRCCOPY);
我是用一个PictureBOX作绘图区域
回复 点赞
bird1982 2005年08月05日
定义 CDC *pDC;
CDC MemDC;
CBitmap MemBitmap;
初始化里面
pDC = m_ctrlWave.GetDC();

MemDC.CreateCompatibleDC(NULL);

MemBitmap.CreateCompatibleBitmap(pDC,0,0);

CBitmap *pOldBit=MemDC.SelectObject(&MemBitmap);

MemDC.FillSolidRect(0,0,100,100,RGB(255,255,255));
弄个按钮触发画图事件
MemDC.MoveTo(0,0);
MemDC.LineTo(100,100);

pDC->BitBlt(0,0,100,100,&MemDC,0,0,SRCCOPY);
我是用一个PictureBOX作绘图区域

回复 点赞
bird1982 2005年08月05日
偶的邮箱 163superstar@163.com
哪位高人做个最基本的让偶瞧瞧,偶这里把代码都添加了,可还是没看出效果来
回复 点赞
future-coming 2005年08月05日
你把你的代码贴出来,让大家看看
回复 点赞
bird1982 2005年08月05日
谁做个简单点的例子,就是ONINITDIALOG()里初始化,弄个BUTTON事件画出个图来就成,我按上面的方法做,什么地方都不报错,就是出不来图形。
回复 点赞
future-coming 2005年08月05日
好用,楼主的代码可能不很完善
回复 点赞
bird1982 2005年08月05日
各位,明白的大虾,帮帮忙,YanDong_8212(谢科)的方法我用了,就是不好用,怎么也画不出来
回复 点赞
future-coming 2005年08月05日
关于这个问题:
hyamw(林锋)你的意思我明白了,但是有个比较大的问题,我每次画的是图形中的一段,就是来一段数据我计算一段,然后调用画图函数画一段,这样的话我m_MemDC里备份的总是我最后一次画的一段图形,等重画时就只重画最后一段了

这还不好解决,把以前的数据存到文档中,像队列一样先进先出,周而复始,这样便可以了;而且这样,你就可以不用创建一个CDC拷贝了(其实这个也不难嘛),而且这些数据你还可以经过处理后输出到文件或数据库中,以供历史数据显示或趋势显示。

利用内存画图然后复制到屏幕上,可以有效地解决闪烁问题。


回复 点赞
hyamw 2005年08月05日
那你每次画新图象的时候不清除m_MemDC里的内容。这样,上次的图像还会保存在MemDC里面
回复 点赞
bird1982 2005年08月05日
有个问题,YanDong_8212(谢科)帖子中的pDC是不是就是那个memDC?
回复 点赞
bird1982 2005年08月05日
becool3000(蓝色冰点),我下面的帖子里有解释,在那里面画不了,我不能调用ONPAINT()画图形,因为里面有计算处理过程,在ONPAINT()里处理有时会出错。
回复 点赞
bird1982 2005年08月05日
hyamw(林锋)你的意思我明白了,但是有个比较大的问题,我每次画的是图形中的一段,就是来一段数据我计算一段,然后调用画图函数画一段,这样的话我m_MemDC里备份的总是我最后一次画的一段图形,等重画时就只重画最后一段了
回复 点赞
becool3000 2005年08月05日
这个问题一直有啊
在OnPaint()里面画就可以了
回复 点赞
hyamw 2005年08月05日
为啥不在OnPaint()里面画?

如果你要用YanDong_8212(谢科) 的方法,你应该添加一个类成员:
CDC m_MemDC;
在OnInitDialog()的时候,对m_MemDC初始化。
每次绘制新的图像的时候,先对m_MemDC作图,然后复制到屏幕上。(要记得清除上次的图像)
在OnPaint()里面添加:把m_MemDC的内容复制到屏幕上
回复 点赞
sun1126 2005年08月05日
在onpaint函数里实现绘图操作,当需要实时刷新时发消息SendMessage(WM_PAINT)
程序会自动调用OnPaint函数重绘
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7973

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告