在我们使用MFC的EDIT控件时,为了能加载背景位图后正常显示背景和字体,我们经常采用在OnCtlColor方法中设置控件的透明属性,如上所示代码。但是这样设置透明属性后会导致EDIT滚动时出现字体叠影的情况,此时如果取消透明属性,EDIT控件无法正常显示背景图,可以采用自己绘画背景。但是也可通过刷新的方法解决这个问题,虽然不是最佳的方式,不妨试一下。
我们可以通过得到EDIT当前显示的条数来自动实现滚动条是显示还是隐藏,如下所示,通过setTimer不断的检查EDIT显示内容是否超出,如何超出显示滚动条,否则隐藏。
但是当我们使用的控件出现滚动条时,我们移动滚动条就会出现字体重叠的现象,这是由于界面没有刷新造成的,如果我们强制的不断用Invalidate刷新,界面显示可以正常,但是会出现闪烁,因为刷新频过快,此时我们可以考虑
用定时器来刷新,具体做法添加OnTimer方法,在onInitDialog中setTimer(1, 10, NULL), 然后再OnTimer其中如下实现
if(IDC_EDIT1 ==pWnd->GetDlgCtrlID() )
{
pDC->SetBkColor(RGB(255,255,255));
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);
}
我们可以通过得到EDIT当前显示的条数来自动实现滚动条是显示还是隐藏,如下所示,通过setTimer不断的检查EDIT显示内容是否超出,如何超出显示滚动条,否则隐藏。
但是当我们使用的控件出现滚动条时,我们移动滚动条就会出现字体重叠的现象,这是由于界面没有刷新造成的,如果我们强制的不断用Invalidate刷新,界面显示可以正常,但是会出现闪烁,因为刷新频过快,此时我们可以考虑
用定时器来刷新,具体做法添加OnTimer方法,在onInitDialog中setTimer(1, 10, NULL), 然后再OnTimer其中如下实现
switch(nIDEvent)
{
case 1:
{
TEXTMETRIC tm;
// CRect rect;
m_edit.GetClientRect(&rect);
CDC* pdc = m_edit.GetDC();
::GetTextMetrics(pdc->m_hDC,&tm);
m_edit.ReleaseDC(pdc);
m_nLineCount = rect.bottom/(tm.tmHeight-1.5); //获取当前EDIT客户区可显示的行数
int nLine = m_edit.GetLineCount(); //待显示信息行数
if( nLine > m_nLineCount)
{
m_edit.ShowScrollBar(SB_VERT, TRUE); //显示超出EDIT当前界面, 显示滚动条
int nVertPos = GetDlgItem(IDC_EDIT1)->GetScrollPos(SB_VERT); //得到当前滚动条位置
if(m_VscPos != nVertPos)
{
m_VscPos = nVertPos; // m_VscPos用来保存每次移动后的滚动条值,如果没有移动就不启动刷新
SetTimer(2, 10, NULL); // 滚动条变化一次就刷新一次
}
}
else
{
m_edit.ShowScrollBar(SB_VERT, FALSE); //隐藏进度条
}
}
break;
case 2:
RedrawWindow(); //刷新一次
KillTimer(2);
break;
}