怎样把控件变为透明(!!高分相送!!)picture control或 static control的背景变为透明

解决方案 »

  1.   

    (1)声明类变量 CBrush m_HollowBrush;(2)OninitalDialog()中初始化:
    VERIFY(m_HollowBrush.CreateStockObject(HOLLOW_BRUSH));(3)HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    switch(nCtlColor) {
    case CTLCOLOR_STATIC:
    pDC->SetBkMode(TRANSPARENT);
    return HBRUSH(m_HollowBrush);
    ..
    }
      

  2.   

    if (你的背景已是一幅图了,现在想加上去的控件能透明)
    {
       别无它法,你只能自已实现这个类了。
    }
    else /*你的背景是单一色*/
    {
      可以采用类似楼上的做法。
    }
      

  3.   

    HBRUSH CMyELSDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);用向导添加OnCtlColor消息处理函数,然后插入如下代码:
    // TODO: Change any attributes of the DC here
    if(nCtlColor==CTLCOLOR_STATIC)
    {
    pDC->SetBkMode(TRANSPARENT);
    hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);
    }// TODO: Return a different brush if the default is not desired
    return hbr;
    }
      

  4.   

    void CMyTreeCtrl::OnPaint() 
    {
    CPaintDC dc(this);

    CRect rcclient;
    GetClientRect(&rcclient); CDC memdc;
    memdc.CreateCompatibleDC(&dc);
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc, rcclient.Width(), rcclient.Height());
    memdc.SelectObject( &bitmap ); CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC , 0); CDC maskdc;
    maskdc.CreateCompatibleDC(&dc);
    CBitmap maskbitmap;
    maskbitmap.CreateBitmap(rcclient.Width(), rcclient.Height(), 1, 1, NULL);
    maskdc.SelectObject( &maskbitmap );
    maskdc.BitBlt( 0, 0, rcclient.Width(), rcclient.Height(), &memdc, 
    rcclient.left, rcclient.top, SRCCOPY); CBrush brush;
    brush.CreatePatternBrush(&m_bitmap);
    dc.FillRect(rcclient, &brush);

    memdc.SetBkColor(RGB(0,0,0));          
    memdc.SetTextColor(RGB(255,255,255));  
    memdc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
                    &maskdc, rcclient.left, rcclient.top, SRCAND); dc.SetBkColor(RGB(255,255,255));
    dc.SetTextColor(RGB(0,0,0));
    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
                 &maskdc, rcclient.left, rcclient.top, SRCAND);

    dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(), 
                 &memdc, rcclient.left, rcclient.top,SRCPAINT);
    brush.DeleteObject();
    }
    3.3 处理tvn_itemexpanding void CMyTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
    SetRedraw(FALSE);
    *pResult = 0;
    }
      

  5.   

    class CTESTDLG : public CDialog
    {
    ......
    //声明一个CTpEdit的成员变量
    private:
    CTpEdit m_tpedit;
    };//在OnInitDialog中Subclass对话框模板中的Edit控件
    BOOL CTESTDLG::OnInitDialog() 
    {
    CDialog::OnInitDialog();
    m_tpedit.SubclassDlgItem(IDC_EDIT,this);
    return TRUE; 
    }//在OnCtlColor中设置背景的透明,要改变Edit控件字体的颜色也在这里HBRUSH CTESTDLG::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);if((nCtlColor == CTLCOLOR_EDIT) && (pWnd->GetDlgCtrlID()==IDC_EDIT))
    {
    pDC->SetBkMode(TRANSPARENT); //设置背景透明,这样,输出字符的时候就
    //是所谓的空心字,而不是有白的底色
    pDC->SetTextColor(RGB(255,0,0)); //改变字体的颜色
    return HBRUSH(GetStockObject(HOLLOW_BRUSH));
    }return hbr;
    }//CTpEdit对象class CTpEdit : public CEdit
    {
    public:
    //m_mousedown用来记录鼠标左键是否按下
    BOOL m_mousedown;
    protected:
    //响应如下的消息
    //{{AFX_MSG(CTpEdit)
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
    afx_msg UINT OnGetDlgCode();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };//CTpEdit的消息响应函数如下
    //画背景图
    BOOL CTpEdit::OnEraseBkgnd(CDC* pDC) 
    {
    //得到Edit控件的外框,即背景区域
    RECT updatarect; 
    GetClientRect(&updatarect);
    //画背景,我画的是一个黄色的矩形
    CBrush newBrush;
    newBrush.CreateSolidBrush(RGB(255,255,200));
    CBrush * oldBrush = pDC->SelectObject(&newBrush);
    pDC->Rectangle(&updatarect);
    pDC->SelectObject(oldBrush);
    return TRUE;
    }//强迫Edit控件擦除背景,重写字符
    UINT CTpEdit::OnGetDlgCode() 
    { RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE ); 
    return CEdit::OnGetDlgCode();
    }
    //记录鼠标左键是否按下
    void CTpEdit::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    m_mousedown = TRUE;
    SetCapture();
    CEdit::OnLButtonDown(nFlags, point);
    }void CTpEdit::OnLButtonUp(UINT nFlags, CPoint point) 
    {
    if(m_mousedown) 
    ReleaseCapture();
    m_mousedown = FALSE;
    CEdit::OnLButtonUp(nFlags, point);
    }//如果左键按下并且拖动鼠标就要刷新显示
    void CTpEdit::OnMouseMove(UINT nFlags, CPoint point)
    {
    if(m_mousedown)
    RedrawWindow(NULL, NULL,RDW_INVALIDATE | RDW_ERASE );
    CEdit::OnMouseMove(nFlags, point);
    }
    //初始化成员变量
    CTpEdit::CTpEdit()
    {
    m_mousedown=FALSE;
    }
      

  6.   

    HBRUSH CMyELSDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    if(nCtlColor==CTLCOLOR_STATIC)
    {
    pDC->SetBkMode(TRANSPARENT);
    hbr=(HBRUSH)::GetStockObject(NULL_BRUSH);
    }// TODO: Return a different brush if the default is not desired
    return hbr;
    }