窗口重绘是怎么用StretchDIBits保持图像 大家好: 我用菜单形式打开的一幅bmp图像,经过处理后如果窗口移动了,图像会丢失。我是用StretchDIBits来显示图像的,怎样在ondraw中保持它?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是在OnDraw中写的显示位图的代码,你就不应该会有窗口重绘图像不见得问题啊 用菜单形式打开的一幅bmp图像后,Invalidate在 OnDraw 或者 OnPaint 中写绘制代码(通过判断是否有可用的图片对象数据) 我没有在ondraw中编写打开图像的代码。 我是创建了一个菜单“打开一幅图像”,放在View类中,然后用StretchDIBits函数来显示。这幅图像经过我编写的阈值处理、滤波处理等菜单命令后,我仍然用这个函数来显示它的结果。但是一旦我的窗口移动了,原来处理的结果就没有了,变成了白屏。 我知道这时发生了窗口重绘消息,但是就是不知到在哪里写程序保持它?是在ondraw中吗?怎么写? 谢谢!!! 绘图和打开文件是两码事打开文件在哪都行绘图操作应该组织在OnPaint或OnDraw里至于怎么写没什么特别的啊 把你绘图的代码放到OnDraw函数中去做 你把处理的结果都放到MEMDC里面,然后再OnPaint或OnDraw里直接把MEMDC复制到显示DC里面就可以了,你处理好像要显示的时候就INVALIDATERECT就可以了,只要MEMDC里的数据一直在,重绘的时候就会画出来。 原来的代码搬到OnDraw()中就可以了,窗口重绘的时候会自动调用OnDraw()函数 我在打开菜单中是用下面的程序段显示图像处理的结果(是一幅机器人焊接时采集的焊缝图像),然后我把显示图像的代码放在了onDraw函数中: void CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data heredib是建立的有关图像信息的类,放在了view类中 下面是我加的代码:int wide,height;wide=dib.GetWidth();//获得焊缝图像的宽度。height=dib.GetHeight();//获得焊缝图像的高度if(dib.GetRGB()) { ::StretchDIBits(pDC->GetSafeHdc(),0,0,wide,height,0,0,wide,height,dib.GetData (),dib.GetInfo(),DIB_RGB_COLORS,SRCCOPY); }}编译的结果没有错,但是逐步调试显示:Unhandled exception in 图像处理.exe:代码:Access violation,说是GetWidth()函数处有问题。这我真的找不到原因了!!! 因为StretchDIBits存在不断"吃"内存的可能,建议将StretchDIBits改成StretchBlt要好很多,也方便. 应该有这样的一行伪代码if(dib.IsValid()){ ... DrawthisDib();}没有初始化的dib会出问题 OnMouseMove(UINT nFlags, CPoint point) 如何获得本机已经关联的所有后缀名 怎么去掉使用CWindowDC绘制的线条 最近很烦躁,lp找工作要到别的城市!! 请问:如何在窗口中添加滚动条 怎样生成c++托管程序? vc++中对话框显示和隐藏的问题 怎样用VC操作SQL Server2000中的Image数据类型?? 建议一经采纳,必定给分。。。。 中文 CFrameWnd 框架调整 http post 方式Form上传?
我是创建了一个菜单“打开一幅图像”,放在View类中,然后用StretchDIBits函数来显示。这幅图像经过我编写的阈值处理、滤波处理等菜单命令后,我仍然用这个函数来显示它的结果。但是一旦我的窗口移动了,原来处理的结果就没有了,变成了白屏。
我知道这时发生了窗口重绘消息,但是就是不知到在哪里写程序保持它?是在ondraw中吗?怎么写?
谢谢!!!
打开文件在哪都行
绘图操作应该组织在OnPaint或OnDraw里
至于怎么写
没什么特别的啊
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data heredib是建立的有关图像信息的类,放在了view类中
下面是我加的代码:
int wide,height;
wide=dib.GetWidth();//获得焊缝图像的宽度。
height=dib.GetHeight();//获得焊缝图像的高度
if(dib.GetRGB())
{
::StretchDIBits(pDC->GetSafeHdc(),0,0,wide,height,0,0,wide,height,dib.GetData (),dib.GetInfo(),DIB_RGB_COLORS,SRCCOPY);
}
}
编译的结果没有错,但是逐步调试显示:Unhandled exception in 图像处理.exe:代码:Access violation,说是GetWidth()函数处有问题。这我真的找不到原因了!!!
因为StretchDIBits存在不断"吃"内存的可能,建议将StretchDIBits改成StretchBlt要好很多,也方便.
if(dib.IsValid())
{
...
DrawthisDib();
}没有初始化的dib会出问题