带背景图的EDIT控件滚动滚动条时字体重叠出现重影

在我们使用MFC的EDIT控件时,为了能加载背景位图后正常显示背景和字体,我们经常采用在OnCtlColor方法中设置控件的透明属性,如上所示代码。但是这样设置透明属性后会导致EDIT滚动时出现字体叠影的情况,此时如果取消透明属性,EDIT控件无法正常显示背景图,可以采用自己绘画背景。但是也可通过刷新的方法解决这个问题,虽然不是最佳的方式,不妨试一下。

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;
        
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值