如何通过自绘实现控件背景透明

thundersung 2013-12-11 09:55:33
咱的控件是个CStatic,每隔一秒钟会改变上面的字符串;
父控件是个CDialogEx,本身的背景是个会随窗口大小改变而拉伸的图片。
现在想让CStatic透明,在父窗口里OnCtlColor里SetBkMode了,但光这样父窗口改变大小时会闪烁晃眼,所以还得自绘,想问问如何在OnPaint里获取CStatic对应的父窗口背景并build到memDC里(用双缓存了)?
麻烦那倆行代码给一下呗。俺还不太会中文翻c++。。。
...全文
173 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
thundersung 2013-12-11
  • 打赏
  • 举报
回复
引用 1 楼 CometNet 的回复:
标签背景透明以及文字重叠问题解决方法 http://bbs.csdn.net/topics/390401008 自绘实现半透明水晶按钮 http://bbs.csdn.net/topics/390336507
Well,交给父窗口的话,不知为啥文字显示一下就消失了。。。 现在SetBKMode放在子控件自己的CtlColor里处理了,然后DefWindowProc里当WM_SETTEXT时刷新父窗口的这部分rect。只是小小的遗憾是没重载OnPaint的话,拖拽改变父窗口大小时子控件晃眼——所以才想知道咋在子控件OnPaint里获得父窗口相应位置的背景图片,应该是用那个BitBlt啥名的函数来着,放memDC里,再memDC上DrawText,最后BitBlt回原本的DC里。不过,Funny的是,俺中文记下来了,翻译成C++代码的话忘记了。。。
thundersung 2013-12-11
  • 打赏
  • 举报
回复
引用 5 楼 qinqian19 的回复:
void CUserLoadDlg::OnPaint() { CPaintDC dc(this); CDC *pDC=&dc; CRect rt=m_rcClient; CDC MemDC; CBitmap MemBitmap; MemDC.CreateCompatibleDC(pDC); if (MemDC) { MemBitmap.CreateCompatibleBitmap(pDC,rt.right,rt.bottom); CBitmap *pOldBit =MemDC.SelectObject(&MemBitmap); MemDC.FillSolidRect(rt.left,rt.top,rt.right,rt.bottom, RGB(34,34,34)); DrawAll(&MemDC); pDC->BitBlt(rt.left,rt.top,rt.right,rt.bottom,&MemDC,rt.left,rt.top,SRCCOPY); MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC(); } CDialog::OnPaint(); }
嗯,介个系父窗口自绘哩。。。 儿子是个继承CStatic的,现在想在儿子的OnPaint里面获取父亲窗口里儿子这块Rect的背景图片然后画到儿子自己的DC上来,所以儿子的类似DrawAll的地方里面是怎么实现的?
晴天1719 2013-12-11
  • 打赏
  • 举报
回复
void CUserLoadDlg::OnPaint() { CPaintDC dc(this); CDC *pDC=&dc; CRect rt=m_rcClient; CDC MemDC; CBitmap MemBitmap; MemDC.CreateCompatibleDC(pDC); if (MemDC) { MemBitmap.CreateCompatibleBitmap(pDC,rt.right,rt.bottom); CBitmap *pOldBit =MemDC.SelectObject(&MemBitmap); MemDC.FillSolidRect(rt.left,rt.top,rt.right,rt.bottom, RGB(34,34,34)); DrawAll(&MemDC); pDC->BitBlt(rt.left,rt.top,rt.right,rt.bottom,&MemDC,rt.left,rt.top,SRCCOPY); MemDC.SelectObject(pOldBit); MemBitmap.DeleteObject(); MemDC.DeleteDC(); } CDialog::OnPaint(); }
thundersung 2013-12-11
  • 打赏
  • 举报
回复
引用 3 楼 sd__q 的回复:
[quote=引用 2 楼 thundersung 的回复:] [quote=引用 1 楼 CometNet 的回复:] 标签背景透明以及文字重叠问题解决方法 http://bbs.csdn.net/topics/390401008 自绘实现半透明水晶按钮 http://bbs.csdn.net/topics/390336507
Well,交给父窗口的话,不知为啥文字显示一下就消失了。。。 现在SetBKMode放在子控件自己的CtlColor里处理了,然后DefWindowProc里当WM_SETTEXT时刷新父窗口的这部分rect。只是小小的遗憾是没重载OnPaint的话,拖拽改变父窗口大小时子控件晃眼——所以才想知道咋在子控件OnPaint里获得父窗口相应位置的背景图片,应该是用那个BitBlt啥名的函数来着,放memDC里,再memDC上DrawText,最后BitBlt回原本的DC里。不过,Funny的是,俺中文记下来了,翻译成C++代码的话忘记了。。。[/quote] 。。双缓冲绘图。。论坛里面很多的[/quote] 俺就是不会在双缓存里往memDC里读取当前控件对应的父窗口那部分的图片。。。好像也用到BitBlt,不过具体的代码过程啥的忘了,网上居然没搜到。。。。
sd__q 2013-12-11
  • 打赏
  • 举报
回复
引用 2 楼 thundersung 的回复:
[quote=引用 1 楼 CometNet 的回复:] 标签背景透明以及文字重叠问题解决方法 http://bbs.csdn.net/topics/390401008 自绘实现半透明水晶按钮 http://bbs.csdn.net/topics/390336507
Well,交给父窗口的话,不知为啥文字显示一下就消失了。。。 现在SetBKMode放在子控件自己的CtlColor里处理了,然后DefWindowProc里当WM_SETTEXT时刷新父窗口的这部分rect。只是小小的遗憾是没重载OnPaint的话,拖拽改变父窗口大小时子控件晃眼——所以才想知道咋在子控件OnPaint里获得父窗口相应位置的背景图片,应该是用那个BitBlt啥名的函数来着,放memDC里,再memDC上DrawText,最后BitBlt回原本的DC里。不过,Funny的是,俺中文记下来了,翻译成C++代码的话忘记了。。。[/quote] 。。双缓冲绘图。。论坛里面很多的

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