我实施了一个显示图表的 MFC应用程序。存在数据点(例如2000),其中它们的子集将显示在图表中。必须使用滚动条更改此子集。所以我在对话框类中添加了CScrollBar
类,并听取调用ON_WM_HSCROLL
方法的OnHScroll
事件。
void CChartWithRealTimeDataDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
UINT nCurrentPos;
nCurrentPos = pScrollBar->GetScrollPos();
// nCurrentPos = m_X_Axis_Scrollbar->GetScrollPos();
bool bDoRepaint = false;
switch (nSBCode)
{
//case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nCurrentPos = nPos;
pScrollBar->SetScrollPos (nPos);
bDoRepaint = true;
break;
case SB_LINELEFT:
nCurrentPos = (UINT)(std::max( (int)0, (int)nCurrentPos-1));
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
case SB_LINERIGHT:
nCurrentPos = std::min((UINT)(m_ChartControl.getTotalEnd()), nCurrentPos+1);
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
case SB_PAGELEFT:
nCurrentPos = (UINT)(std::max( (int)0, (int)nCurrentPos-10));
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
case SB_PAGERIGHT:
nCurrentPos = std::min( (UINT)(m_ChartControl.getTotalEnd()), nCurrentPos+10);
pScrollBar->SetScrollPos (nCurrentPos);
bDoRepaint = true;
break;
}
if ( bDoRepaint )
{
m_ChartControl.setShift(nCurrentPos);
Invalidate();
}
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
如果用户每次重新绘制整个窗口并且闪烁开始时都会移动拇指滑块。
有没有办法避免闪烁?
谢谢,
托马斯
答案 0 :(得分:1)
由于绘图是由m_ChartControl完成的,所以你应该调用m_ChartControl.Invalidate(),而不是对话框的Invalidate。
如果您有m_ChartControl的源代码,请参阅本文及其类CMemDC,以防止在图表控件中出现闪烁。
http://www.codeproject.com/Articles/33/Flicker-Free-Drawing-In-MFC