透明按钮不透明

shandongmn 2012-12-13 03:09:15
透明按钮 实现:


case WM_CTLCOLORBTN:
{

if(GetDlgItem(window,IDC_BUTTON)==(HWND)lparam)
{
SetBkMode((HDC)wparam,OPAQUE);

return (LRESULT)GetStockObject(NULL_BRUSH);
}

return TRUE;


}
break;




drawItem里对该按钮进行贴图strechblt贴图了。

发个运行结果图:







...全文
227 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shandongmn 2012-12-14
  • 打赏
  • 举报
回复
第3 ,wm_ctlcolorbtn返回刷子的问题 无论返回何种刷子,只要设置了背景模式,就不管用了.
shandongmn 2012-12-14
  • 打赏
  • 举报
回复
明白怎么回事了 1. 按钮是需要自绘,wm_btnclorbtn才管用 2. setbkmode与画刷的关系,设置后透明后,已经画的就不起作用了。
gfm688 2012-12-14
  • 打赏
  • 举报
回复
引用
windows程序说: wm_ctlcolorbtn如果有用,那么前提:自绘。 不自绘,wm_ctlcolorbtn是没有意义的。
引用
下面是使用WM_CTLCOLORBTN的问题所在:只有按键拥有者绘制按钮才给其父窗口发送WM_CTLCOLORBTN,而只有拥有者绘制按钮才会响应父窗口消息处理程序对消息的处理,而使用画刷来着色背景。这基本上是没有意义的,因为无论怎样都是由父窗口来负责绘制拥有者绘制按钮。
按键按钮 是指 BS_PUSHBUTTON或BS_DEFPUSHBUTTON风格的按钮, 拥有者绘制按钮 是指BS_OWNERDRAW风格的按钮 它说的“不自绘,wm_ctlcolorbtn是没有意义的” 应该是对按钮不使用视觉样式(经典主题下)而言,因为那时系统画出来的按钮完全把背景遮住了
你妹的特盗不 2012-12-14
  • 打赏
  • 举报
回复
引用 4 楼 shandongmn 的回复:
引用 3 楼 lfs09 的回复:试着新建一个mfc dialog程序,然后往上面,随便拉几个静态文件控件 然后试试下面的代码 所有ID为IDC_STATIC的控件 文字颜色都为红色,背景都透明 C/C++ code?1234567891011121314HBRUSH CMfcDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UIN……
按钮需要自绘。
shandongmn 2012-12-14
  • 打赏
  • 举报
回复
引用 6 楼 jason_wentzel 的回复:
透明按钮,你可以参考 http://www.codeproject.com/Articles/57/CButtonST-v3-9-MFC-Flat-buttons
windows程序设计 第300页 9.2.4自绘按钮那一节的前面一段话: 下面是使用WM_CTLCOLORBTN的问题所在:只有按键和拥有者绘制按钮才给其父窗口发送WM_CTLCOLORBTN,而只有拥有者绘制按钮才会响应父窗口消息处理程序对消息的处理,而使用画刷来着色背景。这基本上是没有意义的,因为无论怎样都是由父窗口来负责绘制拥有者绘制按钮。 在本章后面,我们将说明,在某些情况下,一些类似于WM_CTLCOLORBTN但适用于其它型态控件的消息将更为有用。
孤客天涯 2012-12-13
  • 打赏
  • 举报
回复
yaozhiyong110 2012-12-13
  • 打赏
  • 举报
回复
进onctlcolor不需要自绘属性
shandongmn 2012-12-13
  • 打赏
  • 举报
回复
引用 3 楼 lfs09 的回复:
试着新建一个mfc dialog程序,然后往上面,随便拉几个静态文件控件 然后试试下面的代码 所有ID为IDC_STATIC的控件 文字颜色都为红色,背景都透明 C/C++ code?1234567891011121314HBRUSH CMfcDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ ……
非常感谢 按钮是无法实现的。 我还以为是被wm_drawitem里的 贴图给覆盖了。 我有个问题: 难道对于static 控件而言,不需要设置为自绘风格 onctlcolor就有效吗?
你妹的特盗不 2012-12-13
  • 打赏
  • 举报
回复
试着新建一个mfc dialog程序,然后往上面,随便拉几个静态文件控件  然后试试下面的代码 所有ID为IDC_STATIC的控件 文字颜色都为红色,背景都透明

HBRUSH CMfcDemoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	int nID = pWnd->GetDlgCtrlID();
	pDC->SetBkMode(OPAQUE);
	if( nID == IDC_STATIC) //对指定的控件设属性,你也可以用上面的方法针对所有的标签
	{
		pDC->SetTextColor(RGB(0xFF,0,0) );
		pDC->SetBkMode(TRANSPARENT);
		return HBRUSH(GetStockObject(HOLLOW_BRUSH));
	}
	return hbr;
}
在OnPaint()里面添加以下代码
		CPaintDC dc(this);
		CRect r;
		GetClientRect(&r);
		dc.FillSolidRect(&r,RGB(0xFF,0xFF,0));
shandongmn 2012-12-13
  • 打赏
  • 举报
回复
引用 1 楼 lfs09 的回复:
子控件简明的意思是 你往面板上面拉了一个button,或一个static 文本控件, 这种控件完全是用WINDOWS自带的,才能透明效果,而不是自绘的
windows程序说: wm_ctlcolorbtn如果有用,那么前提:自绘。 不自绘,wm_ctlcolorbtn是没有意义的。
你妹的特盗不 2012-12-13
  • 打赏
  • 举报
回复
子控件简明的意思是 你往面板上面拉了一个button,或一个static 文本控件, 这种控件完全是用WINDOWS自带的,才能透明效果,而不是自绘的

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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