공부 중 메모/winAPI

1. 문자열 출력하기

라이피 (Lypi) 2018. 8. 4. 20:56
반응형

이전 내용은 lib로 연결함.

(lib생성과 연결은 이후에 추가예정)


headerText.h

#pragma once

#include "libHeader.h"
#include <tchar.h>

//1. 출력 영역 얻어오기
//  - 윈도우에 텍스트를 출력하거나 그림을 그리려면 먼저 커널에서 출력 영역을 얻어와야 한다.
//  - 윈도우의 출력 영역은 좌측 상단 모서리를 원점으로 하는 화면 좌표계를 사용한다.
//  - 출력을 위해서 얻어온 화면 영역을 디바이스 컨텍스트(Device Context : DC)라 한다. 
//  - 얻어온 DC는 HDC 타입의 변수에 저장해서 사용한다. 
//  - HDC 타입은 메모리 영역을 관리하며, 메모리 영역에는 얻어온 화면 영역에 대한 속성값을 저장할 수 있다.

//  - DC를 얻어오는 함수/ 해제하는 함수 :
//
//    1) HDC BeginPaint(HWND hwnd, PAINTSTRUCT* lpPaint); / BOOL EndPaint(HWND hwnd, PAINTSTRUCT* lpPaint);
//         HWND hwnd            : DC를 받아올 윈도우의 핸들값, 
//         PAINTSTRUCT* lpPaint : 출력 영역에 대한 정보를 저장할 PAINTSTRUCT 구조체의 주소
//      : WM_PAINT 메시지 안에서 사용되는 전용 함수. (다른 곳에서는 사용 불가)
//       GetMessage()로 메시지를 받아오면 대부분의 경우 가져온 뒤 큐에서 메시지를 지우지만 WM_PAINT메시지는 지우지 않는다.
//       WM_PAINT 메시지는 BeginPaint()가 그리기를 시작할 때 한다. 
//       그러므로 WM_PAINT메시지 안에는 BeginPaint();와 EndPaint();가 꼭 있어야한다.
// 
//    2) HDC GetDC(HWND hwnd); / int ReleaseDC(HWND hwnd, HDC hdc);
//         HWND hwnd            : DC를 받아올 윈도우의 핸들값, 
//         HDC hdc              : 반환할 DC의 핸들값.
//      : 단순히 DC만 얻어오는 함수. 다른 곳에서 사용할 수 있다. 
//       BeginPaint()는 WM_PAINT 메시지가 호출될 때 사용되므로 지워진 영역(무효화 영역)을 새로 그려주지만 GetDC는 그런 기능이 없다.

//  - 텍스트 출력 함수 :
//
//    1) BOOL TextOut(HDC hdc, int x, int y, LPCTSTR lpString, int nLength);
//         HDC hdc           : 텍스트를 출력할 윈도우 DC의 핸들값
//         int x, y          : 텍스트를 출력할 위치의 x,y좌표
//         LPCTSTR lpString  : 출력할 텍스트
//         int nLength       : 출력할 텍스트의 길이
//
//    2) int DrawText(HDC hdc, LPCSTR lpString, int nLength, LPRECT lpRect, UINT Flags);
//         HDC hdc           : 텍스트를 출력할 윈도우 DC의 핸들값
//         LPCSTR lpString   : 출력할 텍스트
//         int nLength       : 출력할 텍스트의 길이
//         LPRECT lpRect     : 문자열을 출력할 박스 영역의 좌표가 저장된 RECT타입 변수의 주소값
//         UINT Flags        : 박스 영역의 어느 위치에 어떻게 출력할지에 대한 플래그 값.
//


WNDPROC(WndProc)
{
	HDC          hdc;
	PAINTSTRUCT	 ps;
	
	RECT         box1;
	box1.left = 50;
	box1.top = 40;
	box1.right = 200;
	box1.bottom = 120;

	RECT         box2;
	box2.left = 210;
	box2.top = 130;
	box2.right = 360;
	box2.bottom = 210;

	static TCHAR str[2];

	switch (iMsg) {
		case WM_CREATE:      //윈도우를 열 때

			break;

		case WM_PAINT:        //윈도우를 화면에 그릴 때
			hdc = BeginPaint(hwnd, &ps);
			TextOut(hdc, 0, 0, L"Hello World.", 10);
			DrawText(hdc, L"Hello World.", 10, &box1, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
			EndPaint(hwnd, &ps);
			break;

		//버튼을 누르면 입력한 문자가 출력된다.
		case WM_CHAR:
			hdc = GetDC(hwnd);
			str[0] = wParam;
			str[1] = '\0';
			TextOut(hdc, 100, 0, str, lstrlen(str));
			DrawText(hdc, str, lstrlen(str), &box2, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
			ReleaseDC(hwnd, hdc);
			break;

		case WM_DESTROY:      //윈도우를 닫았을 때
			PostQuitMessage(0);
			break;
	}

	return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

winMain.cpp


#include "headerText.h"

WINMAIN(hInst)
{
	WNDCLASSEX   Wnd_1;
	ZeroMemory(&Wnd_1, sizeof(WNDCLASSEX));

	Wnd_1.cbSize = sizeof(WNDCLASSEX);
	Wnd_1.hInstance = hInst;
	Wnd_1.lpfnWndProc = WndProc;
	Wnd_1.lpszClassName = L"window_1";

	if (RegisterClassEx(&Wnd_1) == false) {
		return 1;
	}

	HWND         hwnd_1;
	hwnd_1 = CREATEDEFAULTWINDOW(L"window_1", hInst);
	if (hwnd_1 == NULL) {
		return 1;
	}
	ShowWindow(hwnd_1, SW_SHOW);

	MSG          msg;
	ZeroMemory(&msg, sizeof(MSG));

	while (true) {

		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			TranslateMessage(&msg);
			DispatchMessage(&msg);

			if (msg.message == WM_QUIT) {
				break;
			}
		}
		else {
			//IdleTime
		}
	}
	return 0;
}


반응형