MFC2010. 5. 18. 13:34

코드구루에서 구한 커스텀 컨트롤을 이용하는 방법을 알아보겠습니다.

1. 우선 다이얼로그 베이스의 프로젝트를 생성합니다.
이름은 GridTest로 하겠습니다.



2. 위 파일을 다운로드한 후 압축을 풀고, 모든 파일을 프로젝트에 포함시킵니다.


3. 다이얼로그에 Custom Control을 하나 배치합니다.
Controls 도구상자의 가장 왼쪽 아래에 있는 사람 모양 아이콘입니다.



4. 컨트롤의 속성 페이지로 들어가서 아래와 같이 Class:에 MFCGridCtrl이라고 입력합니다.



5. GridTestDlg.h 파일에 아래 헤더를 인클루드하고,
#include "GridCtrl.h"

GridTestDlg 클래스에 CGridCtrl 클래스의 멤버 변수를 추가합니다.
CGridCtrl m_Grid;


6. 아래처럼 DDX_GridControl 함수를 사용하여 커스텀 컨트롤을 m_Grid멤버변수와 연결합니다.
void CGridTestDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CGridTestDlg)
        // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    DDX_GridControl(pDX, IDC_GRID, m_Grid); //IDC_CUSTOM1은 커스텀 컨트롤의 NAME
}


7. CGridTestDlg 클래스의 OnInitDialog 함수에서 그리드 컨트롤을 초기화합니다.
초기화 값은 원하시는대로 변경하시면 됩니다.

BOOL CGridTestDlg::OnInitDialog()
{
    CDialog::OnInitDialog();
    ... ...

    // TODO: Add extra initialization here

    m_Grid.SetEditable(TRUE);
    m_Grid.SetListMode(TRUE);
    m_Grid.EnableDragAndDrop(TRUE);
    m_Grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0));

    m_Grid.SetRowCount(5);            //5행
    m_Grid.SetColumnCount(4);        //4열
    m_Grid.SetFixedRowCount(1);        //1고정 행
    m_Grid.SetFixedColumnCount(1);    //1고정 열

    DWORD dwTextStyle = DT_RIGHT|DT_VCENTER|DT_SINGLELINE;    //Text 스타일 정의
    for (int row = 0; row < m_Grid.GetRowCount(); row++) {
            for (int col = 0; col < m_Grid.GetColumnCount(); col++) {
                    GV_ITEM Item;
                    Item.mask = GVIF_TEXT|GVIF_FORMAT;
                    Item.row = row;
                    Item.col = col;

                    //셀의 텍스트 설정
                    if (row < 1) {
                            Item.nFormat = DT_LEFT|DT_WORDBREAK;
                            Item.szText.Format(_T("Column %d"),col);

                    } else if (col < 1) {
                            Item.nFormat = dwTextStyle;
                            Item.szText.Format(_T("Row %d"),row);

                    } else {
                            Item.nFormat = dwTextStyle;
                            Item.szText.Format(_T("%d"),row*col);
                    }
                    m_Grid.SetItem(&Item); 

                    //셀의 색상을 랜덤으로
                    if (rand() % 10 == 1) {
                            COLORREF clr = RGB(rand() % 128+128,
                                                            rand() % 128+128,
                                                            rand() % 128+128);
                            m_Grid.SetItemBkColour(row, col, clr);
                            m_Grid.SetItemFgColour(row, col, RGB(255,0,0));
                    }
            }
    }
    //1행 1열은 read-only로 설정
    m_Grid.SetItemState(1,1, m_Grid.GetItemState(1,1) | GVIS_READONLY);

    //셀 너비는 자동으로 설정
    m_Grid.AutoSize();
    m_Grid.SetRowHeight(0, 3*m_Grid.GetRowHeight(0)/2);
   

    return TRUE;  // return TRUE  unless you set the focus to a control
}


8. 빌드후 실행시켜 보면 아래와 같이 실행됩니다.



다른 함수들이나 자세한 사항은 소스코드 참조하시기 바랍니다.
GridCtrl.h 파일을 보시면 모든 함수들의 원형을 보실 수 있습니다.
자세한 설명은 없지만 함수명이 비교적 직관적으로 되어 있어 사용하기 쉽습니다.

Posted by 못생긴나무