본문 바로가기
Visual C++(MFC)

MFC04. GUI(Graphic User Interface)

by 정양섭 2022. 3. 7.

  GUI는 화면상에 출력하는 부분으로 텍스트 출력, 선 출력, 사각형 출력 등 여러 가지가 있습니다. 도스 프로그램을 하던 사람이 윈도우 프로그램을 할 경우 이 부분에서 버그를 많이 만들고 또한 이 경우 디버깅도 어렵습니다. 따라서 필자는 GUI용 클래스를 만들어 제공합니다. 작성한 클래스는 두가지로 텍스트 출력용 클래스(CText) 및 그래픽 출력용 클래스(CDrawTools)입니다.
MFC에서 GUI 함수는 CDC를 기반으로 화면뿐만 아니라 프린터에 출력합니다. CDC는 OnDraw함수의 인자로 OS가 넘겨 줍니다.
 
CText
사용가능 함수
CSize DrawText(CDC *pDC, int x, int y, LPCTSTR strText, COLORREF Color, LOGFONT *pLogFont = NULL);
CSize DrawText(CDC *pDC, LPRECT pRect, LPCTSTR strText, COLORREF Color, LOGFONT* pLogFont = NULL, int nFormat = -1);

대부분 첫 번째 함수를 사용하고, 가운데 정렬로 여러 텍스트를 출력할 경우 nFormat을 DT_CENTER 또는 DT_CENTER | DT_VCENTER | DT_SINGLELINE로 설정하여 주로 사용합니다.

CDrawTools
사용가능 함수
//선 그리기 함수
void DrawLine(CDC *pDC,int nSx,int nSy,int nEx,int nEy,COLORREF nColor);
void DrawLine(CDC *pDC,RECT Rect,COLORREF Color);
//사각형 그리기 함수
void DrawRect(CDC *pDC,int nSx,int nSy,int nEx,int nEy,long Color);
void DrawRect(CDC *pDC,RECT Rect,long Color);
//원 그리기 함수
void DrawEllipse(CDC *pDC,int nSx,int nSy,int nEx,int nEy,long Color);
void DrawEllipse(CDC *pDC,RECT Rect,long Color);
//둥근 사각형 그리기 함수
void DrawRoundRect(CDC *pDC,int nSx,int nSy,int nEx,int nEy,long Color);
void DrawRoundRect(CDC *pDC,RECT Rect,long Color);
//다각형 그리기 함수
void DrawPolygon(CDC *pDC, POINT *pPoints, int nCount, long Color1,long Color2);
//삼각형 그리기 함수
void DrawTriangle(CDC *pDC, RECT Rect, int nType, long Color1, long Color2);
//nType = 삼각형 중 뾰족한 부분의 위치를 설정합니다. 설정 가능한 nType으로는 TYPE_TOP_POINT(위), TYPE_BOTTOM_POINT(아래), TYPE_LEFT_POINT(왼쪽), TYPE_RIGHT_POINT(오른쪽)등이 있습니다.
//버튼 모양 그리기 함수
void DrawPopBox(CDC *pDC, int x1, int y1, int x2, int y2, long color);
void DrawPopBox(CDC *pDC, RECT Rect, long Color);
//들어간 버튼 모양 그리기 함수
void DrawPushBox(CDC *pDC, int x1, int y1, int x2, int y2, long color);
void DrawPushBox(CDC *pDC, RECT Rect, long Color);
제공하는 클래스만 사용하여도 대부분 그래픽은 모두 표현할 수 있을 것이나 함수를 추가할 필요가 있을 경우를 대비하여 DrawRect함수를 예로 내부 루틴을 설명합니다.
기본적으로 MFC에서 사각형 그리는 함수로 Rectangle를 제공합니다. 그러나 이 함수만을 사용하여 그림을 그리면 색상을 마음대로 표현할 수 없습니다. 따라서 색상(글자의 폰트등도 원리는 같다)등을 CDC에 설정하는 루틴을 함수 내에 추가한 것뿐입니다. 작업 순서를 보면 다음과 같습니다.
1. Pen, Brush 등 필요한 Object를 만듭니다.
2. CDC 변수에 SelectObject를 이용하여 설정합니다.
3. 사각형을 그립니다.
4. CDC 변수에 설정된 속성을 원래대로 되돌립니다.
5. Pen, Brush 등 만든 Object를 삭제합니다.
초보자들이 4, 5과정을 잘 빼 먹습니다. 이렇게 했을 경우 실행하는 데 문제가 없으나 짧을 경우 2~3일, 길 경우 1~2개월 계속 프로그램을 돌렸을 경우 프로그램이 다운되거나 리소스가 부족하다는 메시지가 뜨게 되므로 버그 찾기도 힘들고... 주의해야 합니다.
실제 예를 보면 ..

void CDrawTools::DrawRect(CDC *pDC, int nSx, int nSy, int nEx, int nEy, long Color)
{
    CPen Pen, *pOldPen;
    CBrush Brush, *pOldBrush;
    //1. Pen, Brush 등 필요한 Object를 만듭니다.
    Pen.CreatePen(PS_SOLID,m_LineThick,Color);
    Brush.CreateStockObject(NULL_BRUSH);
    //2. CDC 변수에 SelectObject를 이용하여 설정합니다.
    pOldBrush = (CBrush*)pDC->SelectObject(&Brush);
    pOldPen = (CPen*)pDC->SelectObject(&Pen);
    //3. 사각형을 그립니다.
    pDC->Rectangle(nSx,nSy,nEx,nEy);
    //4. CDC 변수에 설정된 속성을 원래대로 되돌립니다.
    pDC->SelectObject(pOldBrush);
    pDC->SelectObject(pOldPen);
    //5. Pen, Brush 등 만든 Object를 삭제합니다.
    Brush.DeleteObject();
    Pen.DeleteObject();
}


데모 프로그램
데모 프로그램은 CText와 CDrawTool을 이용하여 화면상에 다음그림과 같이 몇가지 그림을 그리는 루틴을 작성하였다. 또한 윈도우에서 기본적으로 제공하는 색상 선택 대화 상자와 폰트 선택 대화 상자를 이용하여 색상 및 폰트를 변경하도록 구성하였습니다.

클래스 소스 다운로드

GuiClass.zip
0.00MB

예제 프로그램 다운로드

Guidemo.zip
0.04MB


 

'Visual C++(MFC)' 카테고리의 다른 글

MFC06. 대화상자  (0) 2022.03.07
MFC05. RESOURCE  (0) 2022.03.07
MFC03. ClassView 사용법  (0) 2022.03.07
MFC02. 기본프로그램 제작  (1) 2022.03.07
MFC01. 프로그래밍에 대하여  (0) 2022.03.07