[MFC] Custom Button ๋ง๋ค๊ธฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก Custom Button ๋ง๋๋ ์์ ์ ์งํํ๊ฒ ์ต๋๋ค.
(๋ณธ๋ฌธ ํ๋จ์ ์ํ ์ฝ๋๊ฐ ์ฒจ๋ถ๋์ด ์์ต๋๋ค.)
๋จผ์ , 'MyButton'์ด๋ผ๋ Dialog Base์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ GDI+๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
'์๋ฃจ์ ํ์๊ธฐ'์์ ํ๋ก์ ํธ์ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํฉ๋๋ค.
('ํ๋ก์ ํธ ์ฐํด๋ฆญ > Add > Class...' ๋ฅผ ์ ํํ๋ฉด ๋ฉ๋๋ค.)
๋ค์๊ณผ ๊ฐ์ด ์ฐฝ์ด ์์ฑ๋๋ฉด '์ถ๊ฐ(Add)' ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
ํด๋์ค์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ์์๋ 'CSkinButton'์ด๋ผ๊ณ ์ด๋ฆ์ ์ง๊ฒ ์ต๋๋ค.
'Finish' ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด 'SkinButton.cpp/h' ํ์ผ์ด ์ถ๊ฐ๋ฉ๋๋ค.
์์ผ๋ก ๋ง๋ค SkinButton Class๋ CButton์ ์์๋ฐ๋ ๊ตฌ์กฐ๋ก ๋ง๋ค์ด์ผ ํ๋, 'CSkinButton.h'์์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํฉ๋๋ค.
//SkinButton.h
class CSkinButton : public CButton
{
public:
CSkinButton();
~CSkinButton();
};
๊ทธ๋ฆฌ๊ณ , ๋ฒํผ์ ๋ฐฐ๊ฒฝ / ์ธ๊ณฝ์ / ํ ์คํธ์ ์์๊ณผ ํ ์คํธ์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ธฐ ์ํ ํจ์๋ ์ ์ํฉ๋๋ค.
//SkinButton.h
class CSkinButton : public CButton
{
public:
CSkinButton();
~CSkinButton();
public :
void SetColorBackground(int a, int r, int g, int b);
void SetColorBorder(int a, int r, int g, int b);
void SetColorText(int a, int r, int g, int b);
void SetSizeText(float size);
private :
Gdiplus::Color m_clrBackground; // ๋ฐฐ๊ฒฝ ์์.
Gdiplus::Color m_clrBorder; // ์ธ๊ณฝ์ ์์.
Gdiplus::Color m_clrText; // ํ
์คํธ ์์.
float m_fSizeText; // ํ
์คํธ ํฌ๊ธฐ.
CString m_strText; // ๋ฌธ์์ด.
};
'SkinButton.cpp'์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค.
์, ๋๋ฌ์ต๋๋ค!
... ๋นํฉ์ค๋ฝ์ฃ ?ใ ใ ;
๋๋ด์ด๊ตฌ์. ์ด์ ์๋งน์ด๋ฅผ ๊ตฌํํด ๋ณผ๊น์?
SkinButton Drawing ์ปจ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋จผ์ Background ์์ญ์ ๊ทธ๋ฆฌ๊ณ Border๋ฅผ ๊ทธ๋ฆฐ ๋ค์ Text๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋์ ๋๋ค.
์ฐธ๊ณ ๋ก, SetDlgItemText API๋ฅผ ์ด์ฉํ ๋ฌธ์์ด ์ค์ ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
ํด๋น API๋ฅผ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊น๋นก์ ํ์์ด ๋ํ๋ ๋ฌธ์ ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋์ CString ๋ฉค๋ฒ ๋ณ์๋ฅผ ํตํด ๋ฌธ์์ด์ ์ค์ ํ๊ณ ๊ทธ๋ฆฌ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๋ ํจ์๋ ์ ์ํด ๋ณผ๊ฒ์.
//SkinButton.h
class CSkinButton : public CButton
{
public:
CSkinButton();
~CSkinButton();
public :
void SetColorBackground(int a, int r, int g, int b);
void SetColorBorder(int a, int r, int g, int b);
void SetColorText(int a, int r, int g, int b);
void SetSizeText(float size);
private :
Gdiplus::Color m_clrBackground;
Gdiplus::Color m_clrBorder;
Gdiplus::Color m_clrText;
float m_fSizeText;
CString m_strText;
void DrawBackground(Gdiplus::Graphics *pG); // ๋ฐฐ๊ฒฝ ๊ทธ๋ฆฌ๊ธฐ.
void DrawBorder(Gdiplus::Graphics *pG); // ์ธ๊ณฝ์ ๊ทธ๋ฆฌ๊ธฐ.
void DrawText(Gdiplus::Graphics *pG); // ํ
์คํธ ๊ทธ๋ฆฌ๊ธฐ.
};
//SkinButton.cpp
void CSkinButton::DrawBackground(Graphics *pG)
{
CRect rect;
GetClientRect(&rect);
Gdiplus::SolidBrush brush(m_clrBackground);
pG->FillRectangle(&brush, rect.left, rect.top, rect.right, rect.bottom);
}
void CSkinButton::DrawBorder(Graphics *pG)
{
CRect rect;
GetClientRect(&rect);
Gdiplus::Pen pen(m_clrBorder, 1);
pG->DrawRectangle(&pen, rect.left, rect.top, rect.Width(), rect.Height());
}
void CSkinButton::DrawText(Graphics *pG)
{
CRect rect;
GetClientRect(&rect);
Gdiplus::FontFamily fontfam(_T("Arial"));
Gdiplus::Font font(&fontfam, m_fSizeText, Gdiplus::FontStyleRegular, Gdiplus::UnitPixel);
Gdiplus::StringFormat stringAlign;
stringAlign.SetAlignment(Gdiplus::StringAlignmentCenter);
stringAlign.SetLineAlignment(Gdiplus::StringAlignmentCenter);
Gdiplus::SolidBrush brush(m_clrText);
pG->DrawString(m_strText, m_strText.GetLength(), &font,
Gdiplus::RectF((float)rect.left, (float)rect.top, (float)rect.Width(), (float)rect.Height()), &stringAlign, &brush);
}
์ฌ๊ธฐ๊น์ง ๊ฐ ์์๋ฅผ ๊ทธ๋ฆฌ๋ ํจ์์ ์์ ๋ฐ ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ ํจ์๋ฅผ ๊ตฌํํ๋๋ฐ์.
๋ฒํผ ์ปจํธ๋กค์ '๊ทธ๋ฆฌ๋ ์๊ฐ'์ ์ธ์ ์ผ๊น์? ์ด๋์์ ๊ทธ๋ฆฌ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๊น์?
๊ทธ๊ฒ์ ๋ฐ๋ก 'OnPaint()'์ ๋๋ค.
OnPaint ํจ์๋ ์ปจํธ๋กค์ด ๊ทธ๋ ค์ง ๋ ํธ์ถ๋๋ ์ด๋ฒคํธ ํจ์ ์ ๋๋ค.
OnPaint ํจ์์ ๊ทธ๋ฅ ๊ทธ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ ๋๋ธ ๋ฒํผ๋ง(double buffering)์ ์ ์ฉํ์ฌ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ OnPaint() ํจ์๋ฅผ ์ถ๊ฐํด ๋ณผ๊น์?
๋จ์ถํค 'Ctrl+Shift+x' ๋๋ 'Class Wizard'๋ฅผ ์คํํฉ๋๋ค.
'Class name: CSkinButton'์ ์ ํํ๊ณ , 'Messages'์์ 'WM_PAINT'๋ฅผ 'Add Handler'๋ฅผ ํด๋ฆญํ์ฌ ์ถ๊ฐํฉ๋๋ค.
'OK'๋ฅผ ํด๋ฆญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๊ฐ ์ถ๊ฐ๋ฉ๋๋ค.
void CSkinButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CButton::OnPaint() for painting messages
}
์ด์ OnPaint()๋ฅผ ์๋ ์ฒ๋ผ ์์ ํฉ๋๋ค.
//SkinButton.cpp
void CSkinButton::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
Graphics mainG(dc.GetSafeHdc());
Bitmap bmp(rect.Width(), rect.Height());
Graphics memG(&bmp);
SolidBrush brush(m_clrBackground);
memG.FillRectangle(&brush, 0, 0, rect.Width(), rect.Height());
DrawBackground(&memG);
DrawBorder(&memG);
DrawText(&memG);
mainG.DrawImage(&bmp, 0, 0);
}
์ด์ SkinButton ๊ตฌํ์ ๋๋ฌ์ต๋๋ค.
Main Dialog์์ SkinButton์ ์ ์ฉํด ๋ณผ๊น์? ์๋์ ์ฝ๋๋ฅผ SkinButton.h์ ์ถ๊ฐํฉ๋๋ค.
//SkinButton.h
#include "SkinButton.h"
๊ทธ๋ฆฌ๊ณ CMyButtonDlg์ ๋ฉค๋ฒ ๋ณ์๋ก ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
//MyButtonDlg.h
CSkinButton m_skinBtn;
๋ฆฌ์์ค ํธ์ง๊ธฐ์์ Button Control์ ์ถ๊ฐํฉ๋๋ค.
Button์ ID๋ ๊ธฐ๋ณธ ๊ฐ์ธ IDC_BUTTON1์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๋ฆฌ์์ค ํธ์ง๊ธฐ์ ์ถ๊ฐํ ๋ฒํผ๊ณผ SkinButton ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ฐ๋ํ๊ธฐ ์ํด ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
//MyButtonDlg.cpp
void CMyButtonDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, m_skinBtn); // ์ฝ๋ ์ถ๊ฐ.
}
์ด์ ์คํํด ๋ณผ๊น์?
๊ฒ์์๋ง ๋์ค์ฃ ? ์๊ทธ๋ด๊น์?
์์ ๋ณ์๋ฅผ ์ ์๋ ํ์ง๋ง ์ด๊ธฐํ ๋๋ ์ค์ ์ ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
CSkinButton() ์์ฑ์์ ์๋ ์ฝ๋์ฒ๋ผ ์ด๊ธฐ ๊ฐ์ ์ ๋ ฅํฉ๋๋ค.
CSkinButton::CSkinButton()
{
m_clrBackground = Gdiplus::Color(255, 64, 64, 64);
m_clrBorder = Gdiplus::Color(255, 128, 128, 128);
m_clrText = Gdiplus::Color(255, 255, 255, 255);
m_strText = _T("Button");
m_fSizeText = 15;
}
๋น๋ ํ ๋ค์ ์คํํ๋ฉด ์๋์ ๊ฐ์ด ๋์ํฉ๋๋ค.
์ด์ ์์ ์ค์ ํจ์์ ๊ธ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ฌ ๋ง์๋๋ก ๊พธ๋ฐ ์ ์์ต๋๋ค!
๊ทธ๋ฐ๋ฐ ๋์์ ํ ๊น์?
๋ฆฌ์์ค ํธ์ง๊ธฐ์์ ๋ฒํผ ์ปจํธ๋กค์ ๋๋ธํด๋ฆญ ํ๊ณ , ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
//MyButtonDlg.cpp
void CMyButtonDlg::OnBnClickedButton1()
{
AfxMessageBox(_T("SkinButton!"));
}
๊ทธ๋ฆฌ๊ณ ๋ค์ ์คํํ๊ณ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง SkinButton ๋ง๋๋ ๊ณผ์ ์ ์งํํด ๋ณด์๋๋ฐ์. ์ฌ์ค ์ด๋ ค์ด ๋ถ๋ถ์ ์์ต๋๋ค.
๋จ์ง ์ถ๊ฐํด์ผ ํ ๊ธฐ๋ฅ์ ์ธ ๋ถ๋ถ์ด ๋ง์ ๋ฟ์ด์ฃ .
์๋ฅผ ๋ค์ด, ๋ฒํผ์ ๋๋ ธ์ ๋ ๋๋ฆฌ๋ ํจ๊ณผ๋ผ๋ ๊ฐ, ๋ง์ฐ์ค๊ฐ ๋ฒํผ ์์ ์์ ๋ ๋ค๋ฅธ ์์์ ํํํ๋ค๋ ๊ฐ ๋ฑ ๋ง์ด์ฃ .
๋ณธ๋ฌธ ์์ ๋ ์๋ ์ํ ์ฝ๋๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ํ์ธํด๋ณด์ธ์.
MyButton.zip'Programming > MFC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[GDI] Part 2. ์๋ํจ์ #2 (0) | 2019.01.27 |
---|---|
[GDI] Part 2. ์๋ํจ์ #1 (0) | 2019.01.27 |
[GDI] Part 1. GDI ๊ฐ๋ (0) | 2019.01.27 |
[MFC] Custom Button ์๊ฐ (0) | 2019.01.15 |
[Button Control] ๋์ ์์ฑ (11) | 2017.06.25 |
[Button Control] ์ ์ ์์ฑ (0) | 2017.06.04 |
Dialog ๊ธฐ๋ฐ ํ๋ก์ ํธ ์์ฑํ๊ธฐ. (0) | 2017.05.21 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[GDI] Part 2. ์๋ํจ์ #1
[GDI] Part 2. ์๋ํจ์ #1
2019.01.27 -
[GDI] Part 1. GDI ๊ฐ๋
[GDI] Part 1. GDI ๊ฐ๋
2019.01.27 -
[MFC] Custom Button ์๊ฐ
[MFC] Custom Button ์๊ฐ
2019.01.15 -
[Button Control] ๋์ ์์ฑ
[Button Control] ๋์ ์์ฑ
2017.06.25