+ -
当前位置:首页 → 问答吧 → 自定义彩色static text控件类,怎么设置控件背景透明

自定义彩色static text控件类,怎么设置控件背景透明

时间:2011-11-25

来源:互联网

不是设置文字的背景透明,请看代码

.h文件
C/C++ code

#pragma once

// CColorStatic
class CColorStatic : public CStatic
{
    DECLARE_DYNAMIC(CColorStatic)

public:
    CColorStatic();
    virtual ~CColorStatic();
    afx_msg HBRUSH CtlColor( CDC* pDC, UINT nCtlColor );

    void SetTextColor( COLORREF crText );
    void SetTransparent( bool bTran );
    void SetBackColor( COLORREF crBackColor );

protected:
    DECLARE_MESSAGE_MAP()

    COLORREF    m_crTextColor;
    COLORREF    m_crBackColor;
    HBRUSH        m_hBrush;            
    bool        m_bTran;
};




cpp文件
C/C++ code

#include "stdafx.h"
#include "test.h"
#include "ColorStatic.h"


// CColorStatic

IMPLEMENT_DYNAMIC(CColorStatic, CStatic)

CColorStatic::CColorStatic()
    : m_bTran(0)
    , m_crTextColor( RGB( 0, 0, 0 ) )
    , m_crBackColor( RGB( 240, 240, 240 ) )
{

}

CColorStatic::~CColorStatic()
{
}


BEGIN_MESSAGE_MAP( CColorStatic, CStatic )
    ON_WM_CTLCOLOR_REFLECT()
END_MESSAGE_MAP()

// CColorStatic message handlers


HBRUSH CColorStatic::CtlColor( CDC* pDC, UINT nCtlColor )  
{
    if (CTLCOLOR_STATIC == nCtlColor)      
    {        
        pDC->SetTextColor( m_crTextColor ); 
        pDC->SetBkColor( m_crBackColor );
        if (m_bTran == true)             
            pDC->SetBkMode(TRANSPARENT); 
    }      
    return m_hBrush;
}

void CColorStatic::SetTextColor( COLORREF crText )  
{      
    m_crTextColor = crText;
    RedrawWindow();  
}  

void CColorStatic::SetTransparent( bool bTran )  
{      
    m_bTran = bTran;
    RedrawWindow();  
}  

void CColorStatic::SetBackColor( COLORREF crBackColor )  
{      
    m_crBackColor = crBackColor;      
    RedrawWindow();  
}  


SetBackColor,还有SetTransparent,都只能改变文字的背景,不能改变控件的背景。

SetTransparent 之后,只是文字的背景透明了,但是控件的背景一直是白色不透明的,如果控件拖很大的话会有很大一片白色。
在属性里面设置Transparent也是不行的。

怎么让控件背景透明?

作者: lptsun   发布时间: 2011-11-25

你试下 在oninitdialog 里面 加入 ModifyStyleEx(0,WS_EX_TRANSPARENT);

作者: huangxvhui88   发布时间: 2011-11-25

CtlColor里

return (HBRUSH)GetStockObject(NULL_BRUSH);

作者: shunruo   发布时间: 2011-11-25

引用 1 楼 huangxvhui88 的回复:
你试下 在oninitdialog 里面 加入 ModifyStyleEx(0,WS_EX_TRANSPARENT);

这是个控件,没有oninitdialog
我在其他地方加了ModifyStyleEx(0,WS_EX_TRANSPARENT);没用

作者: lptsun   发布时间: 2011-11-25

引用 2 楼 shunruo 的回复:
CtlColor里

return (HBRUSH)GetStockObject(NULL_BRUSH);


如果return (HBRUSH)GetStockObject(NULL_BRUSH);
的话,以前的就不会被擦掉,会出现2个statictext

测试如下代码
C/C++ code

    LOGFONT lf = {0};
    CPaintDC dc(this);
    dc.GetCurrentFont()->GetLogFont(&lf);
    lf.lfCharSet = GB2312_CHARSET;
    lstrcpy(lf.lfFaceName, TEXT( "Arial" ) ); 
    lf.lfHeight = 20;
    lf.lfWidth = 12;

    CFont font;
    font.CreateFontIndirect( &lf ); 
    m_static123.SetFont( &font );

作者: lptsun   发布时间: 2011-11-25