캐럿이란 무엇일까?
캐럿은 우리가 메모장에 글을 쓸때 가장 마지막 커서에서 점멸하는 막대기 이다.
이번에는 이 막대기를 화면에 표시하는 법이다.
#include <windows.h>
#include <TCHAR.H>
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS WndClass;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_QUESTION); //윈도우 아이콘
WndClass.hCursor = LoadCursor(NULL, IDC_IBEAM); //커서 모양
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //배경 색
WndClass.lpszMenuName = NULL; //메뉴 이름
WndClass.lpszClassName = _T("Window Class Name"); //윈도우 클래스 이름
RegisterClass(&WndClass);
hwnd = CreateWindow(_T("Window Class Name"),
_T("Cobaltbru's First Window"), //윈도우 타이틀 이름
WS_OVERLAPPEDWINDOW, //윈도우 스타일
200, //윈도우 위치 X
300, //윈도우 위치 Y
600, //윈도우 가로
400, //윈도우 세로
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, nCmdShow); //윈도우 기본 출력 함수
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) //메시지 처리 함수
{
HDC hdc;
PAINTSTRUCT ps;
static TCHAR str[1000];
static int count;
static SIZE size; //문자열 크기 저장
switch (iMsg)
{
case WM_CREATE:
CreateCaret(hwnd, NULL, 5, 15); // 캐럿 생성
ShowCaret(hwnd); // 캐럿 표시
count = 0;
break;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
GetTextExtentPoint(hdc, str, _tcslen(str), &size); // 문자열 크기 측정 함수
TextOut(hdc, 0, 0, str, _tcslen(str));
SetCaretPos(size.cx, 0); // 캐럿 위치 설정
EndPaint(hwnd, &ps);
break;
case WM_CHAR:
if (wParam == VK_BACK && count > 0) count--;
else str[count++] = wParam; // 문자를 저장한 후 count 를 1늘리고
str[count] = NULL; // NULL로 초기화
InvalidateRgn(hwnd, NULL, TRUE); //즉시 WM_PAINT를 호출
break;
case WM_DESTROY:
HideCaret(hwnd);
DestroyCaret(); // 캐럿 삭제
PostQuitMessage(0);
break;
} //처리할 메시지만 case문에 나열
return DefWindowProc(hwnd, iMsg, wParam, lParam); //나머지는 커널이 처리
}
캐럿을 생성하는데에는 크게
1. 캐럿 생성
2. 캐럿 표시
2. 캐럿 위치 설정
이 필요하고
캐럿의 위치를 설정하기 위해 계속해서 문자열의 길이 정보를 얻어와야 한다.
여기서 헷갈리면 안되는 것은 문자열의 정보가
단순히 문자의 갯수를 말하는 것이 아니라 총 문자열의 픽셀 수를 말하는 것이다.
다행이도 GetTextExtentPoint() 함수는 우리가 일일히 모든 문자의 픽셀을 세지 않아도 되게끔 도와준다.
즉 캐럿이 화면에 표시되는 과정은
1. 캐럿을 생성
2. 캐럿을 표시
3. 문자의 입력
4. 문자열의 길이 측정
5. 측정된 값으로 캐럿 이동
이다.
당연한 듯이 나를 따라오던 캐럿 조차 수동으로 움직여줘야 한다.
'핵심 API로 배우는 윈도우 프로그래밍' 카테고리의 다른 글
핵심 API로 배우는 윈도우 프로그래밍 연습문제 2장 1~3 (2) | 2022.09.19 |
---|---|
윈도우에 그림 그리기 (0) | 2022.09.18 |
윈도우에 문자열을 출력해보자 (0) | 2022.09.15 |
윈도우 창 생성 기본 (0) | 2022.09.14 |
들어가며 (0) | 2022.09.14 |