MFC中各種控件透明的实现方法总结.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MFC中各種控件透明的实现方法总结

2010-04-07 MFC中各种控件透明的实现方法总结 文章分类:C++编程 MFC中各种控件透明的实现方法总结 Button: 资料来源: /songsu/articles/1370665.html 关键是其中的OnEraseBkgnd。OnDrawItem只是在原来BUTTON的位置上画了一个椭圆显示BUTTON的位置。 /* ?*??? 画项 ?*/ void CImageButton::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)? { ??? CDC *pDC = CDC::FromHandle(lpDrawItemStruct-hDC); ??? CRect rc(lpDrawItemStruct-rcItem); ??? pDC-SelectStockObject(NULL_BRUSH); ??? pDC-Ellipse(rc); } /**//* ?*??? 擦除背景 ?*/ BOOL CImageButton::OnEraseBkgnd(CDC* pDC)? { ??? CWnd *pParent = GetParent();??? ??? CRect rc; ??? GetWindowRect(rc); ??? pParent-ScreenToClient(rc); ??? pParent-InvalidateRect(rc,false); ??? pParent-UpdateWindow(); ??? CDC *dcParent = pParent-GetDC();??? ??? pDC-BitBlt(0,0,rc.Width(),rc.Height(),dcParent,rc.left,rc.top,SRCCOPY); ??? pParent-ReleaseDC(dcParent); ?return true; } ? 如何在EDITBOX控件中使用背景位图 方法一: 资料来源: /document/viewdoc/?id=360 摘要:在VC中,标准的WINDOWS控件如TREEVIEW,EDITBOX,COMBOBOX和LISTBOX等控件都不支持选择背景位图的属性,所以如果要使这些标准控件达到这种效果,必须有些非常规的方法。本文介绍一个CEDIT类如何实现背景位图,并且可以更换背景的例子。可能实现的方法还有其它种,如果有兴趣可以大家探讨。效果如图: 关于网上这个方法:我按照文中的方法进行多次尝试,始终不能达到理想的效果,下载下来的代码编译后效果很理想,但我多次尝试未果后,我将源码中的MyEditCtrl类直接拿来用了,尝试按照源码中的模式进行编码,但效果仍是不理想的。可能是我在某方面出了差错。 效果如图: 注意我故意将编辑框缩小,以便能显示出后面的背景,可以看到背景是画出来了,但是编辑框是黑色的。 方法二: 于是我尝试查找其他的实现方法,在网上看到了这篇文章: /cpp/controls/editctrl/transparent/article.php/c3921/ 这篇文章虽然是想实现透明的,但我觉得他的透明效果实现的并不理想。但对于背景位图的实现很有启发。 下载了源码,发现他并没有重载CEdit类,而是直接在Dialog中的重载函数OnCtlColor()中进行的修改,我模仿他的方法进行了尝试,实现的效果比较理想,效果如图: 从实现效果来讲,还算理想,但这种方法有一个缺陷,那就是,背景图只能画在Edit控件的内部,而我想要实现的效果是将“电话图标”作为编辑框的图标来显示,而在输入的时候直接在“电话图标”的后面的编辑框中进行,这就要求将背景位图“前移”一段距离,画到编辑框的外面,可这种方法是无法实现的,一种伪实现是,将这张背景图片切割成两部分,“电话图标”部分在Dialog中来画,后半部分作为编辑框的背景来画。虽然效果是一样的,但这不是我想要的理想结果。看来要实现这种效果,只能通过重载CEdit类来实现了,所以方法一我究竟错在哪里,害要继续研究。 方法二的关键代码: 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()函数是创建画刷的函数,根据需要选择具体的创建函数

文档评论(0)

sd47f8cI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档