'API Reference'에 해당되는 글 75건

  1. 2007.10.17 WM_SIZE
  2. 2007.10.17 GetClientRect
  3. 2007.10.17 WM_CREATE, WM_DESTROY
  4. 2007.10.17 TimerProc
  5. 2007.10.17 SendMessage
  6. 2007.10.17 SetTimer, WM_TIMER, KillTimer
  7. 2007.10.17 CS_DBLCLKS, WM_LBUTTONDBLCLK
  8. 2007.10.17 Mouse
  9. 2007.10.17 TranslateMessage
  10. 2007.10.17 WM_KEYUP

WM_SIZE

API Reference 2007. 10. 17. 10:46

WM_SIZE 메시지는 윈도우의 크기가 변경될 때마다 발생한다.

lParam 의 하위 워드에는 변경된 후의 윈도우의 폭이, 상위 워드에는 높이가 전달되며

wParam 에는 이 메시지가 발생한 이유를 나타내는 플래그가 전달된다.


윈도우 크기가 바뀔 때마다 어떤 처리를 해야 한다면 항상 WM_SIZE 메시지를 받아 처리해야 한다.


SIZE_MAXHIDE

다른 윈도우가 최대화되어 이 윈도우가 가려졌다.


SIZE_MAXIMIZED

최대화되었다.


SIZE_MAXSHOW

다른 윈도우가 원래 크기로 복구되어 이 윈도우가 드러났다.


SIZE_MINIMIZED

최소화되었다.


SIZE_RESTORED

크기가 변경되었다.



최대화 시나 최소화 시에는 특별하게 다른 처리를 하고 싶을 때 wParam 을 참조한다.

Posted by 명혀니
,

GetClientRect

API Reference 2007. 10. 17. 10:46

BOOL GetClientRect( HWND hWnd, LPRECT lpRect );


작업영역의 좌표를 조사하는 함수



hWnd

대상 윈도우 핸들


lpRect

리턴값을 돌려받기 위한 RECT 구조체의 포인터



RECT 구조체에는 작업영역의 좌표가 들어가는데 left, top 은 원점이므로 항상 0 이며

right, bottom 에 우하단의 좌표가 대입된다.

Posted by 명혀니
,

WM_CREATE, WM_DESTROY

API Reference 2007. 10. 17. 10:45

WM_CREATE

윈도우 생성 중에 발생하는 메시지


WM_DESTROY

윈도우 파괴 중에 발생하는 메시지



두 메시지는 특정한 윈도우에 관련된 초기/종료 처리를 하는데 사용하는 것이 좋고,

WinMain 에서는 프로그램의 전역적인 초기/종료 처리를 하는 것이 좋다.

Posted by 명혀니
,

TimerProc

API Reference 2007. 10. 17. 10:45

VOID CALLBACK TimerProc( HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );


SetTimer 의 네 번째 인수는 TIMERPROC lpTimerFunc 이라고 되어 있는데 이 인수는 타이머 프로시저 함수의 포인터를 가리킨다. 이 인수가 NULL 로 되어 있을 경우 첫 번째 인수로 지정된 hWnd 로 WM_TIMER 메시지가 전달되지만 이 인수에 타이머 함수가 지정되었을 경우는 매 시간마다 이 함수가 대신 호출된다.



hWnd

타이머를 소유한 윈도우의 핸들


uMsg

WM_TIMER


idEvent

타이머 ID


dwTime

윈도우즈가 실행된 후의 경과시간

Posted by 명혀니
,

SendMessage

API Reference 2007. 10. 17. 10:44

LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );


메시지는 사용자의 동작이나 시스템의 상황 변화에 의해 발생하는 것이 원칙이지만 강제로 메시지가 발생한 것처럼 만들어야 할 때 이 함수를 사용한다.



hWnd

메시지를 보낼 윈도우 핸들


Msg

보낼 메시지


wParam, lParam

메시지의 추가 정보

