对话框设置位图背景并透明控件.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文档。上传文档
查看更多
对话框设置位图背景并透明控件

1、使用OnEraseBkgnd函数实现对话框位图背景(CABoutDialog______WM_ERASEBKGN_____MDI Child Frame) BOOL CDisplayBmpBackGroundDlg::OnEraseBkgnd(CDC?? *pDC)? { ?CRect rect; ?GetClientRect(rect); ?CBitmap m_pBmp; ?BITMAP bm; ?CDC dcMem; ?m_pBmp.LoadBitmap(IDB_BITMAP1); ?m_pBmp.GetBitmap(bm);//得到位图尺寸 ?dcMem.CreateCompatibleDC(pDC); ?CBitmap* pOldBitmap = dcMem.SelectObject(m_pBmp); ??pDC-SetStretchBltMode(COLORONCOLOR);//这个模式不设置的话会导致图片严重失真 ?pDC-StretchBlt(0,0,rect.Width() ,rect.Height(), ??dcMem,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); ?dcMem.SelectObject(pOldBitmap); ?return TRUE; } ? 到这里就可以实现位图了,但STATIC控件背景不透明,显得很难看。 ? 2、来我们让STATIC控件透明吧 HBRUSH CDisplayBmpBackGroundDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { ?if(nCtlColor == CTLCOLOR_DLG || nCtlColor == CTLCOLOR_BTN || nCtlColor ==? CTLCOLOR_STATIC) ?? ?{?? ???????? pDC-SetBkMode(TRANSPARENT);???? ?}?? ?return?? HBRUSH(GetStockObject(HOLLOW_BRUSH)); } 到这里其实就可以了,BMP的图片背景实现了,文本框的透明也实现了。 ? 3、补充说明:如果程序运行过程中,需要设置文本框的字体的话,会出现显示字体重叠不刷新的问题 ? 4、这就要对该控件或者对话框处理了,要刷出新字体来。 ?CWnd* pWnd = GetDlgItem(IDC_STATIC1); ?pWnd-SetWindowText();//需要修改的控件标题 ? //这里可以刷整个对话框,但如果较频繁的话,很明显能看出来,就选择刷显示字体的那块区域就可以了 pWnd -GetParent()-InvalidateRect(CRect(0,0,100,50),TRUE); Static控件背景透明时文字覆盖问题的解决方案 HateMath 引子: ??? 我泡论坛的时间并不长,但印象中已经有好多次在VC区看到类似这样的问题,而且经常议之未果: static控件设置透明后,再更改文字时会与之前的文字覆盖,怎么解决 用pDC-SetBkMode(TRANSPARENT); 设置透明后,要改变控件的文字就会发生文字重叠,如果不使用透明就不会,请问在透明状态下改变文字如何不发生重叠? 起初不以为意,闲暇时自己试了一下,发现:文本确实有重叠。如下图(为了更好的说明问题,我特意设置了背景和前景色): 初步探究其原因,猜想应该是static控件的背景没有得到及时刷新。 那就好办了,解决办法:强制刷新。 方法1:GetDlgItem(IDC_STATIC)-UpdateWindow(); 无效... 方法2:GetDlgItem(IDC_STATIC)- RedrawWindow(); 无效....... 方法3:GetDlgItem(IDC_STATIC)- Invalidate (); 无效......... 方法4:还不行?来点小技巧 SetDlgItemText(IDC_STATIC, );//多用几个空格,把原先的文本”冲”掉 SetDlgItemText(IDC_STATIC, TEST); 郁闷了……. 难道这么个小问题要用高级的方法搞? 这个问题困扰了我好几天,终于在一次上WC时突然顿悟:static的背景已经是透明的了,那么残留的文本应该是画在static的父窗口上的。顿悟之后就是感叹:自己真笨啊。 办法有了:在给static设置新的文本之后(不是之前!)刷新父窗口。 void CTestStaticDlg::OnTimer(UINTnIDEvent) { CStringstrTime;

文档评论(0)

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

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

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档