C_C++/VC++(MFC)

VC++, MFC 바둑판 (오목판) 그리기 (1)

고니자니 2025. 6. 9. 17:40
반응형

VC++, MFC 대화상자 기반으로 바둑판(오목판)을 그리는 코드입니다.

프로젝트명: Omok

 

OmokDlg.h

// OmokDlg.h: 헤더 파일
//

#pragma once


// COmokDlg 대화 상자
class COmokDlg : public CDialogEx
{
// 생성입니다.
public:
	COmokDlg(CWnd* pParent = nullptr);	// 표준 생성자입니다.

// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_OMOK_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 지원입니다.


// 구현입니다.
protected:
	HICON m_hIcon;

	// 생성된 메시지 맵 함수
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()

private:
	void DrawBoard(CDC* pDC);
};

 

 

OmokDlg.cpp

// OmokDlg.cpp: 구현 파일
//

#include "pch.h"
#include "framework.h"
#include "Omok.h"
#include "OmokDlg.h"
#include "afxdialogex.h"
#include <vector>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

struct Point {
	int x;
	int y;
};

// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

// 구현입니다.
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// COmokDlg 대화 상자



COmokDlg::COmokDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_OMOK_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void COmokDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(COmokDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
END_MESSAGE_MAP()


// COmokDlg 메시지 처리기

BOOL COmokDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.

	// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 이 대화 상자의 아이콘을 설정합니다.  응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
	//  프레임워크가 이 작업을 자동으로 수행합니다.
	SetIcon(m_hIcon, TRUE);			// 큰 아이콘을 설정합니다.
	SetIcon(m_hIcon, FALSE);		// 작은 아이콘을 설정합니다.

	// TODO: 여기에 추가 초기화 작업을 추가합니다.

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}

void COmokDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
//  아래 코드가 필요합니다.  문서/뷰 모델을 사용하는 MFC 애플리케이션의 경우에는
//  프레임워크에서 이 작업을 자동으로 수행합니다.

void COmokDlg::OnPaint()
{
	CPaintDC dc(this); // 디바이스 컨텍스트
	DrawBoard(&dc);
}

void COmokDlg::DrawBoard(CDC* pDC)
{
	const int startX = 20;
	const int startY = 20;
	const int cellSize = 30;
	const int boardSize = 15;

	// 외곽선
	CRect rect(startX - 1, startY - 1, startX + cellSize * (boardSize - 1) + 1, startY + cellSize * (boardSize - 1) + 1);
	pDC->Rectangle(&rect);

	// 선 그리기
	for (int i = 0; i < boardSize; ++i)
	{
		int x = startX + i * cellSize;
		int y = startY + i * cellSize;

		pDC->MoveTo(x, startY);
		pDC->LineTo(x, startY + cellSize * (boardSize - 1));

		pDC->MoveTo(startX, y);
		pDC->LineTo(startX + cellSize * (boardSize - 1), y);
	}

	// hoshi 좌표
	std::vector<Point> hoshiPoints = {
		{3, 3}, {3, 7}, {3, 11},
		{7, 3}, {7, 7}, {7, 11},
		{11, 3}, {11, 7}, {11, 11}
	};

	// 검은색 브러시 생성
	CBrush blackBrush(RGB(0, 0, 0));
	CBrush* pOldBrush = pDC->SelectObject(&blackBrush);

	// hoshi 점 그리기
	for (const auto& pt : hoshiPoints)
	{
		int x = startX + pt.x * cellSize;
		int y = startY + pt.y * cellSize;
		pDC->Ellipse(x - 3, y - 3, x + 3, y + 3); // 반지름 3픽셀의 원
	}

	// 이전 브러시 복원
	pDC->SelectObject(pOldBrush);
}

// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
//  이 함수를 호출합니다.
HCURSOR COmokDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

 

 

바둑판 (오목판) 15x15 그리기

프로그램 소스

Omok_1.zip
0.23MB

반응형