
이전 시간에는 MFC Grid Control(이하 Grid)을 사용하기 위한 과정을 봤습니다.
혹여나 잘 되지 않았다면
위 파일을 이용하여 해보세요.
이전 과정에서 수정했던 것을 반영한 MFC Grid Control 소스 입니다.
MFC Grid Control 생성
이제 Grid를 생성하여봅시다.

도구 상자에서 Custom Control을 생성합니다.

여기서 중요한 것은 클래스(Class)에 MFCGridCtrl을 넣어주는 것입니다.
(저는 ID를 IDC_GRID로 설정하였습니다.)
이제 메인 다이얼로그의 헤더 파일(h)로 와서 Grid 변수와 초기화용 함수를 선언해줍니다.
#pragma once
#include "GridCtrl_src/GridCtrl.h"
class CMFC노리터Dlg : public CDialogEx
{
// ... 생략 ...
private:
// MFC Grid Control
CGridCtrl m_ctrlGrid;
// MFC Grid Control 초기화 함수
void InitGrid();
// ... 생략 ...
};
위와 같이 선언 후 소스 파일(cpp)로 와서 Grid 변수를 연결해주고 설정 함수를 작성합니다.
/**
MFC Grid Control 초기화 함수
*/
void CMFC노리터Dlg::InitGrid()
{
// 변수에 Grid를 연결
if (m_ctrlGrid.m_hWnd == NULL)
{
m_ctrlGrid.SubclassDlgItem(IDC_GRID, this);
}
// Grid Column의 인덱스
enum ColumnIdx
{
ID, // 번호
NAME, // 이름
AGE, // 나이
MAX
};
const LPCTSTR NAMES[] = { _T("홍길동"), _T("김민수"), _T("고영희"), _T("유다희") };
int nNameSize = sizeof(NAMES) / sizeof(LPCTSTR);
m_ctrlGrid.SetEditable(TRUE); // 수정 가능
m_ctrlGrid.SetListMode(TRUE); // List Mode 설정 (Cell 클릭 시 한 줄(Row) 전체 선택)
m_ctrlGrid.EnableDragAndDrop(FALSE); // Drag And Drop 기능 비활성화
m_ctrlGrid.SetTextBkColor(RGB(240, 240, 240)); // 기본 Cell 배경색
m_ctrlGrid.SetTextColor(RGB(25, 180, 70)); // 기본 Cell 텍스트색
m_ctrlGrid.SetBkColor(RGB(100, 100, 100)); // 기본 배경색 (TextBkColor에도 영향을 줍니다.)
m_ctrlGrid.SetGridColor(RGB(255, 0, 0)); // Grid의 Line 색
m_ctrlGrid.SetColumnCount(ColumnIdx::MAX); // 기본으로 생성할 Column의 개수
m_ctrlGrid.SetRowCount(nNameSize + 1); // 기본으로 생성할 Row의 개수
m_ctrlGrid.SetFixedRowCount(1); // 고정할 Row의 개수
m_ctrlGrid.SetFixedBkColor(RGB(0, 0, 0)); // 고정된 Cell의 배경색
m_ctrlGrid.SetFixedTextColor(RGB(255, 255, 255)); // 고정된 Cell의 텍스트색
for (int nRow = 0; nRow < m_ctrlGrid.GetRowCount(); nRow++)
{
for (int nCol = 0; nCol < m_ctrlGrid.GetColumnCount(); nCol++)
{
// Cell 아이템의 설정
GV_ITEM item;
item.mask = GVIF_TEXT | GVIF_FORMAT;
item.nFormat = DT_CENTER | DT_WORDBREAK;
item.row = nRow;
item.col = nCol;
// 첫 줄을 헤더로 사용하기 위함
if (nRow == 0)
{
switch (nCol)
{
case ColumnIdx::ID:
item.strText = _T("번호");
break;
case ColumnIdx::NAME:
item.strText = _T("이름");
break;
case ColumnIdx::AGE:
item.strText = _T("나이");
break;
}
}
else
{
switch (nCol)
{
case ColumnIdx::ID:
item.strText.Format(_T("%d"), nRow);
break;
case ColumnIdx::NAME:
item.strText.Format(_T("%s"), NAMES[nRow - 1]);
break;
case ColumnIdx::AGE:
item.strText.Format(_T("%d"), rand() % 30);
break;
}
}
// Cell 데이터 설정
m_ctrlGrid.SetItem(&item);
}
}
}
위와 같이 작성하였습니다.
주로 많이 사용하는 것을 위주로 하였으나 더 많은 기능을 확인하시려면
MFC Grid control 2.27
A fully featured MFC grid control for displaying tabular data. The grid is a custom control derived from CWnd
www.codeproject.com
여기로 가셔서 원하는 기능이 있는지 확인해보시면 됩니다.
위에서 작성한 InitGrid 함수를
BOOL CMFC노리터Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// MFC Grid Control 초기화
InitGrid();
return TRUE;
}
OnInitDialog 함수에서 호출하여 사용해보면

