CStatic控件背景透明实例代码

博客转移:http://vivianke.blog.163.com/blog/static/29715271200781121358317/

 

说明:
1.CStatic控件背景透明,要首先从CStatic派生一个类,在这个类中,afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)是反射函数,该函数处理=WM_CTLOLOR消息,消息映射宏为:ON_WM_CTLCOLOR_REFLECT(),
2.afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);处理WM_CTLCOLOR消息,用来改变控件颜色,属于消息处理函数.
3.afx_msg BOOL OnEraseBkgnd(CDC* pDC);处理WM_ERASEBKGND消息,用来显示背景图片.前提必须要设置背景透明,即调用afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor)反射函数.
//CTransparentStatic类

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TransparentStatic.h : header file
//

/
// CTransparentStatic window

class CTransparentStatic : public CStatic
{
// Construction
public:
    CTransparentStatic();

// Attributes
public:

// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CTransparentStatic)
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CTransparentStatic();

    // Generated message map functions
protected:
    //{{AFX_MSG(CTransparentStatic)
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);        //控件颜色处理函数
    afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);                //反射函数,处理控件颜色,可以设置背景模式
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);                        //消除背景,以便显示背景画面
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
private:
    CBitmap m_Bmp;
};

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TRANSPARENTSTATIC_H__8B6D6931_A3DE_400F_BA33_F4097632D8EB__INCLUDED_)

// TransparentStatic.cpp : implementation file
//

#include "stdafx.h"
#include "Material_MIS.h"
#include "TransparentStatic.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CTransparentStatic

CTransparentStatic::CTransparentStatic()
{
}

CTransparentStatic::~CTransparentStatic()
{
}


BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
    //{{AFX_MSG_MAP(CTransparentStatic)
    ON_WM_CTLCOLOR()
    ON_WM_CTLCOLOR_REFLECT()
    ON_WM_ERASEBKGND()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CTransparentStatic message handlers

HBRUSH CTransparentStatic::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CStatic::OnCtlColor(pDC, pWnd, nCtlColor);
    
    if (pWnd->GetDlgCtrlID()==IDC_STATIC_TEXT)
        pDC->SetTextColor(RGB(255,255,255));            //设置控件中显示的文本颜色

    return hbr;
}

HBRUSH CTransparentStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
    pDC->SetBkMode(TRANSPARENT);                    //设备背景透明模式
    return (HBRUSH)GetStockObject(NULL_BRUSH);
}

BOOL CTransparentStatic::OnEraseBkgnd(CDC* pDC)
{
    if (m_Bmp.GetSafeHandle()==NULL) {
        CRect Rect;
        GetWindowRect(&Rect);
        CWnd*pParent=GetParent();
        ASSERT(pParent);
        pParent->ScreenToClient(&Rect);    //convert our corrdiates to our parents
        //copy what's on the parents at this point
        CDC *pDC=pParent->GetDC();
        CDC MemDC;
        MemDC.CreateCompatibleDC(pDC);
        m_Bmp.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height());
        CBitmap*pOldBmp=MemDC.SelectObject(&m_Bmp);
        MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),pDC,Rect.left,Rect.top,SRCCOPY);
        MemDC.SelectObject(pOldBmp);
        pParent->ReleaseDC(pDC);
    }
    else //copy what we copied off the parent the first time back onto the parent
    {
        CRect Rect;
        GetClientRect(Rect);
        CDC MemDC;
        MemDC.CreateCompatibleDC(pDC);
        CBitmap* pOldBmp=MemDC.SelectObject(&m_Bmp);
        pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);
        MemDC.SelectObject(pOldBmp);
    }
    
    return TRUE;
}

//视图类中
CTransparentStatic m_Static;


