본문 바로가기
코스웨어/15년 스마트컨트롤러

20151113 WinAPI / 11번 남수진

by 알 수 없는 사용자 2015. 11. 13.
728x90
반응형

WinAPI

  • 문자열이 한문으로 출력되지 않기위해 ""앞에 따로 처리해줘야함
    • 윈도우가 문자열을 2바이트 유니코드로 인지하여 1바이트 표현인 "" 문자열이 깨진다
    • 유니코드
      • 2바이트의 문자 체제
      • 모든 문자를 2바이트로 처리한다
      • 아스키코드도 포괄한다
        • 아스키만 사용할 때는 1바이트로 씀
        • C에서 일반 문자열은 1바이트를 쓰지만 최신 언어는 언어를 보통 2바이트로 사용
    • win32는 1바이트와 2바이트 방식이 혼재되어 있음
      • 1바이트 문자열은 char 형
      • 2바이트 문자열은 wchar 형
    • C로 배운 함수는 char로 인지, Win32 함수를 호출하면 wchar로 인지
    • 컴파일러가 문자열을 wchar로 인지하도록 하는 방법
      • L""
      • TEXT(""): 주로 win32에서 사용
      • _T(""): 주로 mfc에서 사용

Image

  • 윈도우 배경색 바꾸기

Image(4)[6]

  • 윈도우 모양바꾸기

Image(5)[6]

  • 윈도우 창 모양 바꾸기
    • CreateWindow의 세번째 인자

Image(6)[6]


  • 윈도우 커서 바꾸기

Image(7)[6]

Image(8)[6]


  • DC(Device Context)
    • 장치의 상태를 저장한다
    • device가 무엇인지는 알 필요 없음
    • 그리기 동작을 수행할 때 GDI(Graphic Device Interface) 등의 그래픽 상태를 읽기/읽어온 상태를 폐기하는데 사용한다
  • 그리기에서 DC 활용
    • 그리기에 필요한 정보들을 DC에 저장한다
    • DC를 활용함으로써 그리기 함수에서 화면 크기와 DC의 핸들 하나만 넘겨주면 그리기를 처리할 수 있다.
    • 현재 상황에서 어느 부분이 출력 영역인가를 확인하여 그리기를 제어한다
      • 겹친 창에서 그릴 부분과 그리지 말아야할 부분 구분
  • 옛날에는 그래픽 디바이스에 맞춰서 그래픽 크기 등을 조정해야 했음
    • 자바로 만들면 가상 머신이 화면에 맞춰서 그래픽을 알아서 조정
    • 모든 기기에서 돌릴 수는 있지만 모든 기기에서 최적화할 수는 없다
  • 아이폰은 C로 계발하기 때문에 모든 종류의 기기의 해상도에 맞춰 만들어야 한다
    • 아이폰 용 게임을 아이패드에서 실행하면 화면이 이상하게 나오곤 한다
  • 디지털은 사진을 확대하면 깨지지만 아날로그는 확대하면 색이 희미해진다

  • 화면에 텍스트를 그리는 예제
  1. dc를 얻는다
  2. TextOut으로 텍스트 출력
  3. dc를 해제한다

 

Image

Image(9)[6]

  • 창을 가렸다 다시 띄우면 그려진 문자가 지워진다
    • 창이 활성화될 때마다 화면을 다시 그리기때문에
    • 글자가 화면에만 떴지 실제로 기록되어있지 않아서 문자는 다시 그려지지않는다
    • 이를 해결하기 위해 WM_PAINT 메시지가 수신되었을 때 문자를 다시 그리도록 설정한다

Image(10)[6]

 


  • 문자열 정렬
    • SetTextAlign 함수 사용
    • 첫번째 인자로 들어간 DC를 사용하여 문자열을 출력하면 여기서 설정한 문자열 정렬이 적용된다

 

Image

Image(11)[6]

Image(12)[6]


  • RECT 구조체
    • 사각형을 표현하는 구조체
    • left, top, right, bottom 각각을 위한 4개의 숫자 사용
  • RECT로 지정한 범위에 문자 그리기
    • DrawText() 함수 사용
    • 가로범위보다 문자열이 크면 자동개행된다
  • 그래픽 출력 함수
    • 점 찍기
      • SetPixel()
    • 줄 긋기
      • MoveToEx()   ->   LineTo()
    • 사각형
      • Rectangle()
    • 타원
      • Ellipse()

Image

Image(13)[6]

 

 

  • 메시지 박스
    • MessageBox() 함수를 사용한다
    • 두번째 인자는 메시지 박스 내용, 세번째 인자는 메시지 박스 이름
    • 선택한 버튼에 맞는 인덱스를 반환한다

Image(14)[6]

Image(15)[6]

Image(16)[6]

Image(17)[6]

  • 4번째 연산에서 or 연산으로 메시지 박스 안에 아이콘을 넣을 수도 있다

Image(18)[6]

Image

Image(19)[6]


  • WM_CHAR 메시지
    • 키보드 입력 때 발생하는 메시지
    • WinProc의 인자 wParam을 통해 키보드 입력 문자를 WinProc으로 전달한다
      • lparam 은 키보듸 입력에 관한 추가정보를 전함
        • Image(21)[4]
      • wParam은 4byte이므로 (TCHAR)로 캐스팅하여 대입
    • 유니코드 문제로 인한 에러 방지를 위한 수정
      • strlen -> lstrlen
        • strlen은 1바이트 단위로 문자를 처리하는 함수이므로 lstrlen을 사용한다
      • char -> WCHAR
        • 1바이트 문자를 다루는 자료형 char은 2바이트 문자열을 위한 WCHAR로 바꾼다

Image

Image

Image

 


  • 무효화 영역(Invalidate 영역)
    • 다른 창에 가려져 있었다 등의 이유로 다시 그려져야하는 영역
    • BOOL InvlidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);
      • 윈도우에 무효화 영역이 있다는 것을 알려 WM_PAINT 메시지를 요청한다
      • hWnd : 그려질 윈도우 핸들
      • lpRect : 다시 그릴 영역
        • 모든 영역을 다시 그리면 속도가 느려지므로 여기서 설정한 일부 영역만 그리도록 한다
        • NULL이면 전 영역을 다시 그린다
      • bErase
        • 배경을 지운 후 다시 그릴 것인지 여부를 지정
        • 그냥 덮어쓰는 것이 좋다

Image(22)[4]


  • 스페이스 바를 누르면 문자열이 지워지도록 예제에 윗윗 예제에 추가
    • 배열 맨 앞에 0을 넣어서 문자를 지운다

 

Image

Image

 


  • WM_KEYDOWN
    • 가상키 코드
      • 어떤 키보드를 연결하든 어플리케이션에 보내는 문자 코드는 일정하게 통일
      • WM_KEYDOWN 메시지에서 wParam 인자로 들어온다

Image

    • WM_KEYDOWN의 wParam 인자를 사용한 A 움직이기
      • 왼쪽과 위쪽으로 넘어가서 A가 안보이게 되는 것을 막는 코드 추가
      • 경계처리: 이동 대상이 윈도우 범위를 넘어가지 않도록 하는 처리

 

Image

Image

Image

Image

728x90