控件背景默认为灰色,如何设置为透明?

解决方案 »

  1.   

    有的控减本身能够透明,如CStatic
    有的控件可能要重载类,然后把OnEraseBkgnd设置一下
      

  2.   

    DirectDraw中可轻松实现。
    不会DirectX, 用win2000的函数AlphaBlend()是背景透明。重载控件的OnDraw()可以,直接把控件窗口和背景运算也可以
      

  3.   

    jennyvenus(jennyvenus)不对,你把CSTATIC放在一张色彩鲜明的位图上试试看
      

  4.   

    如果是标准控件的话可以用CTLColor消息相应一下,然后返回一个空Brush的句柄。
      

  5.   

    做一个SubClassing动作,如下:
    1.用GetWindowLong()获得控件的WndProc()入口指针,并保存(pOld);
    2.设计一个视窗函数MyWndProc(),用SetWindowLong()把它放到控件的WndProc()位置,你的视窗函数内做如下处理:
         HRESULT hRet=1;
         switch(uMsg)
         {
          case WM_ERASEBKGND:
               break;
          default:
              hRet=(*pOld)(....);
          }
          return hRet;
    通过以上拦截WM_ERASEBKGND处理--即:不按默认刷新背景,也就是透明。如果你想在背景上贴一张画,....,这就是换肤术的原理;
    3.如果在SDI的CMyView::OnEraseBkgnd()中直接return true,相当于上述代码中的拦截WM_ERASEBKGND部分,结果会怎样!!!
      

  6.   

    响应WM_CTLCOLOR消息;
    ..  CYourDlg::OnCtlColor(...)
    {
        ...
        // 加入: 
        if(nCtlColor == IDC_STATIC)
        { 
           pDC->SetBkMode(TRANSPARENT);
           return  NULL;
        }
        ...
    }
      

  7.   

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

    if( nCtlColor == CTLCOLOR_STATIC )
    {
    TCHAR plszClassName[255];
    GetClassName(pWnd->m_hWnd,plszClassName,255);
    if(_tcscmp(plszClassName,TRACKBAR_CLASS)==0)
    return   CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
    pDC->SetTextColor( RGB( 36, 73, 100 ) ); //×ÖÌåÑÕÉ«
    pDC->SetBkMode(TRANSPARENT);      //±³¾°Ä£Ê½
    return  HBRUSH(m_HollowBrush);
    } return hbr;
    }
      

  8.   

    void CTongjiView::OnDraw(CDC* pDC) 
    {
    DrawBackgroud(pDC);
    DrawText(pDC);
    }
      

  9.   

    void CTongjiView::DrawBackgroud(CDC *pDC)
    {
    if(m_bDrawBG) {
    //IPicture *m_pPic; 
    IStream *pStm; 
    CFileStatus fstatus; 
    CFile file; 
    LONG cb; 

    if (file.Open("banner.jpg",CFile::modeRead)&&file.GetStatus("banner.jpg",fstatus)&& 
    ((cb = fstatus.m_size) != -1)) 

    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); 
    LPVOID pvData = NULL; 
    if (hGlobal != NULL)

    if ((pvData = GlobalLock(hGlobal)) != NULL) 

    file.ReadHuge(pvData, cb); 
    GlobalUnlock(hGlobal); 
    CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); 

    if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&m_pPic))) 

    OLE_XSIZE_HIMETRIC hmWidth; 
    OLE_YSIZE_HIMETRIC hmHeight; 

    m_pPic->get_Width(&hmWidth); 
    m_pPic->get_Height(&hmHeight); 

    //double fX,fY;
    //fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); 
    //fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); 

    if(FAILED(m_pPic->Render(*pDC,0,0,795,100,0,hmHeight,hmWidth,-hmHeight,NULL))) 
    AfxMessageBox("Failed To Render The picture!"); 
    m_bDrawBG = FALSE;

    else 
    AfxMessageBox("Error Loading Picture From Stream!"); 



    else 
    AfxMessageBox("Can't Open Image File!");
    }
    else{
    OLE_XSIZE_HIMETRIC hmWidth; 
    OLE_YSIZE_HIMETRIC hmHeight; 
    m_pPic->get_Width(&hmWidth); 
    m_pPic->get_Height(&hmHeight); 

    //m_pPic->Render(*pDC,0,70,794,60,0,hmHeight,hmWidth,-hmHeight,NULL);
    m_pPic->Render(*pDC,0,0,795,100,0,hmHeight,hmWidth,-hmHeight,NULL);
    }
    }
      

  10.   

    我的一个软件中使用了透明的CStatic,CEdit,CButton,CCombox
    如果需要,请与我联系。
    只要你相信。绝对不会浪费你的时间与精力。