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 |
댓글