WM_TIMER 메시지는 wParam 으로 타이머 ID 를 보내도록 되어 있으므로 세 번째 인수에 타이머 ID 를 지정하면 된다.



SendMessage 의 리턴값은 메시지 처리 함수가 리턴하는 값이며 메시지에 따라 해석 방법이 다르다.

Posted by 명혀니
,

UINT SetTimer( HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc );


타이머를 생성하는 함수



hWnd

타이머 메시지를 받을 윈도우인데 통상 설치하는 윈도우가 메시지를 받으므로 WndProc 으로 전달되는 hWnd 를 그대로 써주면 된다.


nIDEvent

타이머의 번호를 지정한다. WM_TIMER 메시지에서 타이머를 구분하기 위한 표식으로 사용된다.


uElapse

타이머의 주기를 설정하는데 단위는 1/1000 초이다.


lpTimerFunc

타이머 메시지가 발생할 때마다 호출될 함수를 지정하는데 사용하지 않을 경우 NULL 로 설정한다.



WM_TIMER 메시지는 wParam 으로 타이머 ID를 전달받으며 lParam 으로 타이머 메시지 발생시 호출될 함수의 번지가 전달된다.



BOOL KillTimer( HWND hWnd, UINT uIDEvent );


타이머를 제거하는 함수


타이머는 시스템 전역 자원이므로 더 이상 필요가 없어지면 파괴하는 것이 좋다.



hWnd

타이머를 소유한 윈도우 핸들


uIDEvent

파괴할 타이머 ID를 지정

Posted by 명혀니
,

더블클릭 메시지를 받고자 하면 윈도우 클래스의 스타일에 더블클릭 메시지를 원한다는 의사 표시를 해야 한다.


WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;


WndClass.style 멤버에 CS_DBLCLKS 플래그를 추가하면 이 윈도우는 더블클릭 메시지를 지원하게 된다.


비작업영역( NC : Non Client )에 발생하는 마우스 메시지들은 모두 작업영역 메시지의 이름에 NC( Non Client )가 덧붙여진다.


비작업영역 메시지는 시스템이 내부적인 용도로 사용하기 때문에 시스템 메시지를 받겠다면 처리한 후 반드시 DefWindowProc 으로 보내주어야 한다. 그렇지 않으면 표준 마우스 인터페이스가 동작하지 않는다.

Posted by 명혀니
,

Mouse

API Reference 2007. 10. 17. 10:43

마우스 입력에 관한 메시지


( 버튼 )    ( 누름 )                       ( 놓음 )                   ( 더블클릭 )

  좌측       WM_LBUTTONDOWN     WM_LBUTTONUP     WM_LBUTTONDBLCLK

  우측       WM_RBUTTONDOWN     WM_RBUTTONUP    WM_RBUTTONDBLCLK

  중앙       WM_MBUTTONDOWN    WM_MBUTTONUP    WM_MBUTTONDBLCLK



마우스 메시지는 lParam 의 상위 워드에 마우스 버튼이 눌러진 y 좌표, 하위 워드에 x 좌표를 가지며 좌표값을 검출해 내기 위해 HIWORD, LOWORD 등의 매크로 함수를 사용한다.

즉 마우스 메시지가 발생한 위치의 좌표는 ( LOWORD( lParam ), HIWORD( lParam ) )이 된다.


wParam 에는 마우스 버튼의 상태와 키보드 조합 키( Shift, Ctrl )의 상태가 전달된다.

조합키의 상태는 다음 값들과 비트 연산을 해보면 알 수 있다. 이 값을 참조하면 쉬프트 클릭, 좌우 동시 누름 등의 조건을 검출할 수 있다.


MK_CONTROL

Ctrl 키가 눌러져 있다.


MK_LBUTTON

마우스 왼쪽 버튼이 눌러져 있다.


MK_RBUTTON

마우스 오른쪽 버튼이 눌러져 있다.


