透明的label,如何做?

ciahi 2009-11-17 07:17:47
应该怎么处理?

我在OnEraseBkGrnd里面获取父窗口的dc,用bitblt拷过来,没有效果。
我在这里面,将这个父窗口的dc拷贝到别处,发现这个dc已经被控件所覆盖了。

大家是如何处理的?
我如果处理OnCtlColorStatic的话,我应该返回什么值?
return (HBRUSH)::GetStockObject(NULL_BRUSH); 也是没有效果

谢谢!!!
...全文
655 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ciahi 2009-11-30
  • 打赏
  • 举报
回复
呵呵,e_play是啥?

我搜了下都没找到 :-(
ciahi 2009-11-24
  • 打赏
  • 举报
回复
恩,主要是label比较好组织

比如说我可以很容易的控制它的显示隐藏等

谢谢大家了
貌视透明label确实很麻烦
linuxghs 2009-11-24
  • 打赏
  • 举报
回复
这个代码可以避免那种透明把背景图都透明的缺点。
效果比较好。呵呵
linuxghs 2009-11-24
  • 打赏
  • 举报
回复
可以用e_play实现,仔细看代码就OK了。
  • 打赏
  • 举报
回复
直接画字体就可以了吧。非要透明label不是挺麻烦的么
nihao38 2009-11-23
  • 打赏
  • 举报
回复
e_play 2009-11-20
  • 打赏
  • 举报
回复
如果只是label的话,那就不如直接drawtext了
e_play 2009-11-20
  • 打赏
  • 举报
回复
是不是有背景图?我的方法如下
在OnInitDialog中:
m_hBmpBKgnd=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP_BACKGROUND));
if( m_hBmpBKgnd )
{
m_hBrCtl[0] = GetBkBrush( GetSafeHwnd(), IDC_STATIC_NAME, m_hBmpBKgnd );
m_hBrCtl[1] = GetBkBrush( GetSafeHwnd(), IDC_STATIC_PASSWORD, m_hBmpBKgnd );
m_hBrCtl[2] = GetBkBrush( GetSafeHwnd(), IDC_CHECK_PASSWORD, m_hBmpBKgnd );
m_hBrCtl[3] = GetBkBrush( GetSafeHwnd(), IDC_CHECK_AUTOLOGON, m_hBmpBKgnd );
}

在OnPaint中
CPaintDC dc(this); // device context for painting	
// Draw our own background image

CDC memDC;
CBitmap bmBkgnd;
bmBkgnd.Attach( m_hBmpBKgnd );

memDC.CreateCompatibleDC(&dc);
CBitmap *pOldBm = memDC.SelectObject( &bmBkgnd );

BITMAP bm;
bmBkgnd.GetObject(sizeof(bm), &bm);


dc.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &memDC, 0, 0, SRCCOPY );
memDC.SelectObject( pOldBm );
bmBkgnd.Detach();

在OnCtlColor中
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);


UINT nID = ::GetDlgCtrlID( pWnd->GetSafeHwnd() );

pDC->SetBkMode(TRANSPARENT );

switch( nID )
{
case IDC_STATIC_NAME: return m_hBrCtl[0];
case IDC_STATIC_PASSWORD: return m_hBrCtl[1];
case IDC_CHECK_PASSWORD: return m_hBrCtl[2];
case IDC_CHECK_AUTOLOGON: return m_hBrCtl[3];
}

return hbr;

最后在OnDestory中
CDialog::OnDestroy();

::DeleteObject( m_hBmpBKgnd );
::DeleteObject( m_hBrCtl[0] );
::DeleteObject( m_hBrCtl[1] );
::DeleteObject( m_hBrCtl[2] );
::DeleteObject( m_hBrCtl[3] );
文斌 2009-11-18
  • 打赏
  • 举报
回复
如果只是LABEL,不如直接写文字。或者重载ONPAINT方法
世外涛缘 2009-11-18
  • 打赏
  • 举报
回复
直接画文字不好么,实现透明更麻烦。
欧巴Godwin 2009-11-17
  • 打赏
  • 举报
回复
不能做到真正意义上的透明Label,只能做到伪透明:就是说用自己的控件作为容器,再在这个容器上放自制的Label,那么容器在枚举、重画内部控件时,就能使这个Label透明。。。

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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