mfc_SubC - 8BitsCoding/RobotMentor GitHub Wiki
Button์ ์๋ก ๋ค๊ฒ ์
#include "MyButton.h"
private:
MyButton m_my_btn;
m_my_btn.SubclassDlgItem(IDC_MY_BTN, this);
// ํด๋ฆญ ๋ค์ด์ด ๋ฐ์ํ ๊ฒฝ์ฐ
void MyButton::OnLButtonDown(UINT nFlags, CPoint point)
{
// ๋ถ๋ชจ ์๋์ฐ ์ฆ, ๋ค์ด์ผ๋ก๊ทธ์ ํธ๋ค์ ์ป์ด์ WM_COMMAND ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ํจ๋ค.
// WM_COMMAND์ wParam์ ๋ค์ด๊ฐ ID๋ ํด๋น ์ปจํธ๋กค์ ๋ฆฌ์์ค๊ฐ + 10000์ด๊ณ
// lParam์ ๋ค์ด๊ฐ ๊ฐ์ ์ด ์๋์ฐ ์ฆ, ๋ฒํผ์ ํธ๋ค์ด๋ค.
GetParent()->PostMessage(WM_COMMAND, GetDlgCtrlID() + 10000, (LPARAM)m_hWnd);
CButton::OnLButtonDown(nFlags, point);
}
// ํด๋ฆญ ์
์ด ๋ฐ์ํ ๊ฒฝ์ฐ
void MyButton::OnLButtonUp(UINT nFlags, CPoint point)
{
// ๋ค์ด์ผ๋ก๊ทธ์ WM_COMMAND ๋ฉ์ธ์ง๋ฅผ ๋ฐ์์ํจ๋ค.
GetParent()->PostMessage(WM_COMMAND, GetDlgCtrlID() + 10001, (LPARAM)m_hWnd);
CButton::OnLButtonUp(nFlags, point);
}
๊น์ฑ์ฝ MFC ๊ฐ์
EditBox value ๋ฐ๊ธฐ
// EditBox value ๋ฐ์ ์ฆ๊ฐ
void CMyMFCDlg::OnClickedIncBtn()
{
int value = GetDlgItemInt(IDC_VALUE_EDIT);
SetDlgItemInt(IDC_VALUE_EDIT, value + 1);
}
// EditBox value ๋ฐ์ ๊ฐ์
void CMyMFCDlg::OnBnClickedDecBtn()
{
int value = GetDlgItemInt(IDC_VALUE_EDIT);
SetDlgItemInt(IDC_VALUE_EDIT, value - 1);
}
SubClassing์ ์ํ ํด๋์ค ์์ฑ
ํด๋์ค๋ง๋ฒ์ฌ์์ CButton์ ์์ํ๋ ํด๋์ค๋ก ์์ฑํด์ผํจ.
// MyBtn.h
#pragma once
class MyBtn : public CButton
{
DECLARE_DYNAMIC(MyBtn)
public:
MyBtn();
virtual ~MyBtn();
protected:
DECLARE_MESSAGE_MAP();
};
// MyBtn.cpp
#include "stdafx.h"
#include "MyMFC.h"
#include "MyBtn.h"
IMPLEMENT_DYNAMIC(MyBtn, CButton)
MyBtn::MyBtn()
{
}
MyBtn::~MyBtn()
{
}
BEGIN_MESSAGE_MAP(MyBtn, CButton)
END_MESSAGE_MAP()
MyBtn์ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ
ํด๋์ค ์์ฑ์์ ํจ์๋ฅผ ์ถ๊ฐํ๋ฉด ์์ค์ฝ๋ ์์ฑ์ ์ค์ผ ์ ์๋ค.
// MyBtn.h
#pragma once
class MyBtn : public CButton
{
DECLARE_DYNAMIC(MyBtn)
public:
MyBtn();
virtual ~MyBtn();
protected:
DECLARE_MESSAGE_MAP();
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT_PTR nIDEvent);
};
// MyBtn.cpp
#include "stdafx.h"
#include "MyMFC.h"
#include "MyBtn.h"
IMPLEMENT_DYNAMIC(MyBtn, CButton)
MyBtn::MyBtn()
{
}
MyBtn::~MyBtn()
{
}
BEGIN_MESSAGE_MAP(MyBtn, CButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_TIMER()
END_MESSAGE_MAP()
void MyBtn::OnLButtonDown(UINT nFlags, CPoint point)
{
SetTimer(1, 500, NULL);
CButton::OnLButtonDown(nFlags, point);
}
void MyBtn::OnLButtonUp(UINT nFlags, CPoint point)
{
KillTimer(1);
KillTimer(2);
CButton::OnLButtonUp(nFlags, point);
}
void MyBtn::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 1) {
KillTimer(1);
SetTimer(2, 100, NULL);
} else if (nIDEvent == 2) {
GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), 20000), (LPARAM)m_hWnd);
}
CButton::OnTimer(nIDEvent);
}
MyBtn ์ฌ์ฉํ๊ธฐ
BOOL CMyMFCDlg::OnInitDialog()
{
CDialogEx::OnInitDialg();
// ...
m_inc_btn.SubclassDlgItem(IDC_INC_BTN, this);
m_dec_btn.SubclassDlgItem(IDC_DEC_BTN, this);
}
ํด๋์ค ๋ง๋ฒ์ฌ์์ OnCommand ํจ์๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉ
BOOL CMyMFCDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if(HIWORD(wParam) == 20000) {
int value = GetDlgItemInt(IDC_VALUE_EDIT);
if(LOWORD(wParam) == IDC_INC_BTN) value++;
else value--;
SetDlgItemInt(IDC_VALUE_EDIT, value);
}
return CDialogEx::OnCommaned(wParam, lParam);
}