解决单文档滚动条程序中显示图像闪烁问题

1、class CPictureProcessView : public CScrollView

如果原来是继承自CView,则把程序中所有的CView替换成CScrollView。

注意,一定要重载 virtual   void   OnInitialUpdate();   否则可能出错。

 

2、添加内存DC,内存位图成员。

 

CDC m_MemDC; //内存DC

CBitmap m_MemBitmap; //内存位图

 

 

3、在打开文件后,要完成内存DC,和位图的初始化,同时设置滚动条的范围。

其实,就是把图像画到内存DC中。。

 

if (bitmap != NULL)
{
//把 图像画到内存DC中
m_MemBitmap.DeleteObject();
CDC *pDC = this->GetDC();
m_MemBitmap.CreateCompatibleBitmap(pDC,bitmap->GetWidth(),bitmap->GetHeight());
m_MemDC.SelectObject(m_MemBitmap);
Graphics graphics(m_MemDC.GetSafeHdc());
graphics.DrawImage(bitmap,0,0);
this->ReleaseDC(pDC);
// 设置滚动条范围
CSize sizeTotal(bitmap->GetWidth(),bitmap->GetHeight() );
SetScrollSizes(MM_TEXT,sizeTotal);

4、处理OnDraw函数。

其实就是从内存DC复制到另一个DC中。这里要注意的是,得到滚动条的位置,可以减少复制的范围。

我在测试十几M大小的图像完全不卡。

if (p_bitmap != NULL)
{
SCROLLINFO si ;
GetScrollInfo ( SB_HORZ ,& si , SIF_ALL );
int hPos = si .nPos ; //水平滚动条 位置
GetScrollInfo ( SB_VERT ,& si , SIF_ALL );
int vPos = si . nPos ; //竖直滚动条位置
CRect tempRect ;
this->GetWindowRect(&tempRect);
pDC->BitBlt(hPos,vPos,tempRect.Width(),tempRect.Height(),&m_MemDC,hPos,vPos,SRCCOPY);

5、屏蔽WM_ERASEBKGND消息。

不屏蔽的话会闪烁。

BOOL CPictureProcessView::OnEraseBkgnd(CDC* pDC)

{

//return CScrollView::OnEraseBkgnd(pDC);

return TRUE;

}

 

 

时间: 2024-10-02 07:43:05

解决单文档滚动条程序中显示图像闪烁问题的相关文章

MFC单文档应用程序显示图像

1 利用VS2010向导创建一个MFC单文档应用程序MFCTest 2 在MFCTestView.h中引用<atlimage.h>,并创建一个CImage对象 #include <atlimage.h> private: CImage image; 3 打开资源文件,选中Menu下面的IDR_MAINFRAME,添加一个新的菜单项"打开图像",修改其ID为IDM_OPEN,再点击鼠标右键,添加事件处理程序,在弹出的对话框的列表中选择CMFCTestView 4

mfc-MFC多文档应用程序中嵌入cef3,启动时一次性启了三个多文档应用程序

问题描述 MFC多文档应用程序中嵌入cef3,启动时一次性启了三个多文档应用程序 新建多文档应用程序,新增了Dialog,在Dialog的OnCreate中实现 了cef的CefExecuteProcess.CefInitialize.CreateBrowser,编译无误,结果运行时一下启了多文档实例,而且网页也没有显示出来. 附代码: int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialogEx::OnCreate(

c++-MFC 单文档 多视图中各视图的创建顺序能否改变?

问题描述 MFC 单文档 多视图中各视图的创建顺序能否改变? 每个视图OnInitialupdate()的顺序能否改变? 我每个视图的创建顺序先后会互相影响,所以需要各视图能按我希望的顺序创建 我之前猜测CMainFrame::OnCreateClient中各视图的分割语句顺序可能影响其创建顺序,但是刚才调试发现貌似不是的.. 解决方案 将那些涉及顺序的代码从OnInitialupdate()提取出来,作为独立的函数. 定义一个全局变量,比如int steps=0 每个OnInitialupda

mfc-在一个MFC多文档应用程序中加了一个校验对话框

问题描述 在一个MFC多文档应用程序中加了一个校验对话框 在一个MFC多文档应用程序中加了一个校验对话框,我验证成功后,改对话框消除,需要进入原来的进程,不知道为什么进不去了?这个是调用对话框的源码:CLicenseDlg dlg; m_pMainWnd = &dlg; CLicenseDlg * log = new CLicenseDlg;if (log->DoModal()!= IDOK){ // TODO: Place code here to handle when the dial

做一个简单的VC++的mfc单文档应用程序

问题描述 做一个简单的VC++的mfc单文档应用程序 帮忙做一个基于VC++6.0的mfc单文档应用程序(绘图),有菜单栏工具栏和快捷菜单,用到分割窗口,组合框,文档序列化 解决方案 google Scribble 示例:MDI 绘图应用程序 解决方案二: 就你的需求,不要写一行程序,用向导生成,勾选切分视图和从CFormView继承,放上组合框就好了.文档序列化是默认支持的. 解决方案三: 解决方案四: 如果你要画图,可以直接下载msdn里面切分视图画图的那个例子,然后加上一个controlb

cximage sdi 单文档-CXimage Demo 改为单文档应用程序后,文档类里面的线程,发送消息视类收不到?

问题描述 CXimage Demo 改为单文档应用程序后,文档类里面的线程,发送消息视类收不到? 最近下载了一个CxImage 的Demo源程序,但Demo是基于多文档的,我想把它改成单文档,就先实验了一个功能--向左旋转,但在线程里面发的消息视类没有收到,有没有人知道原因? 我是一个新手,请高手帮忙

mfc单文档-VC++程序调试,出现winocc.cpp中的问题!!!

问题描述 VC++程序调试,出现winocc.cpp中的问题!!! 我自己编写了一个单文档的小程序,然后运行程序之后出现中断,进过调试寻找到是winocc.cpp中的void CWnd::GetProperty和void CWnd::SetProperty两个函数中的_ASSERT(m_pCtrlSite != NULL);均出现错误.希望大神能帮忙指出错误类型!!!谢谢!!! 这是出错部分代码!! float* try::fun1( )//创建指定区域 { GET dlg; dlg.DoMod

MFC单文档应用程序 修改style 光标 图标 背景 等综合

   首先我们修改窗体 有2种方法  一是  在窗体创建之前   二是在窗体创建之后 修改  下面就介绍各种修改方法   参考  MSDN window style    window styles          用到的函数  GetWindowLong  SetWindowLong      GetClassLong   SetClassLong  在窗体创建之后修改窗体的属性 图标光标 等等       AfxRegisterWndClass函数返回一个已经注册的窗口类的名字以便我们给C

MFC SDI单文档应用程序贴图

   //我们在进行贴图的时候需要将背景擦除  贴图之后我们返回TRUE告诉操作系统已经擦出了背景  如果调用基类的OnEraseBKknd那么 //我们的贴图会被再次擦除就看不到贴图了  //在对向指定设备拷贝位图之前 我们先要在内存中准备位图 我们创建一个和目的DC兼容的兼容DC 并且将位图选择到 兼容DC然后进行拷贝 //返回TRUE我们不擦背景直接贴 那么不会出现闪烁 /*BOOL CBitBltView::OnEraseBkgnd(CDC* pDC) {     CDC dcCompa