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

20151116 API_3/ 남수진

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

WinAPI

  • 마우스
    • 마우스를 눌렀을 때 들어오는 인자 lParam, wParam으로 마우스 클릭 정보를 알 수 있다
    • lParam 인자를 통해 좌표값이 들어온다
      • 화면이 아니라 윈도우 창을 기준으로 얻은 좌표값이다
      • 각각 16 bit를 가진다
    • wParam 인자 값을 통해서는 Shift, Ctrl 상태가 전달된다
    • 마우스 관련 발생하는 윈도우 메시지

    • wParam에서 전달되는 마우스 클릭 관련 정보

    • 마우스 관련 예제


  • WinAPI는 기본적으로 도스의 C이므로 모르는 자료형은 define되어있다
  • 유니코드 지원함수
    • C에서 쓰던 함수들은 WinAPI로 가면서 문자열을 2바이트 처리하도록 유니코드 지원함수로 바꿔줘야한다
    • 유니코드 지원함수는 C 함수 앞에 l이나 w를 붙여서 쓴다
      • sprintf -> wsprintf
      • strlen -> lstrlen

  • 화면에 마우스의 좌표값을 표시하는 프로그램


  • 더블클릭
    • 더블클릭 이벤트를 발생시키기 위해서는 WinMain 함수의 WndClass를 수정해야한다
      • WndClass.style에 CS_DBLCLKS를 or로 추가시켜준다
    • 위의 예제에서
      • WM_PAINT에 TextOut하는 코드를 WM_LBUTTONDOWN으로 옮긴다
      • LW_LBUTTONDOWN의 InvalidateRect를 지운다
      • 아래 그림과 같이 WM_LBUTTONDBLCK 메시지를 추가시킨다


  • 소프트웨어 타이머
    • SetTimer(hWnd, 타이머 번호, ms 단위의 타이머 호출 간격, 호출되는 함수 주소)
      • 타이머를 만드는 함수
      • 타이머 번호: 만들어진 여러개의 타이머를 구분
      • 호출되는 함수 주소를 NULL로 하면 WM_TIMER라는 메시지만 생성된다
        • WndProc이 호출됨
    • time(&변수)
      • 현재 시간을 초로 알아내는 함수
    • ctime(&변수)
      • time에서 얻은 시간을 문자열로 변환
    • KillTimer(hWnd, 타이머 번호)
      • 타이머를 다 쓰고 닫아줘야함
      • 타이머 번호는 만들 때와 같아야 한다
    • WM_CREATE
      • 창이 생성될 때 만들어지는 메시지
    • 타이머를 이용해 현재 시간을 표시하는 프로그램
      • 위의 함수들은 char * 형에 맞춰져 있으므로 유니코드를 기반으로 하는 현재 소스에서는 사용할 수 없다
        • 아래의 함수들을 사용하여 현재 시간을 구하고 문자열로 변환한다
      • GetLocalTime(&SYSTEMTIME)
        • SYSTEMTIME 형 변수에 현재 시간관련 정보를 받아온다
      • wsprintf(sTime
             , TEXT("지금 시간은 %d:%d:%d입니다")
             , st.wHour
             , st.wMinute
             , st.wSecond);
        • wsprintf로 sTime 배열에 현재 시간관련 정보를 삽입한 유니코드 문자열을 복사한다

  • 위의 프로그램에서 프로그램이 실행되자마자 시간이 뜨도록 하는 방법
    • WM_CREATE 메시지가 발생할 때 SendMessage로 WM_TIMER 메시지를 강제 발생시킨다
    • LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
      • 프로그래머가 직접 윈도우 메시지를 발생시키도록 하는 방법
      • Msg: 발생시킬 윈도우 메시지 종류
      • wParam, lParam: WinProc이 실행될 때 전달되는 인자를 직접 설정
        • 보통 타이머 번호를 같이 전달
    • 타이머를 여러개 사용하면 WM_TIMER에서 case를 이용해 타이머 번호로 발생한 타이머를 구분한다


  • 콜백 함수
    • 메시지가 아니라 함수 호출로 타이머를 실행하는 방식
      • WM_TIMER의 경우 다른 메시지에 밀려 정확한 시간에 실행되지 않을 수 있다
    • CALLBACK 으로 타이머에서 호출할 함수를 만들고 SetTimer의 네번째 인자에 실행할 함수의 이름을 적는다
    • 타이머가 발생할 때 마다 100개의 점을 윈도우에 찍는 프로그램

  • 콜백 함수
    • 운영체제가 필요할 때  호출하는 함수

  • 작업영역
    • GetClientRect()
      • 윈도우의 클라이언트 영역의 크기를 RECT 형 변수로 가져온다
      • 윈도우의 정중앙

    • 윈도우의 중심에 문자열을 출력하는 프로그램

  • WM_SIZE
    • 창 크기를 바꿀 때 생기는 메시지
  • WM_MOVE
    • 창을 이동시키면 호출되는 메시지

  • 리소스 편집기
  • 메뉴 리소스 추가 순서

    • 리소스를 만들면 헤더파일에 자동으로 resource1.h가 추가된다
    • resource1.h 파일을 보면 메뉴와 메뉴 항목들의 고유번호가 define 되어 있다
      • 메뉴를 실행시키면 해당 메뉴의 함수를 호출하므로 각 메뉴의 번호는 고유해야한다

  • WinMain 수정
    • resource1.h를 include
    • WndClass.lpszMenuName = MAKEINTRESOURCE( 메뉴 ID ); 추가
  • 메뉴로 인해 발생하는 메시지는 WM_COMMAND로 들어온다
    • wParam: 메뉴 번호(resource.h에 정의된 값)
    • switch 문으로 메뉴 별 동작을 설정한다
  • 메뉴를 선택하면 메시지 박스가 뜨는 프로그램


    • 커서 그리기
      • 리소스에서 커서 추가
      • VS 아이템들을 이용해 커서를 그리고 저장

    728x90