이전 시간에는 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);
}
}
}
위와 같이 작성하였습니다.
주로 많이 사용하는 것을 위주로 하였으나 더 많은 기능을 확인하시려면
여기로 가셔서 원하는 기능이 있는지 확인해보시면 됩니다.
위에서 작성한 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 |