[code]// ButtonExFlat.cpp : implementation file
//
// DATE : March 9, 2007
// CODER : aucd29 (aucd29@gmail.com)
// VERSION : 1.0
//
//
#include "stdafx.h"
#include "propertyTest.h"
#include "ButtonExFlat.h"
// CButtonExFlat
IMPLEMENT_DYNAMIC(CButtonExFlat, CButton)
CButtonExFlat::CButtonExFlat()
: m_szWindowText(_T(""))
, m_bIsLoad(false)
, m_szFont(L"Tahoma") // Vista에서는 폰트가 다르므로 예상치 못한 결과가 생길 수 있으므로
, m_bFontBold(false)
, m_nHeight(13)
, m_nAlign(DT_LEFT)
, m_nLeftPadding(20)
, m_nMouseStatus(_MOUSEOUT)
, m_bPressButton(false)
{
m_crFontColor = RGB(0, 0, 0);
m_crBackground = RGB(255, 255, 255);
m_nAlign = DT_VCENTER | DT_SINGLELINE | DT_LEFT;
m_crMiniCircle = RGB(153, 204, 51);
m_crActiveBackground = RGB(231, 239, 247);
m_crActiveBorder = RGB(156, 181, 231);
m_crOverBackground = RGB(255, 255, 204);
m_crOverBorder = RGB(255, 204, 102);
//m_brCircle.CreateSolidBrush();
m_pen.CreatePen(PS_SOLID,3,m_crMiniCircle);
}
CButtonExFlat::~CButtonExFlat()
{
m_oTextFont.DeleteObject();
mBitmap.DeleteObject();
mDC.DeleteDC();
}
BEGIN_MESSAGE_MAP(CButtonExFlat, CButton)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
// CButtonExFlat message handlers
void CButtonExFlat::OnPaint()
{
CPaintDC dc(this); // device context for painting
InitObject(&dc);
switch(m_nMouseStatus)
{
case _MOUSEOUT:
mDC.FillSolidRect(m_rect, RGB(255, 255, 255));
break;
case _MOUSEDOWN:
mDC.FillSolidRect(m_rect, m_crActiveBackground);
mDC.FrameRect(m_rect, &CBrush(m_crActiveBorder));
break;
case _MOUSEOVER:
mDC.FillSolidRect(m_rect, m_crOverBackground);
mDC.FrameRect(m_rect, &CBrush(m_crOverBorder));
break;
default:
break;
}
mDC.SelectObject(m_pen);
mDC.Ellipse(m_rectCircle);
mDC.DrawText(m_szWindowText,m_rectText,m_nAlign);
dc.BitBlt(0, 0, m_rect.Width(), m_rect.Height(), &mDC, 0, 0, SRCCOPY);
}
void CButtonExFlat::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_rect.PtInRect(point))
{
if (m_bPressButton)
{
// 마우스는 클릭한 상태에서 버튼 위치일 경우
m_nMouseStatus = _MOUSEDOWN;
Invalidate();
}
else
{
// 마우스는 클릭하지 않은 상태 에서의 버튼 위치 일 경우
m_nMouseStatus = _MOUSEOVER;
Invalidate();
SetCapture();
}
}
else
{
m_nMouseStatus = _MOUSEOUT;
Invalidate();
if (!m_bPressButton)
{
ReleaseCapture();
}
}
CButton::OnMouseMove(nFlags, point);
}
void CButtonExFlat::InitObject(CDC* pDC)
{
if (!m_bIsLoad)
{
try
{
SetFont();
GetWindowText(m_szWindowText);
GetClientRect(m_rect);
mDC.CreateCompatibleDC(pDC);
mBitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
mDC.SetBkMode(TRANSPARENT);
mDC.SelectObject(&mBitmap);
mDC.SelectObject(&m_oTextFont);
mDC.SetTextColor(m_crFontColor);
mDC.FillSolidRect(m_rect, m_crBackground);
m_rectText = m_rect;
m_rectText.left = m_nLeftPadding;
int nPos = static_cast<int>(m_rect.Height() / 2.0) - 1;
m_rectCircle.SetRect(8, nPos, 12, nPos + 4);
}
catch (CResourceException* e)
{
e->ReportError();
e->Delete();
}
// 재 로드를 방지하기 위해서 작업
m_bIsLoad = true;
}
}
void CButtonExFlat::SetFont(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 CButtonExFlat::SetFontStyle(CString szFont, int nHeight, COLORREF crColor)
{
// 폰트 변경
m_szFont = szFont;
// 폰트 크기 변경
if (nHeight)
{
m_nHeight = nHeight;
}
// 폰트 색 변경
if (crColor)
{
m_crFontColor = crColor;
}
}
void CButtonExFlat::SetFontBold(void)
{
m_bFontBold = true;
}
void CButtonExFlat::SetFontAlign(int nAlign)
{
m_nAlign = nAlign;
}
void CButtonExFlat::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bPressButton = true;
m_nMouseStatus = _MOUSEDOWN;
Invalidate();
CButton::OnLButtonDown(nFlags, point);
}
void CButtonExFlat::OnLButtonUp(UINT nFlags, CPoint point)
{
m_nMouseStatus = _MOUSEOUT;
Invalidate();
CButton::OnLButtonUp(nFlags, point);
ReleaseCapture();
m_bPressButton = false;
}
void CButtonExFlat::OnLButtonDblClk(UINT nFlags, CPoint point)
{
OnLButtonDown(nFlags, point);
CButton::OnLButtonDblClk(nFlags, point);
}
[code]
[/code]
#pragma once
enum ButtonMouseStatus
{
_MOUSEOUT = 0,
_MOUSEOVER,
_MOUSEDOWN
};
// CButtonExFlat
class CButtonExFlat : public CButton
{
DECLARE_DYNAMIC(CButtonExFlat)
public:
CButtonExFlat();
virtual ~CButtonExFlat();
protected:
DECLARE_MESSAGE_MAP()
int m_nHeight, m_nAlign, m_nLeftPadding;
CDC mDC;
bool m_bFontBold, m_bIsLoad, m_bPressButton;
CRect m_rect, m_rectText, m_rectCircle;
CFont m_oTextFont;
CString m_szWindowText, m_szFont;
CBitmap mBitmap;
COLORREF m_crFontColor, m_crBackground;
COLORREF m_crMiniCircle;
void SetFont(void);
int m_nMouseStatus;
CBrush m_brCircle;
CPen m_pen;
COLORREF m_crActiveBackground;
COLORREF m_crActiveBorder;
COLORREF m_crOverBackground;
COLORREF m_crOverBorder;
public:
afx_msg void OnPaint();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
virtual void InitObject(CDC* pDC);
void SetFontStyle(CString szFont, int nHeight = 0, COLORREF crColor = NULL);
void SetFontBold(void);
void SetFontAlign(int nAlign = DT_LEFT);
void SetOpaque(void);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};
[/code]
//
// DATE : March 9, 2007
// CODER : aucd29 (aucd29@gmail.com)
// VERSION : 1.0
//
//
#include "stdafx.h"
#include "propertyTest.h"
#include "ButtonExFlat.h"
// CButtonExFlat
IMPLEMENT_DYNAMIC(CButtonExFlat, CButton)
CButtonExFlat::CButtonExFlat()
: m_szWindowText(_T(""))
, m_bIsLoad(false)
, m_szFont(L"Tahoma") // Vista에서는 폰트가 다르므로 예상치 못한 결과가 생길 수 있으므로
, m_bFontBold(false)
, m_nHeight(13)
, m_nAlign(DT_LEFT)
, m_nLeftPadding(20)
, m_nMouseStatus(_MOUSEOUT)
, m_bPressButton(false)
{
m_crFontColor = RGB(0, 0, 0);
m_crBackground = RGB(255, 255, 255);
m_nAlign = DT_VCENTER | DT_SINGLELINE | DT_LEFT;
m_crMiniCircle = RGB(153, 204, 51);
m_crActiveBackground = RGB(231, 239, 247);
m_crActiveBorder = RGB(156, 181, 231);
m_crOverBackground = RGB(255, 255, 204);
m_crOverBorder = RGB(255, 204, 102);
//m_brCircle.CreateSolidBrush();
m_pen.CreatePen(PS_SOLID,3,m_crMiniCircle);
}
CButtonExFlat::~CButtonExFlat()
{
m_oTextFont.DeleteObject();
mBitmap.DeleteObject();
mDC.DeleteDC();
}
BEGIN_MESSAGE_MAP(CButtonExFlat, CButton)
ON_WM_PAINT()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
// CButtonExFlat message handlers
void CButtonExFlat::OnPaint()
{
CPaintDC dc(this); // device context for painting
InitObject(&dc);
switch(m_nMouseStatus)
{
case _MOUSEOUT:
mDC.FillSolidRect(m_rect, RGB(255, 255, 255));
break;
case _MOUSEDOWN:
mDC.FillSolidRect(m_rect, m_crActiveBackground);
mDC.FrameRect(m_rect, &CBrush(m_crActiveBorder));
break;
case _MOUSEOVER:
mDC.FillSolidRect(m_rect, m_crOverBackground);
mDC.FrameRect(m_rect, &CBrush(m_crOverBorder));
break;
default:
break;
}
mDC.SelectObject(m_pen);
mDC.Ellipse(m_rectCircle);
mDC.DrawText(m_szWindowText,m_rectText,m_nAlign);
dc.BitBlt(0, 0, m_rect.Width(), m_rect.Height(), &mDC, 0, 0, SRCCOPY);
}
void CButtonExFlat::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_rect.PtInRect(point))
{
if (m_bPressButton)
{
// 마우스는 클릭한 상태에서 버튼 위치일 경우
m_nMouseStatus = _MOUSEDOWN;
Invalidate();
}
else
{
// 마우스는 클릭하지 않은 상태 에서의 버튼 위치 일 경우
m_nMouseStatus = _MOUSEOVER;
Invalidate();
SetCapture();
}
}
else
{
m_nMouseStatus = _MOUSEOUT;
Invalidate();
if (!m_bPressButton)
{
ReleaseCapture();
}
}
CButton::OnMouseMove(nFlags, point);
}
void CButtonExFlat::InitObject(CDC* pDC)
{
if (!m_bIsLoad)
{
try
{
SetFont();
GetWindowText(m_szWindowText);
GetClientRect(m_rect);
mDC.CreateCompatibleDC(pDC);
mBitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
mDC.SetBkMode(TRANSPARENT);
mDC.SelectObject(&mBitmap);
mDC.SelectObject(&m_oTextFont);
mDC.SetTextColor(m_crFontColor);
mDC.FillSolidRect(m_rect, m_crBackground);
m_rectText = m_rect;
m_rectText.left = m_nLeftPadding;
int nPos = static_cast<int>(m_rect.Height() / 2.0) - 1;
m_rectCircle.SetRect(8, nPos, 12, nPos + 4);
}
catch (CResourceException* e)
{
e->ReportError();
e->Delete();
}
// 재 로드를 방지하기 위해서 작업
m_bIsLoad = true;
}
}
void CButtonExFlat::SetFont(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 CButtonExFlat::SetFontStyle(CString szFont, int nHeight, COLORREF crColor)
{
// 폰트 변경
m_szFont = szFont;
// 폰트 크기 변경
if (nHeight)
{
m_nHeight = nHeight;
}
// 폰트 색 변경
if (crColor)
{
m_crFontColor = crColor;
}
}
void CButtonExFlat::SetFontBold(void)
{
m_bFontBold = true;
}
void CButtonExFlat::SetFontAlign(int nAlign)
{
m_nAlign = nAlign;
}
void CButtonExFlat::OnLButtonDown(UINT nFlags, CPoint point)
{
m_bPressButton = true;
m_nMouseStatus = _MOUSEDOWN;
Invalidate();
CButton::OnLButtonDown(nFlags, point);
}
void CButtonExFlat::OnLButtonUp(UINT nFlags, CPoint point)
{
m_nMouseStatus = _MOUSEOUT;
Invalidate();
CButton::OnLButtonUp(nFlags, point);
ReleaseCapture();
m_bPressButton = false;
}
void CButtonExFlat::OnLButtonDblClk(UINT nFlags, CPoint point)
{
OnLButtonDown(nFlags, point);
CButton::OnLButtonDblClk(nFlags, point);
}
[code]
[/code]
#pragma once
enum ButtonMouseStatus
{
_MOUSEOUT = 0,
_MOUSEOVER,
_MOUSEDOWN
};
// CButtonExFlat
class CButtonExFlat : public CButton
{
DECLARE_DYNAMIC(CButtonExFlat)
public:
CButtonExFlat();
virtual ~CButtonExFlat();
protected:
DECLARE_MESSAGE_MAP()
int m_nHeight, m_nAlign, m_nLeftPadding;
CDC mDC;
bool m_bFontBold, m_bIsLoad, m_bPressButton;
CRect m_rect, m_rectText, m_rectCircle;
CFont m_oTextFont;
CString m_szWindowText, m_szFont;
CBitmap mBitmap;
COLORREF m_crFontColor, m_crBackground;
COLORREF m_crMiniCircle;
void SetFont(void);
int m_nMouseStatus;
CBrush m_brCircle;
CPen m_pen;
COLORREF m_crActiveBackground;
COLORREF m_crActiveBorder;
COLORREF m_crOverBackground;
COLORREF m_crOverBorder;
public:
afx_msg void OnPaint();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
virtual void InitObject(CDC* pDC);
void SetFontStyle(CString szFont, int nHeight = 0, COLORREF crColor = NULL);
void SetFontBold(void);
void SetFontAlign(int nAlign = DT_LEFT);
void SetOpaque(void);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};
[/code]
'Windows > MFC' 카테고리의 다른 글
Dialog Style (0) | 2013.10.02 |
---|---|
CButtonExFlatProperty (0) | 2013.10.02 |
Custom Window 생성 Create (0) | 2013.10.02 |
XP Theme 관련 (0) | 2013.10.02 |
SetWindowPos 윈도우 크기 변경 (0) | 2013.10.02 |