MFC中各种控件透明的实现方法总结
《MFC中各种控件透明的实现方法总结》由会员分享,可在线阅读,更多相关《MFC中各种控件透明的实现方法总结(5页珍藏版)》请在装配图网上搜索。
1、2010-04-07MFC中各种控件透明的实现方法总结文章分类:C+编程MFC 中各种控件透明的实现方法总结Button:资料来源:关键是其中的OnEraseBkgnd0nDrawItem只是在原来BUTTON的位置上画了一个椭圆显示BUTTON 的位置。/* 画项*/void CImageButton:0nDrawItem(int nlDCtl, LPDRAWITEMSTRUCT lpDrawItemStruet)CDC *pDC = CDC:FromHandle(lpDrawItemStruet-hDC); CReet re(lpDrawItemStruet-reItem); pDC-Se
2、leetStoekObjeet(NULL_BRUSH); pDC-Ellipse(re);/*/*擦除背景*/BOOL CImageButton:OnEraseBkgnd(CDC* pDC)CWnd *pParent = GetParent(); ICReet rc;GetWindowReet(re);pParent-SereenToClient(re);pParent-InvalidateReet(re,false);pParent-UpdateWindow();CDC *deParent = pParent-GetDC();pDC-BitBlt(0,0,re.Width(),re.Heig
3、ht(),deParent,re.left,re.top,SRCCOPY);pParent-ReleaseDC(dcParent);return true;如何在EDITBOX控件中使用背景位图方法一:资料来源:摘要:在 VC 中,标准的 WINDOWS 控件如 TREEVIEW,EDITBOX,COMBOBOX 和 LISTBOX 等控件都不 支持选择背景位图的属性,所以如果要使这些标准控件达到这种效果,必须有些非常规的方法。本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。可能实现的方法还有其它 种,如果有兴趣可以大家探讨。效果如图:关于网上这个方法:我按照文中的方法进行多
4、次尝试,始终不能达到理想的效果,下载下来的代 码编译后效果很理想,但我多次尝试未果后,我将源码中的 MyEditCtrl 类直接拿来用了,尝试 按照源码中的模式进行编码,但效果仍是不理想的。可能是我在某方面出了差错。效果如图:注意我故意将编辑框缩小,以便能显示出后面的背景,可以看到背景是画出来了,但是编辑框是黑色的。方法二:于是我尝试查找其他的实现方法,在网上看到了这篇文章 这篇文章虽然是想实现透明的,但我觉得他的透明效果实现的并不理想。但对于背景位图的实现 很有启发。下载了源码,发现他并没有重载CEd it类,而是直接在Dialog中的重载函数OnC tlColor ()中 进行的修改,我模
5、仿他的方法进行了尝试,实现的效果比较理想,效果如图:从实现效果来讲,还算理想,但这种方法有一个缺陷,那就是,背景图只能画在 Edit 控件的内 部,而我想要实现的效果是将“电话图标”作为编辑框的图标来显示,而在输入的时候直接在 “电话图标”的后面的编辑框中进行,这就要求将背景位图“前移”一段距离,画到编辑框的外 面,可这种方法是无法实现的,一种伪实现是,将这张背景图片切割成两部分,“电话图标”部 分在Dialog中来画,后半部分作为编辑框的背景来画。虽然效果是一样的,但这不是我想要的 理想结果。看来要实现这种效果,只能通过重载 CEdit 类来实现了,所以方法一我究竟错在哪里, 害要继续研究。
6、方法二的关键代码:if (pWnd-GetDlgCtrlID() = IDC_EDIT_IMAGE)pDC-SetBkMode(TRANSPARENT);pDC-SetTextColor(RGB(0,0,255);pDC-SelectObject(&m_brush2);return m_brush2;几点注意的地方:1. m_brush2是成员变量,也就是要保证它的生命周期不能只在重载函数OnCtlColor ()中。2. m_brush2.CreateXXX()函数是创建画刷的函数,根据需要选择具体的创建函数,注意不要把该 函数放在会被多次调用的函数(比如重载函数OnCtlColor()中,
7、以免多次创建错误,除非 你在第二次创建之前调用了 m_brush. DeleteObject ()函数。3. 直接拷贝上面的代码是效果是出不来的,你还需要一个 CBitmap 位图对象,并初始化它和 m_brush2 对象。Transparent Edit Box为了搞定这个效果,花费了我不少时间。透明的伪实现:Edit Box 的颜色分为 3 部分,文字颜色,文字背景色,编辑框背景色。所以如果“文字背景色, 编辑框背景色”能和对话框背景色一直的话,就能实现透明。方法一:直接在 Dialog 中的重载函数 OnCtlColor 里实现:if (pWnd-GetDlgCtrlID() = IDC
8、_TRANS_EDIT) pDC-SetBkColor(RGB(236,233,216);return m_brush;注意m_brush是成员变量,是为RGB(236,233,216)的纯色画刷。该颜色就是对话框的背景色。方法二:通过继承CEdit类来实现.网上找到的,一种伪实现的方法:透明的 True Implementaion 分析:方法一:一个不太完美的实现方法。根据前面的分析ret urn m_brush能够改变“编辑框背景色,而Set BkColor能够改变“文字背 景色”。在这里,我可以得到一个Dialog的DC然后把Edit的区域的位图信息复制出来保存成一个 CBit map对象,在用这个bit map对象创建一个画刷,把这个画刷返回,让对话框有这个画刷绘 制控件。从某种角度来说,透明Edit是实现了,但当把鼠标点击“文字背景色”时,能够看到一个黑色 的区域。很不理想。这种情况与上面位图背景中提到的方法一所遇到的问题有点类似,只是通常情况下看不到黑框 了。Owner Draw Progress Control资料来源:实例一:实例二:关于资料:实例一实现了 彩色颜色渐变进度条, 实例二实现了贴图进度条。我只实现了实例一,还没有实现实例二。
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。