관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

[강좌 6] 출력부분 본문

API 관련/API 강좌모음

[강좌 6] 출력부분

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

[API]강좌(6)<-- 출력부분





이번에는 출력에 대한 부분을 좀더 보도록 하죠.. 전부 세가지 예제를
들어서 설명드릴것입니다. 많이 사용되는 것이니 잘 알아 두시기 바랍니다.
제일 첫번째 예제로 우리는 출력 할때 정렬 기준을 오른쪽 으로 하게 하는
방법에 대해 알아 보겠습니다. 아마 여러분들 워드 프로세서 사용하시면서
문서의 정렬 방식을 왼쪽, 가운데, 오른쪽으로 하는 기능을 사용해 보셨을
겁니다. 사실 구현은 간단하죠. 함수 하나만 알면 되니깐요.
UINT SetTextAlign(
HDC hdc,
UINT fMode
);
두번째 파라미터에 어떤 값을 넣어주느냐에 따라 정렬방식이 바뀝니다. 어떤
파라미터들이 들어갈수 있는지 알아 볼까요?
TA_BOTTOM 문자열의 사각 좌표 아래 부분이 정렬 기준이 됩니다.
TA_TOP 문자열의 사각 좌표 위 부분이 정렬 기준이 됩니다.
TA_CENTER 문자열의 사각 좌표 가운데 부분이 정렬 기준이 됩니다.
TA_LEFT 문자열의 사각 좌표 왼쪽 부분이 정렬 기준이 됩니다.
TA_RIGHT 문자열 사각 좌표 오른쪽 부분이 정렬 기준이 됩니다.
자 그러면 이 함수를 이용해서 출력되는 문자열을 오른쪽으로 정렬하는 예제를
보도록 합시다.
#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;
PAINTSTRUCT ps;
static int x, y;
switch(mesg)
{
case WM_CREATE :
x = 100;
y = 10;
return FALSE;
case WM_PAINT :
hDC = BeginPaint(hWnd, &ps);
SetTextAlign(hDC, TA_TOP|TA_RIGHT);
TextOut(hDC, x, y, "This", 4);
y += 20;
TextOut(hDC, x, y, "is", 2);
y += 20;
TextOut(hDC, x,y, "a", 1);
y += 20;
TextOut(hDC, x, y, "test", 4);
EndPaint(hWnd, &ps);
return FALSE;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
자 프로그램 내용을 살펴 보도록 합시다.
case WM_CREATE :
x = 100;
y = 10;
return FALSE;
먼저 윈도우가 생성될때 문자열을 출력할 위치를 기억하고 있는 변수값을 초기화
하는 잡업을하고 있습니다.
case WM_PAINT :
hDC = BeginPaint(hWnd, &ps);
SetTextAlign(hDC, TA_TOP|TA_RIGHT);
오른쪽 정렬방식을 사용하기 위해서 위 함수를 사용했네요.
TextOut(hDC, x, y, "This", 4);
y += 20;
TextOut(hDC, x, y, "is", 2);
y += 20;
TextOut(hDC, x, y, "a", 1);
y += 20;
TextOut(hDC, x, y, "test", 4);
EndPaint(hWnd, &ps);
return FALSE;
프로그램을 실행시켜 보면 알겠지만 X좌표가 전부 같은데도 정렬되는 기준은 왼쪽으
로 되어 있지 않고 오른쪽으로 됨을 알수 있습니다. 함수 하나만 알면 되는 문제니
크게 어려운 점은 없을 겁니다.
이번에는 두번째 예제로 글자색과 배경색을 바꾸어서 출력하는 예제를 보도록 하
겠습니다. 이번에도 함수 두개만 알면 됩니다. 사용방법도 간단하죠.
COLORREF SetTextColor(
HDC hdc,
COLORREF crColor
);
글자색을 바꿀때 사용하는 함수입니다. 두번째 파라미터로 바꿀색을 RGB로 조합해
주면 됩니다.
COLORREF SetBkColor(
HDC hdc,
COLORREF crColor
);
배경색을 바꿀때 사용하는 함수입니다. 두번째 파라미터로 바꿀색을 RGB로 조합해
주면 됩니다. 함수 이름만 다르지 글자색 바꾸는 함수와 사용방법이 같죠.
그러면 배경색을 파란색으로 하고 글자색을 흰색으로 해서 출력하는 예제를 봅시다.
#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;
PAINTSTRUCT ps;
static int x, y;
switch(mesg)
{
case WM_CREATE :
x = 100;
y = 10;
return FALSE;
case WM_PAINT :
hDC = BeginPaint(hWnd, &ps);
SetTextAlign(hDC, TA_TOP|TA_RIGHT);
SetTextColor(hDC, RGB(255, 255, 255));
SetBkColor(hDC, RGB(0, 0, 125));
TextOut(hDC, x, y, "This", 4);
y += 20;
TextOut(hDC, x, y, "is", 2);
y += 20;
TextOut(hDC, x, y, "a", 1);
y += 20;
TextOut(hDC, x, y, "test", 4);
EndPaint(hWnd, &ps);
return FALSE;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
case WM_PAINT :
hDC = BeginPaint(hWnd, &ps);
SetTextAlign(hDC, TA_TOP|TA_RIGHT);
SetTextColor(hDC, RGB(255, 255, 255));
SetBkColor(hDC, RGB(0, 0, 125));
글자색을 흰색으로 하고 배경색을 파란색으로 설정하는 구문입니다.앞으로 이 디바
이스 컨텍스트 핸들을 가지고 출력하게 되면 글자색은 파란색이고 배경색은 흰색
으로 찍히게 됩니다.
TextOut(hDC, x, y, "This", 4);
y += 20;
TextOut(hDC, x, y, "is", 2);
y += 20;
TextOut(hDC, x, y, "a", 1);
y += 20;
TextOut(hDC, x, y, "test", 4);
EndPaint(hWnd, &ps);
return FALSE;
마지막 예제로 배경 모드에 관한 예제에 대해 알아 보겠습니다. 배경모드는 크게
두가지로 나눌수 있습니다. 예를들어서 설명드릴까요? 만약에 윈도우의 작업영역
에 그림이 출력되어 있다고 합시다. 그리고 그 위에 test라는 문자열을 출력하게
되면 어떻게 될까요? 기본적으로 윈도우에 문자열을 출력하게 되면 글자색은 검정
색이고 배경색은 흰색이기 때문에 문자열이 출력된 test전체 영역은 하얀색 배
경색을 가지게 됩니다. 즉 다시 말하면 ㅈ자열이 출력된 사각 영역 부분은 그림
을 가리게 되는 것입니다. 이게 기본적인 배경모드입니다. 그러나 이 배경모드를
다른 하나로 바꾼다면 뒷 배경에 영향을 주지 않고 글자를 출력할수 있습니다.
이 때 아래의 함수를 사용해서 배경모드를 바꿀수 있습니다.
int SetBkMode(
HDC hdc,
int iBkMode
);
두번째 파라미터로 어떤 값을 지정하느냐에 따라 배경모드를 기본모드로 또는 배경
에 영향을 주지 않는 모드로 전환할수 있습니다. 아래는 두번째 파라키터에 들어갈
수 있는 예약어입니다.
OPAQUE 기본적으로 세팅되어 있는 배경모드입니다.
TRANSPARENT 배경에 영향을 주지 않는 세팅모드입니다.
자 그러면 간단하게 예제를 들어서 이해해 보도록 합시다.
#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;
PAINTSTRUCT ps;
switch(mesg)
{
case WM_PAINT :
hDC = BeginPaint(hWnd, &ps);
SelectObject(hDC, GetStockObject(SYSTEM_FIXED_FONT));
SetTextColor(hDC, RGB(255, 255, 255));
SetBkColor(hDC, RGB(0, 0, 125));
TextOut(hDC, 10, 10, "This is a test", 14);
TextOut(hDC, 10, 30, " ", 14);
SetTextColor(hDC, RGB(255, 255, 255));
SetBkColor(hDC, RGB(0, 0, 0));
SetBkMode(hDC, TRANSPARENT);
TextOut(hDC, 10, 30, "This is a test", 14);
EndPaint(hWnd, &ps);
return FALSE;
case WM_DESTROY :
PostQuitMessage(0);
return FALSE;
}
return DefWindowProc(hWnd, mesg, wParam, lParam);
}
자 그러면 실제적으로 출력하는 루틴을 보도록 합시다.
case WM_PAINT :
hDC = BeginPaint(hWnd, &ps);
SelectObject(hDC, GetStockObject(SYSTEM_FIXED_FONT));
SetTextColor(hDC, RGB(255, 255, 255));
SetBkColor(hDC, RGB(0, 0, 125));
TextOut(hDC, 10, 10, "This is a test", 14);
좌표 (10, 10)에 파란색의 배경, 흰색의 글자를 갖는 문자열을 출력하는군요.
TextOut(hDC, 10, 30, " ", 14);
좌표 (10, 30)에 파란색의 배경, 흰색의 글자를 갖는 문자열을 출력하는데 출력하
는데 문자열이 없으니 그냥 파란색으로 칠해지기만 하겠죠?
SetTextColor(hDC, RGB(255, 255, 255));
SetBkColor(hDC, RGB(0, 0, 0));
배경색을 바꾸었습니다.
SetBkMode(hDC, TRANSPARENT);
배경 모드를 배경을 지우지 않는 것으로 바꾸었네요.
TextOut(hDC, 10, 30, "This is a test", 14);
위와 똑같은 좌표에 문자열을 출력하고 있습니다. 정상적으로 배경 모드를 바꾸지
않고 기본적으로 했다면 분명히 흰색 글자에 검정색 배경을 가진 문자열이 출력
되었을텐데 배경모드를 바꾸었기 때문에 뒷 배경에 영향을 주지 않습니다.
즉 이 배경색을 바꾸기전에 윈도우에 출력되어 있는 파란색 부분이 그대로 있는
것입니다. 쉽게 얘기해서 글자색은 흰색 배경색은 파란색으로 찍힌 문자열을
눈으로 확인할수 있을 겁니다. 이해하기 어렵지 않죠?
EndPaint(hWnd, &ps);
return FALSE;
오늘 알아본 세가지 예제는 그렇게 크게 어련운것이 없을 겁니다. 함수만 알면
되는거죠 뭐.
반응형

'API 관련 > API 강좌모음' 카테고리의 다른 글

[강좌 8] 메뉴1  (0) 2007.10.26
[강좌 7] 마우스, 타이머  (0) 2007.10.26
[강좌 5] 입력부분  (0) 2007.10.26
[강좌 4] 문자열 출력  (0) 2007.10.26
[강좌 3] 윈도우의 생성과 다루기  (0) 2007.10.26
Comments