반도체/MFC

[우주여행] 3장: MFC로 우주를 여행하는 애플리케이션 만들기!

Clair_de_Lune 2024. 12. 17. 11:37
728x90

형님, 우주여행 3장 스타트합니다!!!! 🚀✨ MFC로 우주를 정복할 시간! 이제 본격적으로 실용적이고 복잡한 윈도우 애플리케이션을 만들어보겠습니다!! 마치 우주선에 탑승한 듯! 미래를 여는 C++의 세계로!! 🌌💥

3장: MFC로 우주를 여행하는 애플리케이션 만들기!

이번엔 파일 입출력, 멀티 스레딩, 그리고 복잡한 UI 컨트롤을 다뤄볼 거예요! 형님, 이건 진짜 우주를 떠나는 것처럼 멋지고 흥미로운 과정이에요! 우주선의 엔진을 가동할 준비 되셨죠?! 🚀💨


1. 파일 입출력! 📂📝

형님, 이제 파일을 다뤄볼 거예요! 텍스트 파일을 읽고 쓰는 방법을 배우면, 파일을 통해 데이터를 처리하는 엄청난 프로그램을 만들 수 있어요! 데이터를 파일에 기록하거나, 파일에서 읽어와서 처리하는 작업을 할 거예요!

파일 읽고 쓰기 코드!

#include "stdafx.h"
#include <afxwin.h>  // MFC 핵심 헤더 파일
#include <fstream>   // 파일 입출력을 위한 헤더

class CMyWinApp : public CWinApp {
public:
    virtual BOOL InitInstance();
};

class CMyWnd : public CFrameWnd {
public:
    CMyWnd();
    afx_msg void OnButtonClick();
    DECLARE_MESSAGE_MAP()

private:
    void WriteToFile(CString text);
    CString ReadFromFile();
};

BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
    ON_COMMAND(1, &CMyWnd::OnButtonClick)
END_MESSAGE_MAP()

CMyWnd::CMyWnd() {
    Create(NULL, _T("Hello, MFC with File IO"));

    // 버튼 생성
    CButton* pButton = new CButton;
    pButton->Create(_T("Save to File"), WS_CHILD | WS_VISIBLE, CRect(50, 50, 200, 100), this, 1);
}

void CMyWnd::OnButtonClick() {
    // 텍스트를 파일에 저장
    WriteToFile(_T("Hello, File IO in MFC!"));

    // 파일에서 읽은 텍스트를 출력
    CString fileText = ReadFromFile();
    AfxMessageBox(fileText);  // 파일에서 읽은 텍스트를 메시지 박스로 출력
}

void CMyWnd::WriteToFile(CString text) {
    std::ofstream outFile("example.txt");  // 파일 열기
    outFile << (LPCTSTR)text;  // 텍스트 쓰기
    outFile.close();  // 파일 닫기
}

CString CMyWnd::ReadFromFile() {
    std::ifstream inFile("example.txt");  // 파일 열기
    CString fileText;
    char buffer[100];
    
    if (inFile.is_open()) {
        inFile.getline(buffer, 100);  // 파일에서 한 줄 읽기
        fileText = CString(buffer);  // 읽은 내용을 CString으로 변환
        inFile.close();  // 파일 닫기
    }

    return fileText;
}

BOOL CMyWinApp::InitInstance() {
    CMyWnd* pFrame = new CMyWnd;
    m_pMainWnd = pFrame;

    pFrame->ShowWindow(SW_NORMAL);
    pFrame->UpdateWindow();

    return TRUE;
}

설명:

  • WriteToFile(): 텍스트를 example.txt 파일에 저장하는 함수입니다! 텍스트 파일을 만들고, 내용을 기록해요.
  • ReadFromFile(): example.txt 파일에서 내용을 읽어서 반환하는 함수입니다! 파일 입출력의 기본적인 흐름을 배우게 됩니다!

2. 멀티 스레딩! 🧠⚡

형님, 이제 멀티 스레딩의 세계로 떠나볼까요? 멀티 스레딩은 여러 개의 작업을 동시에 처리할 수 있게 해줘요! 마치 우주선에 여러 명의 승무원이 동시에 일을 하는 것처럼요! 멀티 스레드를 활용하면 비동기 작업, 멀티태스킹이 가능해져요!

멀티 스레드 예시 코드!

#include "stdafx.h"
#include <afxwin.h>  // MFC 핵심 헤더 파일
#include <thread>    // 멀티 스레딩을 위한 헤더

class CMyWinApp : public CWinApp {
public:
    virtual BOOL InitInstance();
};

class CMyWnd : public CFrameWnd {
public:
    CMyWnd();
    afx_msg void OnButtonClick();
    DECLARE_MESSAGE_MAP()

private:
    void DoWork();  // 멀티 스레드에서 실행할 함수
};

BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
    ON_COMMAND(1, &CMyWnd::OnButtonClick)
END_MESSAGE_MAP()

CMyWnd::CMyWnd() {
    Create(NULL, _T("Hello, MFC with Multi-threading"));

    // 버튼 생성
    CButton* pButton = new CButton;
    pButton->Create(_T("Start Thread!"), WS_CHILD | WS_VISIBLE, CRect(50, 50, 200, 100), this, 1);
}

void CMyWnd::OnButtonClick() {
    // 새로운 스레드 생성
    std::thread t(&CMyWnd::DoWork, this);
    t.detach();  // 스레드를 백그라운드에서 실행
}

void CMyWnd::DoWork() {
    // 멀티 스레드에서 실행될 작업
    for (int i = 0; i < 5; ++i) {
        CString message;
        message.Format(_T("Running in thread: %d"), i);
        AfxMessageBox(message);  // 메시지 박스로 출력
        Sleep(1000);  // 1초 대기
    }
}

BOOL CMyWinApp::InitInstance() {
    CMyWnd* pFrame = new CMyWnd;
    m_pMainWnd = pFrame;

    pFrame->ShowWindow(SW_NORMAL);
    pFrame->UpdateWindow();

    return TRUE;
}

설명:

  • std::thread: C++11부터 제공되는 스레딩 라이브러리로, 멀티 스레드를 쉽게 사용할 수 있어요.
  • DoWork(): 이 함수는 새로운 스레드에서 실행되어, 1초 간격으로 메시지를 출력합니다!

이제 비동기 처리동시 작업 처리를 배웠으니, 더 복잡한 작업을 동시에 처리할 수 있어요! 🚀🔥


3. 고급 UI 컨트롤 다루기! 🖥️🛠️

형님, 이제 더 복잡한 UI 컨트롤을 다뤄봅시다! 콤보 박스, 리스트 박스, 다양한 메뉴 등을 사용해서 프로그램을 보다 직관적이고 멋지게 만들어 봅시다!

콤보 박스와 리스트 박스 예시 코드!

#include "stdafx.h"
#include <afxwin.h>  // MFC 핵심 헤더 파일

class CMyWinApp : public CWinApp {
public:
    virtual BOOL InitInstance();
};

class CMyWnd : public CFrameWnd {
public:
    CMyWnd();
    afx_msg void OnButtonClick();
    DECLARE_MESSAGE_MAP()

private:
    CComboBox m_comboBox;  // 콤보 박스를 위한 멤버 변수
    CListBox m_listBox;    // 리스트 박스를 위한 멤버 변수
};

BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
    ON_COMMAND(1, &CMyWnd::OnButtonClick)
END_MESSAGE_MAP()

CMyWnd::CMyWnd() {
    Create(NULL, _T("Hello, MFC with ComboBox and ListBox"));

    // 콤보 박스 생성
    m_comboBox.Create(CBS_DROPDOWN | WS_CHILD | WS_VISIBLE, CRect(50, 50, 200, 80), this, 1);
    m_comboBox.AddString(_T("Option 1"));
    m_comboBox.AddString(_T("Option 2"));
    m_comboBox.AddString(_T("Option 3"));

    // 리스트 박스 생성
    m_listBox.Create(WS_CHILD | WS_VISIBLE | LBS_STANDARD, CRect(50, 100, 200, 200), this, 2);
    m_listBox.AddString(_T("Item 1"));
    m_listBox.AddString(_T("Item 2"));
    m_listBox.AddString(_T("Item 3"));
}

void CMyWnd::OnButtonClick() {
    CString comboText, listText;
    m_comboBox.GetLBText(m_comboBox.GetCurSel(), comboText);  // 선택된 콤보 박스 항목
    m_listBox.GetText(0, listText);  // 리스트 박스의 첫 번째 항목

    CString message;
    message.Format(_T("ComboBox: %s, ListBox: %s"), comboText, listText);
    AfxMessageBox(message);  // 선택된 값들을 출력
}

BOOL CMyWinApp::InitInstance() {
    CMyWnd* pFrame = new CMyWnd;
    m_pMainWnd = pFrame;

    pFrame->ShowWindow(SW_NORMAL);
    pFrame->UpdateWindow();

    return TRUE;
}

설명:

  • CComboBox: 콤보 박스는 여러 항목 중에서 선택할 수 있게 해주는 UI 컨트롤입니다!
  • CListBox: 리스트 박스는 여러 항목을 나열해두고 선택할 수 있는 컨트롤입니다!

이제 콤보 박스리스트 박스를 사용해서 사용자 인터페이스를 더 풍성하게 만들 수 있어요! 😎💥

728x90