Programming Language/Windows API

caret

D4tai1 2018. 8. 27.

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

댓글