본문 바로가기

Windows/MFC

CStaticEx

[code]// CStaticEx.cpp : implementation file
//
// DATE        : February 22, 2007
// CODER    : aucd29 (aucd29@gmail.com)
// VERSION    : 1.1
//
//

// NOTE : February 22, 2007
// ----------------------------------------------------------
// * 간단한 거니깐 GDI 를 이용해서 만들도록 하자. (아무래도
// 속도가.. 훗...
//
// ----------------------------------------------------------
// BUG : April 23, 2007
// ----------------------------------------------------------
// * SetWindowText 안먹는다. 이 클래스를 상속받는 녀석들이
// 있으므로... 기존것은 한번 쓰고 나서는 계속해서 읽기만
// 하는 식으로 변경하고 (SetWindowText가 불가) 새로운
// 변경 클래스를 생성해서 넣도록 해보자...
//
// -----------------------------------------------------------
// FIX : June 14, 2007 10:7:40
// -----------------------------------------------------------
// * 가능한 부하를 줄여주기 위해서 배경 비트맵 생성을 1번만
// 호출했는데 이게 -_ - 문제가 있어서 계속 호출하게 변경
//
// * 수정하면서 글자도 계속 갱신하게 끔 변경
//
// * 글자 색도 중간중간 변경할 수 있게 변경
//


#include "stdafx.h"
#include "StaticEx.h"


// CStaticEx

IMPLEMENT_DYNAMIC(CStaticEx, CStatic)

CStaticEx::CStaticEx()
: m_szWindowText(_T(""))
, m_bIsLoad(false)
, m_szFont(L"Tahoma")        // Vista에서는 폰트가 다르므로 예상치 못한 결과가 생길 수 있으므로
, m_bFontBold(false)
, m_nHeight(13)
, m_nAlign(DT_LEFT)
, m_bOpaque(false)
{
    m_crFontColor = RGB(0, 0, 0);
    m_rectText.SetRect(0, 0, 0, 0);
}

CStaticEx::~CStaticEx()
{
    m_oTextFont.DeleteObject();
    mBitmap.DeleteObject();
}


BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
    ON_WM_ERASEBKGND()
    ON_WM_PAINT()
END_MESSAGE_MAP()

// CStaticEx message handlers

BOOL CStaticEx::OnEraseBkgnd(CDC* pDC)
{
    return true;
}

void CStaticEx::GetDefaultFont(void)
{
    LOGFONT hfont;
    memset(&hfont, 0, sizeof(LOGFONT));
    wcscpy_s(hfont.lfFaceName, m_szFont);
    hfont.lfHeight = m_nHeight;

    if (m_bFontBold)
    {
        hfont.lfWeight = FW_BOLD;
    }    

    m_oTextFont.CreateFontIndirect(&hfont);
}

void CStaticEx::InitObject(CDC* pDC)
{
    if (!m_bIsLoad)
    {
        //
        // 폰트는 한번 선택하면 변경 못하게 하고..
        //
        GetDefaultFont();
        GetClientRect(m_rect);
        mDC.CreateCompatibleDC(pDC);
        mDC.SetBkMode(TRANSPARENT);
        mDC.SelectObject(&m_oTextFont);

        // 재 로드를 방지하기 위해서 작업
        m_bIsLoad = true;
    }

    if (m_bOpaque)
    {
        //
        // 3D_FACE로 기본 배경을 생성한다.. 안하면
        //
        mBitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());                
        mDC.FillSolidRect(m_rect, GetSysColor(COLOR_3DFACE));
    }
    else
    {
        //
        // 일반적으로 더블 버퍼링을 하려면 배경을 투명하게
        // 만들 수가 없기 때문에 미리 배경을 가져와서
        // 비트맵으로 생성해두고 이걸 깔면 될 것 같다.
        //
        CRect rect;
        CDC mParentDC;
        CWnd* pParent = GetParent();
        CDC* pParentDC = pParent->GetDC();

        GetWindowRect(rect);
        pParent->ScreenToClient(rect);
        mParentDC.CreateCompatibleDC(pParentDC);
        mBitmap.CreateCompatibleBitmap(pParentDC, rect.Width(), rect.Height());
        mParentDC.SelectObject(&mBitmap);
        mParentDC.BitBlt(0, 0, rect.Width(), rect.Height(), pParentDC, rect.left, rect.top, SRCCOPY);
        pParent->ReleaseDC(pParentDC);
        mParentDC.DeleteDC();
    }

    mDC.SelectObject(&mBitmap);            // 배경을 갱신하고
    mDC.SetTextColor(m_crFontColor);    // 폰트 색을 변경하고
    GetWindowText(m_szWindowText);        // 글 내용을 변경하고
}


