caret
1. caret
- 새로운 문자를 입력받기 위해 위치를 표시한 것을 말한다.
1) my.h 소스
void my_rect(RECT *rt); void my_input(HWND hWnd, WPARAM wParam, LPTSTR lpString, int *cnt); void my_paint(HDC hdc, LPTSTR lpString, RECT *rect, int *cnt);
2) my.cpp 소스
#include "stdafx.h"
#include "caret.h"
#include "my.h"
void my_rect(RECT *rt) {
rt->left = 0;
rt->top = 20;
rt->right = 1000;
rt->bottom = 1000;
}
void my_input(HWND hWnd, WPARAM wParam, LPTSTR lpString, int *cnt) {
if (wParam == VK_BACK && *cnt > 0) {
(*cnt)--;
}
else {
lpString[(*cnt)++] = wParam;
}
lpString[*cnt] = NULL;
InvalidateRgn(hWnd, NULL, TRUE);
}
void my_paint(HDC hdc, LPTSTR lpString, RECT *rect, int *cnt) {
TCHAR length[20];
_stprintf_s(length, _T("length : %d"), *cnt);
TextOut(hdc, 0, 0, length, _tcslen(length));
TextOut(hdc, 0, 20, lpString, _tcslen(lpString));
//DrawText(hdc, lpString, _tcslen(lpString), rect, DT_LEFT | DT_TOP);
}
3) caret.cpp 소스
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
RECT rect;
static SIZE size;
static TCHAR str[100];
static int count;
switch (message)
{
case WM_CREATE:
{
count = 0;
CreateCaret(hWnd, NULL, 2, 15);
ShowCaret(hWnd);
}
break;
case WM_CHAR:
{
hdc = GetDC(hWnd);
my_input(hWnd, wParam, str, &count);
ReleaseDC(hWnd, hdc);
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 메뉴 선택을 구문 분석합니다.
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
GetTextExtentPoint(hdc, str, _tcslen(str), &size);
my_rect(&rect);
my_paint(hdc, str, &rect, &count);
SetCaretPos(size.cx, size.cy+4);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
HideCaret(hWnd);
DestroyCaret();
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
+) 소스설명
[1] CreateCaret(hWnd, NULL, 2, 15)
- BOOL CreateCaret(HWND hWnd, HBITMAP Bitmap, int width, int height); 형식
- CreateCaret(캐럿이 나타날 창의 번호, 캐럿의 비트맵속성[NULL 시 검정], 가로길이, 세로길이)
- 캐럿을 만드는 것을 의미한다.
[2] ShowCaret(hWnd)
- 만들어진 캐럿이 보이게 하는 것을 의미한다.
[3] GetTextExtendPoint(hdc, str, _tcslen(str), &size)
- 캐럿의 위치를 얻기위해 문자열이 차지하는 크기를 측정하는 함수이다.
- 출력할 화면정보(폰트, 크기 등)에 문자열의 내용과 문자열의 길이, 문자열의 너비와 높이를 측정할 size의 주소를
입력 시 너비와 높이를 측정하여 size에 값을 반환한다.[문자열 내용을 적는 이유는 문자마다 크기가 다르기 때문]
[4] SetCaretPos(size.cx, size.cy)
- 캐럿을 출력할 위치를 설정한다.
[5] HideCaret(hWnd)
- 캐럿을 감춘다.
[6] DestroyCaret( );
- 캐럿을 삭제한다.
[+] static SIZE size;
- SIZE 구조체는 LONG타입의 cx와 cy로 구성되어 있다.
4) 문제점
[1] DrawText( )함수를 사용하면 개행 시 caret이 내려가지 않는다.
[실행화면]
'Programming Language > Windows API' 카테고리의 다른 글
| keyboard[마지막] (0) | 2018.09.10 |
|---|---|
| shape (0) | 2018.08.27 |
| keyboard[6] (0) | 2018.08.27 |
| keyboard[5] (0) | 2018.08.27 |
| keyboard[4] (0) | 2018.08.27 |
댓글