如何在EDITBOX控件中使用背景位图

翻译|其它|编辑:郝浩|2005-10-27 11:25:00.000|阅读 1650 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


下载本文源代码

在VC中,标准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持选择背景位图的属性,所以如果要使这些标准控件达到这种效果,必须有些非常规的方法。本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。可能实现的方法还有其它种,如果有兴趣可以大家探讨。
本文程序运行效果图

下面介绍CMYEDITCTRL类几个关键变量和函数。

第一步在该类中增加几个变量;

public:
CBitmap m_bmp;
protected:
CBrush m_brHollow;
CBitmap *m_pbmCurrent;

第二步 重载部分函数:

afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnChange();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);

各个函数的具体作用:

2.1 OnChange();

如果没有这个函数,你敲几个字符如 ABCDEDFG,然后删除两个FG,但是EDITBOX并未更新。添加这个函数主要是这个原因。void CMyEditCtrl::OnChange()
{
Invalidate(); ///强制进行更新
}

2.2 OnLButtonUp();


也类似,是你鼠标选择时候的刷新问题,如果你有兴趣,可以先把它注释掉,看看BUG是怎么出现的。void CMyEditCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
    Invalidate(); ///强制进行更新
    CEdit::OnLButtonUp(nFlags, point);
}

2.3 CtlColor(CDC* pDC, UINT nCtlColor)

一般的文字的默认背底是白色的,这儿选择了透明的形式,所以底图可以显示。HBRUSH CMyEditCtrl::CtlColor(CDC* pDC, UINT nCtlColor)
{
   pDC->SetBkMode(TRANSPARENT); ///选择透明背景模式
   pDC->SetTextColor(RGB(0xff,0xff,0xff)); ///设置文字颜色为白色
   return m_brHollow;
}

2.4 OnEraseBkgnd(CDC* pDC)


主要把选好的背景位图显示出来。 BOOL CMyEditCtrl::OnEraseBkgnd(CDC* pDC)
{
    BITMAP bm;
    m_bmp.GetBitmap(&bm);
    m_pbmCurrent = &m_bmp;
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = dcMem.SelectObject(m_pbmCurrent); ///选择位图
    pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY); ///画出位图
    dcMem.SelectObject(pOldBitmap);
    return TRUE;
}

说明:其中代码有些部分简化了,有些部分还可以优化。对于底图的选择,在这里我选择是与我EDITBOX一样大小的底图,如果两者不一样大小,需要修改部分OnEraseBkgnd(CDC* pDC)代码。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP