WTL 透明CStatic的问题

hslinux 2010-11-30 10:52:12
WTL开发的WM程序,想做一个透明的Lable,处理了WM_CTLCOLORSTATIC,但是没能实现想要的效果。

LRESULT CTestDlg::OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
}

敬请大虾们指点一二。
...全文
495 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-12-24
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
hslinux 2010-12-02
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101130/10/d2476e81-5ee1-4da2-b920-a5726131a674.html

同样的帖子,大家过去抢分吧~~~

帖子是论坛维护那会发的,貌似现在就我可以看到这个地址。。。。。。
Eleven 2010-12-02
  • 打赏
  • 举报
回复
或者使用DrawText
Eleven 2010-12-02
  • 打赏
  • 举报
回复
直接TextOut输出文本
hslinux 2010-12-02
  • 打赏
  • 举报
回复
纠结~~~~~~
hslinux 2010-12-02
  • 打赏
  • 举报
回复

WTL开发的WM程序,,,,WM程序,,,WM-->Windows Mobile

Windows下实现的代码,楼上的代码基本上都可以实现,但是在WM下还是不可以。

有一种做法,就是获取父窗口的DC,把这个DC拷贝到CStatic控件的DC来,用这个DC来画CStatic控件的背景,这种做法在windows下可以达到目的,但是WM下还是无法达到目的。可能原因还是这个:
绘对话框背景的时候,根本就没有去画对话框上面那些控件所在位置,也就是那些控件的背景还是系统默认的背景。这个现象在WM下调试,通过设置断点,在模拟器可以看到。Windows下进断点后,程序界面就看不到了,无法确认是相同的表现。
个人理解:因为WM下画对话框时,控件虽在位置没有被画,所以通过父窗口DC画CStatic背景后出来的效果还是跟上面13楼的图一个效果。



xyytuo 2010-12-02
  • 打赏
  • 举报
回复
jameshooo 2010-12-01
  • 打赏
  • 举报
回复
static的窗口扩展风格有指定WS_EX_TRANSPARENT吗?
kintar_chu 2010-12-01
  • 打赏
  • 举报
回复
HBRUSH CCopyObjFileDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() == IDC_STATICNAME || pWnd->GetDlgCtrlID() == IDC_STATICMSG)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0, 0, 255));
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
return hbr;
}
// 这个是之前做的一个satic透明的,
注意一点.在给static设置内容后需要刷新一下static控件.否则出现内容叠加的效果,
GetDlgItem(IDC_STATICMSG)->GetWindowRect(&rcEdit);
SetDlgItemText(IDC_STATICMSG, m_Msg);
this->InvalidateRect(&rcEdit, TRUE);
hslinux 2010-12-01
  • 打赏
  • 举报
回复

今天想了了,跟踪了下代码,看了看在不同时刻界面的显示,发现绘对话框背景的时候,根本就没有去画对话框上面那些控件所在位置,也就是那些控件的背景还是系统默认的背景。
高手指点下,这个时候该如何处理?
羽毛乱发 2010-12-01
  • 打赏
  • 举报
回复
直接用人家的界面的,帮顶下!
hslinux 2010-12-01
  • 打赏
  • 举报
回复

目前效果:


背景是一张BMP图片,在OnEraseBkgnd里面绘:
    LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if ( NULL != m_pBgBmp )
{
CDCHandle dc((HDC)wParam);
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
HBITMAP hOldBmp = dcMem.SelectBitmap(*m_pBgBmp);
SIZE sizeBmp;
m_pBgBmp->GetSize(sizeBmp);
dc.BitBlt(0, 0, sizeBmp.cx, sizeBmp.cy, dcMem, 0, 0, SRCCOPY);
dcMem.SelectBitmap(hOldBmp);
dcMem.DeleteDC();
}

return 0;
}


然后就是处理WM_CTLCOLORSTATIC消息了:
LRESULT CTestDlg::OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
}


目标就是为了实现Static Text控件只显示文字,背景就是对话框的背景。

job82824 2010-12-01
  • 打赏
  • 举报
回复
我模拟的效果
job82824 2010-12-01
  • 打赏
  • 举报
回复
类似的效果图


背景色使用低Alpha通道的颜色数,前景色采用高Alpha的通道数;使用UpdateLayeredWindow进行窗口的裁剪即可实现透明效果。
pexwin 2010-12-01
  • 打赏
  • 举报
回复
这样不能保证结果是透明的,只是你贴了图片、绘制的文字等在子窗口上是透明的,你可以尝试,或者背景该部分的画刷,先刷上父窗口的图像,在绘制子窗口文字。这样才能实现。
cnzdgs 2010-12-01
  • 打赏
  • 举报
回复
对话框不要设置WS_CLIPCHILDREN风格.
xzjxylophone 2010-12-01
  • 打赏
  • 举报
回复
我有个从 网上 下载的CLabel类

然后我自己修改了下

应该可以满足你的需求的

13楼的效果(白色那一块是 原来的背景图片)

就像 11楼中 label 的效果一样

要的留言

关键性代码我改了这出:
HBRUSH CLabel::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here

// TODO: Return a non-NULL brush if the parent's handler should not be called

if (CTLCOLOR_STATIC == nCtlColor)
{
pDC->SelectObject(&m_font);
pDC->SetTextColor(m_crText);
pDC->SetBkMode(TRANSPARENT);
//设置透明
HBRUSH temp = HBRUSH(GetStockObject(HOLLOW_BRUSH));

return temp;

}


if (m_Type == Background)
{
if (!m_bState)
return m_hwndBrush;
}

return m_hBrush;
}
beaugauge2010 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hslinux 的回复:]
今天想了了,跟踪了下代码,看了看在不同时刻界面的显示,发现绘对话框背景的时候,根本就没有去画对话框上面那些控件所在位置,也就是那些控件的背景还是系统默认的背景。
高手指点下,这个时候该如何处理?
[/Quote]

低效率的办法是,你把下面图片的相关部分拷贝到你重载的CStatic内. 现在机器的cpu都够强,应该用着还不错.

-------------------
BeauGauge Suite V2 虚拟仪表控件升级至2.2哦
www.beaugauge.com
beaugauge2010 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 job82824 的回复:]
类似的效果图


背景色使用低Alpha通道的颜色数,前景色采用高Alpha的通道数;使用UpdateLayeredWindow进行窗口的裁剪即可实现透明效果。
[/Quote]

这个是整个界面都是透明的吗
forzy 2010-12-01
  • 打赏
  • 举报
回复
这些代码应该是没问题的,可能你其他地方搞错了

刚刚写的wtl工程:http://u.115.com/file/f05dc180df
加载更多回复(7)

15,979

社区成员

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

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