ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 활용 - 메모장 만들기 ( 자동 개행, 엔터 키, 백 스페이스 바 기능 )
    Win API/4. GDI 2021. 4. 2. 12:20

    개발 환경은 Visual Studio 2008

    메모장을 만들기 전에, 아래의 프로그램을 통해 구현의 방향을 잡아보자.

    프로그램에 대한 분석은 밑에서 하도록 하자.

    분석을 해보자.

    이 프로그램의 핵심은 키보드로 부터 문자를 입력받아 화면으로 출력한다. 

    입력된 키는 str버퍼에 누적되며 누적된 문자열을 WM_PAINT에서 출력하도록 하기 위해 작업 영역을 무효화한다. 

    이전 입력된 문자열이 누적되어 계속 출력되므로 작업 영역을 지울 필요가 없어 bErase는 FALSE로 주었다. 

    InvalidateRect 호출문을 삭제하면 키보드를 눌러도 화면으로 문자열이 출력되지 않는다. 

    실행 결과는 아래와 같이 키보드를 누를 때마다 작업 영역이 무효화되며 눌러진 키가 화면으로 출력된다. 

    내부적인 변화에 의해 화면이 다시 그려저야 할 때 InvalidateRect 함수를 호출하여 화면을 무효화해 주어야 한다.

     

    프로그램 실행결과

     

    소스 파일

    WinMain.cpp
    0.00MB

     

     

     

    위에서 일차원 배열에 눌린 키 값을 저장하고 나서 TextOut 함수를 통해 문자열을 출력함을 볼 수 있다.

    우리가 일반적으로 생각하는 메모장은 멀티 라인으로 글의 입력이 가능하므로

    이는 이차원 배열을 활용해야 함을 알 수 있다.

    그리고 이 이차원 배열의 각 행의 맨 마지막 자리에는 반드시 널 문자를 삽입해야 한다.

    이차원 배열에서 저장할 위치의 열이 널 문자를 저장할 위치라면

    열을 0으로 초기화하고 행을 하나 증가시키면 개행의 기능을 쉽게 만들 수 있다.  

    크게 WM_CHAR 메시지에서는 이차원 배열에 입력받은 문자를 저장하고

    WM_PAINT 메시지에서 이차원 배열의 내용을 출력한다.

    아래의 size_t는 unsigned int 를 의미한다.

     

     

     

    프로그램 실행결과

    아래와 같이 이차원 배열의 범위를 넘어서면 더 이상의 입력을 할 수 없다.

    소스 파일

    WinMain.cpp
    0.00MB

     

     

     

    이번에는 "엔터 키"의 입력이 들어오면 개행이 되도록 작성해보자.

    위의 내용을 그대로 가지고 와서 만든다.

    위의 내용이 좀 조잡한 것 같아서 약간 변경을 하였다.

    "엔터 키"의 역할은 개행의 역할이므로, 개행이 발생할 때, 현재의 위치에 널 문자를  삽입한다.

    아래의 함수를 하나 만드는데, 이 함수의 목적은 디버깅 용도이다.

    현재 행과 열의 위치를 윈도우 창의 캡션에 출력하는 역할을 한다.

     

     

    프로그램 실행결과

     

    소스 파일

    WinMain.cpp
    0.00MB

     

     

     

    이번에는 백 스페이스 바를 기능을 추가 해보자.

    위의 내요을 그대로 가지고 와서, 아래의 내용을 추가하면 된다.

     

     

    소스 파일

    WinMain.cpp
    0.00MB

    댓글

Designed by Tistory.