首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  界面/窗口  |  编辑控件   


 图片背景编辑框的实现


原作者:zhoudb    源出处:CSDN    发布者:施昌权    发布类型:转载    发布日期:2008-09-26

              

       在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)代码。
       基本上这个类的功能就这样实现了。


关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号