• 로그인 함 해보끄나?

  • Sarangnamu.net June 17, 2003
    Home Login Profile Study Open Project Q&A Google Code
    CStaticEx
    Last Modify : 27 December, 2010(02:44)
    // CStaticEx.cpp : implementation file
    //
    // DATE		: February 22, 2007
    // CODER	: Kurome (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();
    }
    
    #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);
    
    };

    Comment


    입력하3 1498429524



    Locations of visitors to this page