관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

[강좌 4] 문자열 출력 본문

API 관련/API 강좌모음

[강좌 4] 문자열 출력

님투 2007. 10. 26. 03:37
반응형

[API]강좌(4)<--윈도우의 작업영역에 문자열을 출력




이번에는 윈도우의 작업영역에 문자열을 출력하는 방법에 대해 알아 보겠습니다.
먼저 출력에 대해 알아보기전에 두가지를 알아야 합니다. 첫째로 디바이스 컨텍스트 핸들에 대해 알아야 하는데 이것은 문자를 출력하거나 그림을 그릴때 사용합니다. 쉽게 말해서 출력 핸들을 윈도우로부터 가지고 와서 이 핸들을 이용해서 출력을 하는거죠. 윈도우에 대한 출력 함수를 보면 대부분 이 디바이스 컨텍스트 핸들을 파라미터로 요구합니다. 그렇다면 이 핸들을 어떻게 윈도우로부터 얻을수 있을까요? 물론 얻을수 있는 함수가 있습니다.
HDC BeginPaint(
HWND hwnd,
LPPAINTSTRUCT lpps
);
위 함수를 이용해서 디바이스 컨텍스트 핸들을 얻을수 있습니다. 리턴값을 보면 HDC라고 되어 있죠. 바로 디바이스 컨텍스트 핸들의 자료형입니다. 두번째 파라미터에 보면 못보던 자료형이 하나 있을 겁니다.
typedef struct _PAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT;
구체적으로 각 멤버가 어떤 역할을 하는지는 알 필요 없습니다. 단지 작업영역의 좌표를 기억하고 있다가 나중에 필요할때 이 값을 참조한다는 정도만 알고 있으면 됩니다.
BeginPaint() 함수를 이용해서 디바이스 컨텍스트 핸들을 얻은후 그 핸들을 이용해서 출력을 다 하면 다시 핸들을 반환해야 하는데 이때에는 EndPaint()함수를 사용합니다.
BOOL EndPaint(
HWND hwnd,
CONST PAINTSTRUCT *lpPaint
);
꼭 주의하시기 바랍니다. 프로그램상에서 출력 루틴이 끝나면 반드시 위 함수로 핸들을 반환해야 합니다.
자 핸들을 얻는 방법을 알아보았으니 출력하는 함수에 대해 알아 봅시다.
BOOL TextOut(
HDC hdc,
int nXStart,
int nYStart,
LPCTSTR lpString,
int cbString
);
윈도우의 작업영역에 출력을 할때 위 함수를 이용해서 합니다. 첫번째 파라미터는 얻은 디바이스 컨텍스트 핸들을 의미하고 두번째, 세번째 파라미터는 출력될 좌표를 그리고 네번째 파라미터는 문자열, 다섯번째 파라미터는 문자열의 길이를 의미합니다.
위 함수 말고도 출력하는 다른 함수도 있는데 그것은 DrawText()라는 함수입니다.
이 함수는 지정된 좌표에 문자열을 출력하는 것이 아니라 지정해준 사각 좌표의 원하는 위치에 문자열을 출력하는 것입니다. 쉽게 예를들어서 작업영역에 임의의 사각좌표를 지정해준다음 그 사각좌표의 가운데 또는 위 오른쪽 위치등에 문자열을 출력할수 있다는 것입니다.
int DrawText(
HDC hdc,
LPCTSTR lpszStr,
int cchStr,
LPRECT lprc,
UINT wFormat
);
첫번째 파라미터는 디바이스 컨텍스트 핸들을 의미하고 두번째 파라미터는 출력할 문자열, 세번째 파라미터는 문자열의 길이, 네번째 파라미터는 사각좌표, 다섯번째 파라미터는 예약되어 있는 문자열을 지정하는데 사각좌표의 구체적인
위치를 의미합니다. 이 안에 지정될수 있는 예약어는 다음과 같습니다.
DT_BOTTOM 사각좌표의 아래부분을 의미합니다.
DT_CENTER 사각좌표의 가로방향 가운데를 의미합니다.
DT_LEFT 사각좌표의 왼쪽 부분을 의미합니다.
DT_RIGHT 사각좌표의 오른쪽 부분을 의미합니다.
DT_SINGLELINE 한 라인에 출력함을 의미합니다.
DT_TOP 사각좌표의 윗 부분을 의미합니다.
DT_VCENTER 사각좌표의 세로방향 가운데를 의미합니다.
자 그럼 예제 소스를 보도록 합시다.
#include <windows.h>
#include <string.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArg, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS WndClass;
char szAppName[] = "This program is to print string";
WndClass.style = NULL;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = NULL;
WndClass.lpszClassName = szAppName;
if(!RegisterClass(&WndClass)) return NULL;
hWnd = CreateWindow(
szAppName,
szAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
RECT rect;
PAINTSTRUCT ps;
char szPrint[] = "This program is to print string";
switch(mesg)
{
case WM_PAINT :
GetClientRect(hWnd, &rect);
hDC = BeginPaint(hWnd, &ps);
TextOut(hDC, 10, 10, szPrint, strlen(szPrint));
DrawText(hDC, szPrint, strlen(szPrint), &rect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hWnd, &ps);
return FALSE;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
위 소스를 보면 못보던 메시지가 하나 있을 겁니다. 바로 WM_PAINT라는 메시지인데 이 메시지는 윈도우를 화면에 그릴때 발생되는 메시지입니다.
case WM_PAINT :
GetClientRect(hWnd, &rect);
hDC = BeginPaint(hWnd, &ps);
TextOut(hDC, 10, 10, szPrint, strlen(szPrint));
DrawText(hDC, szPrint, strlen(szPrint), &rect,
DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hWnd, &ps);
return FALSE;
윈도우를 화면에 그리고 바로 문자열을 작업영역에 출력하기 때문에 위 메시지하에 처리를 해 준겁니다.
뭐 특별히 다시 설명 드릴부분은 없는것 같군요. 단지 위 예제에서는 DrawText()함수를 이용해서 출력하게 되면 작업영역의 가운데에 문자열이 출력된다는 것만 아시면 됩니다.
반응형
Comments