透明按钮 实现:
case WM_CTLCOLORBTN:
{ if(GetDlgItem(window,IDC_BUTTON)==(HWND)lparam)
{
SetBkMode((HDC)wparam,OPAQUE); return (LRESULT)GetStockObject(NULL_BRUSH);
} return TRUE;
}
break;
drawItem里对该按钮进行贴图strechblt贴图了。发个运行结果图:
case WM_CTLCOLORBTN:
{ if(GetDlgItem(window,IDC_BUTTON)==(HWND)lparam)
{
SetBkMode((HDC)wparam,OPAQUE); return (LRESULT)GetStockObject(NULL_BRUSH);
} return TRUE;
}
break;
drawItem里对该按钮进行贴图strechblt贴图了。发个运行结果图:
你往面板上面拉了一个button,或一个static 文本控件,
这种控件完全是用WINDOWS自带的,才能透明效果,而不是自绘的
然后试试下面的代码
所有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));
非常感谢
按钮是无法实现的。我还以为是被wm_drawitem里的 贴图给覆盖了。我有个问题:难道对于static 控件而言,不需要设置为自绘风格onctlcolor就有效吗?
http://www.codeproject.com/Articles/57/CButtonST-v3-9-MFC-Flat-buttons
windows程序设计 第300页9.2.4自绘按钮那一节的前面一段话:
下面是使用WM_CTLCOLORBTN的问题所在:只有按键和拥有者绘制按钮才给其父窗口发送WM_CTLCOLORBTN,而只有拥有者绘制按钮才会响应父窗口消息处理程序对消息的处理,而使用画刷来着色背景。这基本上是没有意义的,因为无论怎样都是由父窗口来负责绘制拥有者绘制按钮。在本章后面,我们将说明,在某些情况下,一些类似于WM_CTLCOLORBTN但适用于其它型态控件的消息将更为有用。
按键按钮 是指 BS_PUSHBUTTON或BS_DEFPUSHBUTTON风格的按钮,
拥有者绘制按钮 是指BS_OWNERDRAW风格的按钮它说的“不自绘,wm_ctlcolorbtn是没有意义的” 应该是对按钮不使用视觉样式(经典主题下)而言,因为那时系统画出来的按钮完全把背景遮住了