MK_MBUTTON

마우스 중간 버튼이 눌러져 있다.


MK_SHIFT

Shift 키가 눌러져 있다.



마우스 버튼의 누름 메시지 외에 마우스가 이동할 때마다 전달되는 WM_MOUSEMOVE 메시지가 있다.

이 메시지도 다른 마우스 메시지와 마찬가지로 lParam 에 마우스 커서의 위치가 전달되며 wParam 에 조합키 상태가 전달된다.



개별 정보를 분리해내는 매크로


#define LOWORD( l )    ( ( WORD )( l ) )

#define HIWORD( l )     ( ( WORD )( ( ( DWORD )( l ) >> 16 ) & 0xFFFF ) )

#define LOBYTE( w )   ( ( BYTE )( w ) )

#define HIBYTE( w )    ( ( BYTE )( ( ( WORD )( w ) >> 8 ) & oxFF ) )


DWORD 로부터 상, 하위 워드 추출, WORD 로부터 상, 하위 바이트를 추출하는 매크로들인데 캐스트 연산자, 비트 AND, 쉬프트 연산자들의 조합으로 값을 추출한다.



#define MAKEWORD( a, b )    ( ( WORD )( ( ( BYTE )( a ) ) | ( ( WORD )( ( BYTE )( b ) ) ) << 8 ) )

#define MAKELONG( a, b )    ( ( LONG )( ( ( WORD )( a ) ) | ( ( DWORD )( ( WORD )( b ) ) ) << 16 ) )


MAKEWORD 는 두 개의 바이트로부터 16비트값을 만들고

MAKELONG 은 두 개의 16비트 값으로 32비트값을 만든다.

이 외에 MAKELONG 과 똑같이 정의된 MAKEWPARAM, MAKELPARAM 매크로가 정의되어 있는데 메시지를 직접 보내고자 할 때 파라미터 조립에 가끔 사용된다.

예를 들어 ( 123, 98 ) 좌표를 lParam 에 실어 보내려면 MAKELPARAM( 123, 98 ) 매크로를 사용한다.

Posted by 명혀니
,

TranslateMessage

API Reference 2007. 10. 17. 10:42

키보드에서 A 키를 눌렀다가 뗐다고 했을 때 발생하는 메시지는 순서대로

WM_KEYDOWN, WM_CHAR, WM_KEYUP 세 가지이다.

이 중 WM_CHAR 메시지는 사용자에 의해 발생하는 메시지가 아니다.


WM_CHAR 메시지는 WM_KEYDOWN 에 의해 추가로 발생하는 메시지이며 메시지 루프에서 인위적으로 생성된다.


TranslateMessage 함수는 전달된 메시지가 WM_KEYDOWN 인지와 눌러진 키가 문자키인지 검사해 보고 조건이 맞을 경우 WM_CHAR 메시지를 추가로 발생시킨다.


문자 입력이 아닐 경우는 아무일도 하지 않으며 이 메시지는 DispatchMessage 함수에 의해 WndProc 으로 보내진다.


메시지 루프의 TranslateMessage 함수는 오로지 키보드로부터 문자키 입력 메시지인 WM_CHAR 를 만들어내기 위해 존재한다

Posted by 명혀니
,

WM_KEYUP

API Reference 2007. 10. 17. 10:41

WM_KEYDOWN 의 반대 메시지는 WM_KEYUP 이며 키가 떨어질 때 발생한다.

wParam, lParam 의 의미는 WM_KEYDOWN 과 동일하다.

키보드는 주로 눌러질 때 입력된 것으로 간주하기 때문에 WM_KEYUP 메시지는 별로 잘 사용되지 않는다.

키가 떨어지는 것도 일종의 사건이므로 운영체제는 사소한 변화에 대해서도 메시지를 보내는데 이 메시지를 쓸 것인가 아닌가는 응용 프로그램이 필요에 따라 결정하면 된다.

Posted by 명혀니
,