void CStaticEx::OnPaint()
{
    CPaintDC dc(this); // device context for painting

    InitObject(&dc);

    if (m_rectText.left)
    {
        mDC.DrawText(m_szWindowText,m_rectText,m_nAlign);
    }
    else
    {
        mDC.DrawText(m_szWindowText,m_rect,m_nAlign);
    }

    dc.BitBlt(0, 0, m_rect.Width(), m_rect.Height(), &mDC, 0, 0, SRCCOPY);
    DeleteObject();
}

void CStaticEx::SetFontStyle(CString szFont, int nHeight, COLORREF crColor)
{
    // 폰트 변경
    m_szFont = szFont;

    // 폰트 크기 변경
    if (nHeight)
    {
        m_nHeight = nHeight;
    }

    // 폰트 색 변경
    if (crColor)
    {
        m_crFontColor = crColor;
    }
}

void CStaticEx::SetFontBold(void)
{
    m_bFontBold = true;
}

void CStaticEx::SetFontAlign(int nAlign)
{
    m_nAlign = nAlign;
}

void CStaticEx::SetFontHeight(int nHeight)
{
    m_nHeight = nHeight;
}

void CStaticEx::SetOpaque(void)
{
    // 배경을 채우고 스테틱을 그린다.
    m_bOpaque = true;
}

void CStaticEx::SetColor(COLORREF crColor)
{
    m_crFontColor = crColor;
}

void CStaticEx::DeleteObject(void)
{
    //
    // 삭제하고 다시 만들자.
    //
    mBitmap.DeleteObject();
}
[/code]
[code]
#pragma once

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

public:
    CStaticEx();
    virtual ~CStaticEx();

protected:
    DECLARE_MESSAGE_MAP()

protected:
    afx_msg void OnPaint();
    afx_msg BOOL OnEraseBkgnd(CDC* pDC);

protected:
    int m_nHeight, m_nAlign;
    CDC mDC;
    bool m_bFontBold, m_bIsLoad;
    bool m_bOpaque, m_bChanged;
    CRect m_rect, m_rectText;
    CFont m_oTextFont;
    CString m_szWindowText, m_szFont;
    CBitmap mBitmap, mBitmapBk;
    COLORREF m_crFontColor;
        
protected:
    void GetDefaultFont(void);
    virtual void DeleteObject(void);
    virtual void InitObject(CDC* pDC);

public:
    void SetFontStyle(CString szFont, int nHeight = 0, COLORREF crColor = NULL);
    void SetFontBold(void);
    void SetFontAlign(int nAlign = DT_LEFT);
    void SetFontHeight(int nHeight);
    void SetOpaque(void);
    void SetColor(COLORREF crColor);

};[/code]

'Windows > MFC' 카테고리의 다른 글

CStaticExGroup  (0) 2013.10.02
CStaticExBitmap  (0) 2013.10.02
CDC::Arc  (0) 2013.10.02
CDC::GetTextExtent (문자열폭 알기 text width)  (0) 2013.10.02
TEXTMETRIC (문자 높이)  (0) 2013.10.02