我在dialog放了一副图片, 还有edit,listcontrol控件, 控件的背景是白色的和
对话框上的图片很不协调,有什么方法可以使这些控件的背景透明 (改背景颜色不行)
望具体指点!!

解决方案 »

  1.   

    setbkmode()好象只对static text控件管用
    对listcontrol and edit 不行
      

  2.   

    剪贴?
    edit里面能放图片进去么?
      

  3.   

    http://www.codeguru.com/dialog/transparent_dialog.shtml
      

  4.   

    相应如下消息HBRUSH CZxjmmView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    //
        if(nCtlColor==CTLCOLOR_STATIC) {
      pDC->SetBkMode(TRANSPARENT );
              pDC->SetTextColor(RGB(255,0,0));
    }
      

  5.   

    to:zxjmm(zxj)
    你的方法我用过但只对dialog上的static text管用
    对我想要的edit和listcontrol就不行了
      

  6.   

    CBitmap a; CBrush e;
      HBRUSH b;
      a.LoadBitmap(IDB_zxj);\\IDC_zxj是想要的的资源背景图
      b=::CreatePatternBrush(a);UINT nID =pWnd->GetDlgCtrlID();   
     return b;
      

  7.   

    CBitmap a; CBrush e;
      HBRUSH b;
      a.LoadBitmap(IDB_zxj);\\IDC_zxj是想要的的资源背景图
      b=::CreatePatternBrush(a);UINT nID =pWnd->GetDlgCtrlID();if(nID==xxxxxx)//控件ID   
     return b;
      

  8.   

    HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if(nCtlColor == CTLCOLOR_EDIT)
    {
    pDC->SetBkMode(TRANSPARENT); 
    pDC->SetBkColor(NULL);
    CBrush nbr;
    nbr.CreateSolidBrush(RGB(255,255,128));
    return nbr;
    }
    return hbr;
    }
    记住,一定要写在父窗口的OnCtlColor()里!
      

  9.   

    象这样可以使整个窗体都透明,不管Dialog还是控件.
    SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
    GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if(hInst) 

    typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
    MYFUNC fun = NULL;
    //取得SetLayeredWindowAttributes函数指针 
    fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
    if(fun)fun(this->GetSafeHwnd(),0,230,2); 
    FreeLibrary(hInst); 
    }
      

  10.   

    无论什么window对象,当需要刷新背景时都会收到WM_ERASEBKGND消息,拦截它,不将其传给窗体处理,其背景就是透明的。用subclassing方法轻易可以实现。方法如下:
    1.为控件设计一个拦截函数(如PreWndProc),其中检测是否为WM_ERASEBKGND消息,如是就放弃处理并返回,否则交与控件自身的WndProc处理;
    2.在控件初始化时,用GetWindowLong获取控件的WndProc函数入口指针,并储存起来备用(PreWndProc中要用);用SetWindowLong把控件窗口处理函数的入口设置为你设计的拦截函数(PreWndProc)的入口。
       这样就达到了拦截的目的。通过该方法可以拦截发送给控件的所有消息。这是控件二次开发时常用的方法。