透明按钮 实现:
case WM_CTLCOLORBTN:
{ if(GetDlgItem(window,IDC_BUTTON)==(HWND)lparam)
{
SetBkMode((HDC)wparam,OPAQUE); return (LRESULT)GetStockObject(NULL_BRUSH);
} return TRUE;
}
break;
drawItem里对该按钮进行贴图strechblt贴图了。发个运行结果图:

解决方案 »

  1.   

    子控件简明的意思是
    你往面板上面拉了一个button,或一个static 文本控件,
    这种控件完全是用WINDOWS自带的,才能透明效果,而不是自绘的
      

  2.   

    windows程序说:wm_ctlcolorbtn如果有用,那么前提:自绘。不自绘,wm_ctlcolorbtn是没有意义的。
      

  3.   

    试着新建一个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));
      

  4.   


    非常感谢
    按钮是无法实现的。我还以为是被wm_drawitem里的 贴图给覆盖了。我有个问题:难道对于static 控件而言,不需要设置为自绘风格onctlcolor就有效吗?
      

  5.   

    透明按钮,你可以参考
    http://www.codeproject.com/Articles/57/CButtonST-v3-9-MFC-Flat-buttons
      

  6.   


    windows程序设计 第300页9.2.4自绘按钮那一节的前面一段话:
    下面是使用WM_CTLCOLORBTN的问题所在:只有按键和拥有者绘制按钮才给其父窗口发送WM_CTLCOLORBTN,而只有拥有者绘制按钮才会响应父窗口消息处理程序对消息的处理,而使用画刷来着色背景。这基本上是没有意义的,因为无论怎样都是由父窗口来负责绘制拥有者绘制按钮。在本章后面,我们将说明,在某些情况下,一些类似于WM_CTLCOLORBTN但适用于其它型态控件的消息将更为有用。
      

  7.   


    按键按钮 是指 BS_PUSHBUTTON或BS_DEFPUSHBUTTON风格的按钮,
    拥有者绘制按钮 是指BS_OWNERDRAW风格的按钮它说的“不自绘,wm_ctlcolorbtn是没有意义的” 应该是对按钮不使用视觉样式(经典主题下)而言,因为那时系统画出来的按钮完全把背景遮住了
      

  8.   

    明白怎么回事了1. 按钮是需要自绘,wm_btnclorbtn才管用2. setbkmode与画刷的关系,设置后透明后,已经画的就不起作用了。
      

  9.   

    第3 ,wm_ctlcolorbtn返回刷子的问题无论返回何种刷子,只要设置了背景模式,就不管用了.