[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]
//
// 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 |