如何解决MFC单文档滚动条拖动时的重影问题(高分)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决MFC单文档滚动条拖动时的重影问题(高分)相关的知识,希望对你有一定的参考价值。

本工程中添加滚动条的方法为:
第一步:
视图类VIEW的基类选择ScrollView;
第二步:
在ScrollView类中添加OnInitialUpdate(),并在响应函数中添加 SetScrollSizes(MM_TEXT, CSize(1600, 900));
此后,运行程序,拖动滚动条时下方或右方会出现重影。目前网上找不到详细答案,求详细解决方法。
补充:
我的视图类里有一些画图的程序。因此拖动滚动条时,这些图案就发生了重影。不可能是系统问题。而是逻辑坐标与设备坐标,由于滚动条下啦后,设备坐标没有更改的问题。但我不知道具体的解决方法。

问题描述不完整,不能判定原因。
一般MFC滚动造成重影,要么是系统问题(非代码),要么是OnDraw函数处理问题,这两个情况比较多,当然还有更多因素,比如自己处理了On..Scroll或者其它相关响应函数造成的。
如果只有描述中的代码(其它只是MFC默认工程代码),那么和代码无关了,应该是win系统或者VC系统有问题。追问

我的视图类里有一些画图的程序。因此拖动滚动条时,这些图案就发生了重影。不可能是系统问题。而是逻辑坐标与设备坐标,由于滚动条下啦后,设备坐标没有更改的问题。但我不知道具体的解决方法。

追答

上面说过了,问题代码最可能出现在OnDraw函数和滚动处理函数的代码上,需要具体问题具体分析,这样笼统的说没办法解决。

参考技术A 换一台电脑试一试,我按照你的要求建了一个一样的工程,没有你说的现象.追问

我的视图类里有一些画图的程序。因此拖动滚动条时,这些图案就发生了重影。是逻辑坐标与设备坐标,由于滚动条下啦后,设备坐标没有更改的问题。但我不知道具体的解决方法。不可能是电脑的问题。

追答

是重影还是闪烁?我按照你的要求建了一个一样的工程,加载了一个大图,拖动滚动条时边框出现一些闪烁,没有重影.

参考技术B 这个问题我也遇到过,解决办法如下

int m_Max; //为获取计数范围和计数值定义变量
int m_Min;
GetDlgItem(IDC_EDIT)->GetScrollRange(SB_VERT,&m_Min,&m_Max);
GetDlgItem(IDC_EDIT)->SetScrollPos(SB_VERT,m_Max+1,true);
((CEdit*)GetDlgItem(IDC_EDIT))->SetSel(strlen(m_commbuf),strlen(m_commbuf),false); //自动滚屏
GetDlgItem(IDC_EDIT)->SetFocus();
m_commbuf为控件IDC_EDIT对应的变量。追问

你这个IDC_EDIT是什么控件?我的是单文档工程,不是对话框。是在视图窗口右侧与低栏的滚动条,就像浏览器右侧的滚动条一样。

MFC解决EDIT控件滚动条滚动后,对话框顶部的文字重叠的问题

问题描述:MFC EDIT控件的滚动条滚动后,对话框顶部的文字重叠。

解决方法:捕获滚动事件,在定时器中重绘文字重叠区域。

主要实现代码:

 1 HBRUSH CMyDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
 2 {
 3     if(pWnd->GetDlgCtrlID() == IDC_EDIT_XXX)   
 4     {  
 5 
 6         int nVertPos = GetDlgItem(IDC_EDIT_XXX)->GetScrollPos(SB_VERT); //得到当前滚动条位置
 7         if(m_VscPos != nVertPos)
 8         {
 9             m_VscPos = nVertPos; // m_VscPos用来保存每次移动后的滚动条值,如果没有移动就不启动刷新
10             SetTimer(XXX_TIMER_ID, 10, NULL); // 滚动条变化一次就刷新一次
11         }
12     }
13 
14     return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);   
15 }
16 
17 void CMyDlg::OnTimer(UINT nIDEvent)
18 {
19     KillTimer(nIDEvent); //只允许定时器产生一条消息
20 
21     //重绘文字重叠区域
22     CRect Rc;      
23     GetDlgItem(IDC_EDIT_XXX)->GetWindowRect(&Rc);   
24     ScreenToClient(&Rc);   
25     InvalidateRect(Rc);  
26 }

在头文件声明函数:

1     afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
2     afx_msg void OnTimer(UINT nIDEvent);

实现文件中映射消息处理函数:

1 BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
2     //{{AFX_MSG_MAP(CMyDlg)
3     ON_WM_CTLCOLOR() 
4     ON_WM_TIMER()
5     //}}AFX_MSG_MAP
6 END_MESSAGE_MAP()

 

以上是关于如何解决MFC单文档滚动条拖动时的重影问题(高分)的主要内容,如果未能解决你的问题,请参考以下文章

MFC单文档视图下的List Control的滚动条无法拖动,不起作用,求大神解答

MFC单文档,当你向左或向右拖到滚动条,图形的位置不能随之发生变化,怎么具体解决,感激不尽

关于delphi 中的canvas重影问题

datagridview 一拖动水平滚动条表头出现两重影

解决CListCtrl闪烁及水平滚动条不能跟踪拖动的问题(MFC)

大家好,MFC list控件中怎么让滚动条为灰色不能拖动,但是仍然可以用鼠标中键滚动列表内容。