void CMaterial_MISView::CreateStaticCtrl()
{
    CRect rect;
    GetClientRect(&rect);
    //设定静态文本框的大小
    rect.top=5;
    rect.left=rect.right/2-180/2;
    rect.bottom=30;
    rect.right=rect.left+180;
    //创建静态文本框
    m_Static.Create(m_strCurList,WS_VISIBLE | WS_VISIBLE | SS_CENTER, rect,this,IDC_STATIC_TEXT);
    //设置静态控件字体
    m_Static.SetFont(&m_font);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
重载静态文本控件,功能如下 //功能:设置字体大小 //输入:lfHeight字体大小,单位为像素,不能为负数,当为0时表示采用系统默认大小 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextHeight(LONG lfHeight = 0); //功能:设置字体宽度 //输入:lfWidth字体宽度,单位为像素,不能为负数,当为0时表示采用系统默认大小 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextWidth(LONG lfWidth = 0); //功能:设置字体颜色 //输入:clrText字体颜色 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextColor(COLORREF clrText); //功能:设置字体粗细 //输入:lfWeight粗细的数值,范围为0-1000,当为0时表示默认 //输出:无 //注:内部已经刷新,当数值小于0或大于1000时,都自动设置为0,表示采用默认值 //王彬 20120710 void SetTextWeight(LONG lfWeight); //功能:设置字体是否为斜体 //输入:bItalic是否为斜体,true为斜体,false为非斜体 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextItalic(bool bItalic); //功能:设置字体指定每一行文本输出时相对于页面底端的角度。 //输入:lfEscapement以十分之一度为单位指定每一行文本输出时相对于页面底端的角度。 //输出:无 //注:内部已经刷新,逆时针为正,顺时针为负 //王彬 20120710 void SetTextEscapement(LONG lfEscapement); //功能:设置字体指定字符基线相对于页面底端的角度。 //输入:lfOrientation以十分之一度为单位指定字符基线相对于页面底端的角度。 //输出:无 //注:内部已经刷新,逆时针为正,顺时针为负 //王彬 20120710 void SetTextOrientation(LONG lfOrientation); //功能:设置字体是否带下划线。 //输入:bUnderline是否带下划线,true为带下划线,false为不带下划线。 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextUnderline(bool bUnderline); //功能:设置字体是否带删除线。 //输入:bUnderline是否带删除线,true为带删除线,false为不带删除线。 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextStrikeOut(bool bStrikeOut); //功能:设置字体名字。 //输入:sFaceName字体名字。 //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextFaceName(CString sFaceName); //功能:设置字体字符集。 //输入:lfCharSet字体字符集,通常情况对于中文的Windows系统,也可以直接用DEFAULT_CHARSET表示默认字符集 // 英文字体可以用ANSI_CHARSET,简体中文字体可以用GB2312_CHARSET,繁体中文字体可以用CHINESEBIG5_CHARSET //输出:无 //注:内部已经刷新 //王彬 20120710 void SetTextCharSet(BYTE lfCharSet); //功能:字体样式采用系统默认 //输入:无 //输出:无 //注:内部已经刷新 //王彬 20120711 void SetTextDefault(); //功能:设置对齐方式 //输入:dwAlign对齐方式 ALIGN_LEFT 左对齐,ALIGN_RIGHT 右对齐,ALIGN_MIDDLE 水平居中对齐 //ALIGN_TOP 上对齐,ALIGN_BOTTOM 底对齐,ALIGN_VCENTER 垂直居中对齐, ALIGN_CENTER 水平垂直居中对齐 //输出:无 //注:内部已经刷新,垂直居中和底部对齐只能为一行 //王彬 20120711 void SetAlign(DWORD dwAlign); //功能:设置背景图片 //输入:sPicPath 图片路径, nMode为贴图方式 //输出:无 //注:内部已经刷新 //王彬 20120711 bool SetBKPicture(CString sPicPath, DWORD dwMode); //功能:设置背景是否贴图 //输入:bShow是否背景贴图, true为贴图, false为不贴图 //输出:无 //注:内部已经刷新 //王彬 20120711 bool ShowPicture(bool bShow); //功能:设置背景颜色 //输入:clrBK背景颜色 //输出:无 //注:内部已经刷新 //王彬 20120711 void SetBKColor(COLORREF clrBK); //功能:设置背景透明 //输入:无 //输出:无 //注:内部已经刷新 //王彬 20120711 void SetBKTransparent(); //功能:刷新背景 //输入:无 //输出:无 //王彬 20120712 void RedrawStatic(); //功能:绘制边框 //输入:nWidth边框宽度,clrBorder边框颜色 //输出:无 //王彬 20120714 void SetBorder(int nWidth, COLORREF clrBorder);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值