Programming Language/Windows API

keyboard[4]

D4tai1 2018. 8. 27.

1. 키보드 입력 시 문자열 입력 후 출력

 

1) my.h 소스

void my_initial(HDC hdc);

void my_input(HWND hWnd, WPARAM wParam, LPTSTR lpString, int *cnt);

void my_print(HDC hdc, LPTSTR lpString);

 

 

2) my.cpp 소스

#include "stdafx.h"
#include "keyboard[4].h"
#include "my.h"

//void my_initial(HDC hdc) {
//	TCHAR tmp[80];
//
//	_stprintf_s(tmp, _T("키보드로 입력하세요!!"));
//	TextOut(hdc, 0, 0, tmp, _tcslen(tmp));
//}

void my_input(HWND hWnd, WPARAM wParam, LPTSTR lpString, int *cnt) {
	lpString[*cnt] = wParam;
	(*cnt)++;

	lpString[*cnt] = NULL;

	InvalidateRgn(hWnd, NULL, TRUE);

}

void my_print(HDC hdc, LPTSTR lpString) {
	TextOut(hdc, 0, 0, lpString, _tcslen(lpString));
}

 

+) 소스설명

 [1] InvalidateRgn(hWnd, NULL, TRUE)

 - 화면영역수정함수
 - 형식 : InvalidataRgn(hWnd, 영역(NULL시 전체영역), TRUE시 전체무효화 || FALSE시 무효화하지 않음)
 - 사용하는 이유 ? 특정영역을 무효화 후 WM_PAINT 발생

 

 

 

 

 

3) keyboard[4].cpp 소스

#include "stdafx.h"
#include "keyboard[4].h"
#include "my.h"

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	
	static TCHAR str[100];
	static int count;

    switch (message)
    {
	case WM_CREATE:
	{
		count = 0;
		//my_initial(hdc);
	}
	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);
           
			my_print(hdc, str);

            EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

 

4) 문제점

 [1] 창이동 및 최소화시 사라지는 문제를 해결하기 위해 WM_PAINT에도 출력을 넣었으나 이중출력으로

 WM_CHAR에서 출력을 빼고 InvalidateRgn( )로 무효화 후 강제로 WM_PAINT가 발생하여 출력하도록 한다.

 [2] 그러나 아직도 입력한 문자열이 backspace시 삭제되지 않고, Enter시 개행되지도 않는다.

'Programming Language > Windows API' 카테고리의 다른 글

keyboard[6]  (0) 2018.08.27
keyboard[5]  (0) 2018.08.27
keyboard[3]  (0) 2018.08.27
keyboard[2]  (0) 2018.08.27
keyboard[1]  (0) 2018.08.27

댓글