위에서 설정한 대로 나오는 것을 확인할 수 있습니다.
위의 InitGrid 함수에서는 SetRowCount 함수를 이용하여 미리 Row를 생성한 후에 데이터를 넣어주었으나
InsertRow 함수를 사용하여 데이터를 넣어줄 수 도 있습니다.
버튼을 하나 만들고 그 버튼에 BN_CLICKED 이벤트를 만들겠습니다.

| 컨트롤 | 컨트롤 ID |
| Button (Add) | IDC_BTN_ADD |
void CMFC노리터Dlg::OnBnClickedBtnAdd()
{
// 현재 Grid의 Row 개수
int nIdx = m_ctrlGrid.GetRowCount();
CString strIdx = _T("");
strIdx.Format(_T("%d"), nIdx);
// 새로운 Row 추가
m_ctrlGrid.InsertRow(strIdx);
// 해당 Row의 0번 Column의 Format 설정
m_ctrlGrid.SetItemFormat(nIdx, 0, DT_CENTER | DT_WORDBREAK);
// Grid 새로고침
m_ctrlGrid.Refresh();
}
이렇게 작성 후 실행하여 버튼을 클릭하면

이렇게 번호가 증가하면서 Row가 생성됩니다.
하지만 InsertRow 함수의 경우에는 0번 Column의 데이터를 기본으로 추가하기 때문에 이름과 나이를 뜻하는 1, 2번 Column의 데이터는 SetItem 함수를 이용하여 데이터를 넣어주는 방법을 사용해야 합니다.
위에서 작성한 BN_CLICKED 이벤트를 수정하여봅시다.
void CMFC노리터Dlg::OnBnClickedBtnAdd()
{
// 현재 Grid의 Row 개수
int nIdx = m_ctrlGrid.GetRowCount();
CString strIdx = _T("");
strIdx.Format(_T("%d"), nIdx);
// 새로운 Row 추가
m_ctrlGrid.InsertRow(strIdx);
// 해당 Row의 0번 Column의 Format 설정
m_ctrlGrid.SetItemFormat(nIdx, 0, DT_CENTER | DT_WORDBREAK);
// 이름 데이터 추가
GV_ITEM item1;
item1.mask = GVIF_TEXT | GVIF_FORMAT;
item1.nFormat = DT_CENTER | DT_WORDBREAK;
item1.row = nIdx;
item1.col = 1;
item1.strText = _T("유유유");
m_ctrlGrid.SetItem(&item1);
// 나이 데이터 추가
GV_ITEM item2;
item2.mask = GVIF_TEXT | GVIF_FORMAT;
item2.nFormat = DT_CENTER | DT_WORDBREAK;
item2.row = nIdx;
item2.col = 2;
item2.strText.Format(_T("%d"), rand() % 30);
m_ctrlGrid.SetItem(&item2);
// Grid 새로고침
m_ctrlGrid.Refresh();
}
이렇게 작성 후 실행해보면

이렇게 데이터가 들어간 것을 볼 수 있습니다.
위의 예제에서는 이름과 나이(랜덤)를 고정하였기 때문에 계속 같은 값이 나오지만 실제로 사용할 때는 데이터를 읽어들여서 해당 위치에 데이터를 넣을 수 있게 하면 됩니다.
끄읕
예제 실행 소스
'Study > MFC' 카테고리의 다른 글
| [MFC] MFC 에서 Grid를 사용해보자 1 (MFC Grid Control) (1) | 2022.11.03 |
|---|---|
| [MFC/Win32 API] 파일의 생성 시간, 접근 시간, 쓰기 시간 (2) | 2022.10.15 |
| [MFC] ListBox 컨트롤 (리스트박스) (0) | 2022.10.13 |
| [MFC] Radio Button 컨트롤 (라디오 버튼) (0) | 2022.09.03 |
| [MFC] Check Box 컨트롤 (체크 박스) (0) | 2022.09.03 |