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);
}

์ฐธ๊ณ ์‚ฌ์ดํŠธ