Programming Language/Windows API

keyboard[3]

D4tai1 2018. 8. 27.

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

 

1) my.h 소스

void my_input(HDC hdc, WPARAM wParam, LPTSTR lpString, int *cnt);

 

 

2) my.cpp 소스

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

void my_input(HDC hdc, WPARAM wParam, LPTSTR lpString, int *cnt) {
	lpString[(*cnt)++] = wParam;
	lpString[*cnt] = NULL;

	TextOut(hdc, 0, 0, lpString, _tcslen(lpString));
}

 

+) 소스설명

 [1] LPTSTR lpString

  - Long Pointer 타입의 TCHAR String을 말한다.

  - TCHAR * 형과 동일하다.

 [2] int *cnt

  - 메세지처리함수 WinProc( )의 count의 주소를 가져온다.

  - 주소의 값으로 데이터 처리하여 call by reference

 [3] lpString[(*cnt)++] = wParam

  - 메세지처리함수 WinProc( )의 str의 count인덱스에 입력받은 값 저장 후 count값 증가.

 [4] lpString[*cnt] = NULL

  - 문자열 마지막에 NULL

 

 

 

3) keyboard[3].cpp 소스

#include "stdafx.h"
#include "keyboard[3].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;
	//static변수는 정적변수로 처음 1번만 초기화되고 이후 값이 그대로 유지된다.

    switch (message)
    {
    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_CREATE:
	{
		count = 0;
	}
	break;

	case WM_CHAR:
	{
		hdc = GetDC(hWnd);

		my_input(hdc, wParam, str, &count);

		ReleaseDC(hWnd, hdc);
	}
	break;

    case WM_PAINT:
        {
			hdc = BeginPaint(hWnd, &ps);
            // TODO: 여기에 hdc를 사용하는 그리기 코드를 추가합니다.

			TextOut(hdc, 0, 0, str, _tcslen(str));	
			// 적지 않으면 최소화나 창 이동시 사라짐.
            
			EndPaint(hWnd, &ps);
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}

 

 

4) (효율적인 코딩을 위해) 헤더파일 및 소스파일 추가

 [1] my.cpp 생성
 [2] my.h 생성
 [3] keyboard[3].cpp의 위에 #include "my.h"
 [4] my.cpp 에 keyboard[3].cpp에 있는 #include 파일 전부 복사
 [5] my.h 에 my.cpp에서 정의한 함수의 원형 작성

 

5) 문제점

 [1] 입력받은 문자열이 순서대로 출력되지만 창이동 및 최소화 시 영역이 초기화된다.

 [2] 보완하기위해 WM_PAINT의 내용에 TextOut( )함수를 사용하였지만 그러면 2번씩 출력이 된다.

 [3] 입력한 문자열이 backspace시 삭제되지 않고, Enter시 개행되지도 않는다.

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

keyboard[5]  (0) 2018.08.27
keyboard[4]  (0) 2018.08.27
keyboard[2]  (0) 2018.08.27
keyboard[1]  (0) 2018.08.27
키보드 메세지 처리  (0) 2018.08.26

댓글