1. 자식 윈도우를 만들기
1) 모든 윈도우는 윈도우 클래스로 부터 만든다.
2) 메시지 처리함수를 만들어야 한다.
3) WM_CREATE에서 자식윈도우를 생성해줘야 한다.
4) 처리하지 않은 메시지는 Defxxx 로 전달해줘야 한다.
4) UI 구축 : 눌린상태 라던가 올려져 있는 상태를 잘 표현 해야 한다.
5) 자식이 부모에게 사용자 정의 메시지를 보내면 WM_COMMAND( ID, 핸들, 통지코드 )를 읽어 처리가능
6) 부모는 자식에게 SendMessage 미리 정의된 메시지를 보내면 자식윈도우는 메시 지를 읽어 처리가능
7) 자식은 부모에게 WM_CTLCOLORBTN 을 보내 색상을 변경 할 수 있도록 한다. (HDC)wparam
2. DLL로 버튼 만들기
1) 클래스를 등록 한다. InitButton() <= 이것만 export 해준다.
2) 기본 프로시져 등록. BtnProc()
3) 프로시저에서 사용하는 함수 등록 Rect3d()
4) Dll을 import 해서 사용할 때는 InitButtonControl 로 윈도우클래스 등록한다.
5) 그 후, CreateWindowEx로 생성하면 된다.!!
1) 모든 윈도우는 윈도우 클래스로 부터 만든다.
2) 메시지 처리함수를 만들어야 한다.
3) WM_CREATE에서 자식윈도우를 생성해줘야 한다.
4) 처리하지 않은 메시지는 Defxxx 로 전달해줘야 한다.
4) UI 구축 : 눌린상태 라던가 올려져 있는 상태를 잘 표현 해야 한다.
5) 자식이 부모에게 사용자 정의 메시지를 보내면 WM_COMMAND( ID, 핸들, 통지코드 )를 읽어 처리가능
6) 부모는 자식에게 SendMessage 미리 정의된 메시지를 보내면 자식윈도우는 메시 지를 읽어 처리가능
7) 자식은 부모에게 WM_CTLCOLORBTN 을 보내 색상을 변경 할 수 있도록 한다. (HDC)wparam
2. DLL로 버튼 만들기
1) 클래스를 등록 한다. InitButton() <= 이것만 export 해준다.
2) 기본 프로시져 등록. BtnProc()
3) 프로시저에서 사용하는 함수 등록 Rect3d()
4) Dll을 import 해서 사용할 때는 InitButtonControl 로 윈도우클래스 등록한다.
5) 그 후, CreateWindowEx로 생성하면 된다.!!
3. 메뉴
1) 메뉴도 결국에는 윈도우이다. 여기서 발생하는 메세지는 WM_COMMAND에서 처리한다.
2) 메뉴에서 나오는 메시지도 자식윈도우가 부모에게 보내는 것 뿐이다.!!!
3) 그러므로 MENU도 윈도우로 따로 만들어서 다른 프로그램에 적용이 가능하다.
#32768 클래스 메뉴바??
#32770 DialogBox의 클래스 이름
4. 메시지 박스가 부모윈도우를 선택 하지 못하게 되는데 WM_TIMER가 메시지가 돌아가는 이유.
1) EnableWindow( hwnd, FALSE ); // 부모를 선택 하지 못하게 한다.
2) 메시지Q에서는 메시지를 계속 읽어오고 있으며 이를 DispatchMessage에서 자식윈도우인 메시지 박스로 메시지를 보내 주는 것 뿐이다.!!
1) 메뉴도 결국에는 윈도우이다. 여기서 발생하는 메세지는 WM_COMMAND에서 처리한다.
2) 메뉴에서 나오는 메시지도 자식윈도우가 부모에게 보내는 것 뿐이다.!!!
3) 그러므로 MENU도 윈도우로 따로 만들어서 다른 프로그램에 적용이 가능하다.
#32768 클래스 메뉴바??
#32770 DialogBox의 클래스 이름
4. 메시지 박스가 부모윈도우를 선택 하지 못하게 되는데 WM_TIMER가 메시지가 돌아가는 이유.
[ more.. | less.. ]
DialogBox()
{
EnableWindow( GetParent( hwnd ), FALSE );
// 실제 DialogBox( MessageBox )를 나타낸다.
HWND h = CreateWindowEx( 0, "#32770", ... );
// 그리고 메세지를 처리하기 위해서 자신만의 메세지 루프를 수행한다.
MSG msg;
while( GetMessage(&msg) )
{
if( msg.message == EndDialog 함수가 넣는 메세지 ) break;
DispatchMessage( &msg );
}
DestroyWindow( h );
EnableWindow( 부모, TRUE );
return EndDialog() 의 2번째 인자로 전달된 값.
}
MessageBox()
{
DialogBox(); // 다시 다이얼로그 박스를 호출...
}
DialogBox()
{
EnableWindow( GetParent( hwnd ), FALSE );
// 실제 DialogBox( MessageBox )를 나타낸다.
HWND h = CreateWindowEx( 0, "#32770", ... );
// 그리고 메세지를 처리하기 위해서 자신만의 메세지 루프를 수행한다.
MSG msg;
while( GetMessage(&msg) )
{
if( msg.message == EndDialog 함수가 넣는 메세지 ) break;
DispatchMessage( &msg );
}
DestroyWindow( h );
EnableWindow( 부모, TRUE );
return EndDialog() 의 2번째 인자로 전달된 값.
}
MessageBox()
{
DialogBox(); // 다시 다이얼로그 박스를 호출...
}
1) EnableWindow( hwnd, FALSE ); // 부모를 선택 하지 못하게 한다.
2) 메시지Q에서는 메시지를 계속 읽어오고 있으며 이를 DispatchMessage에서 자식윈도우인 메시지 박스로 메시지를 보내 주는 것 뿐이다.!!
5. TranslateMessage
1) 쓰레드가 1개라면 MSG Q 도 한개 존재하게 된다.
2) GetMessage는 이 메세지Q에서 message를 얻어오고 DispatchMessag로 분배한다.
3) TranslateMessage에서 모든 자식 윈도우에 가는 메시지를 얻을 수 있다. (PreTranslateMessage)
6. Locale Input State
1) 마우스 RIT 는 핸들을 보낸다. ( 핸들을 MessageQ에 넣을 떄 결정하게 된다. )
2) 키보드는 그 순간에 포커스를 가지고 있는 곳에 message가 들어간다.( 핸들이 MSGQ에 나갈때 결정)
7. SubSystem
1) 실행시간에 WndProc를 가로채서 중간에 지정한 작업을 수행하도록 한다. Filter역할(바꿔치기)
2) EditProc = (WNDPROC)SetWindowLong( hEdit, GWL_WNDPROC, (LONG)foo ); // 핵심
[ more.. | less.. ]
// DIspatchMessage의 대략적인 원리
void DispatchMessage( MSG* pMsg )
{
// WM_TIMER는 특별하게 처리한다. lParam에는 함수가 있다.
if( pMsg == WM_TIMER && lParam != 0 )
{
TIMEPROC f = (TIMEPROC)lParam;
f( .... );
}
// Dialog 관련 작업 수행..
// 이제.. pMsg의 HWND를 보고 메세지 처리함수의 주소를 얻어낸다.
WNDPROC f = (WNDPROC)GetWindowLong( pMsg->hwnd, GWL_WNDPROC );
// 메세지 처리 함수로 보낸다.
f( pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam );
}
// DIspatchMessage의 대략적인 원리
void DispatchMessage( MSG* pMsg )
{
// WM_TIMER는 특별하게 처리한다. lParam에는 함수가 있다.
if( pMsg == WM_TIMER && lParam != 0 )
{
TIMEPROC f = (TIMEPROC)lParam;
f( .... );
}
// Dialog 관련 작업 수행..
// 이제.. pMsg의 HWND를 보고 메세지 처리함수의 주소를 얻어낸다.
WNDPROC f = (WNDPROC)GetWindowLong( pMsg->hwnd, GWL_WNDPROC );
// 메세지 처리 함수로 보낸다.
f( pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam );
}
1) 쓰레드가 1개라면 MSG Q 도 한개 존재하게 된다.
2) GetMessage는 이 메세지Q에서 message를 얻어오고 DispatchMessag로 분배한다.
3) TranslateMessage에서 모든 자식 윈도우에 가는 메시지를 얻을 수 있다. (PreTranslateMessage)
6. Locale Input State
1) 마우스 RIT 는 핸들을 보낸다. ( 핸들을 MessageQ에 넣을 떄 결정하게 된다. )
2) 키보드는 그 순간에 포커스를 가지고 있는 곳에 message가 들어간다.( 핸들이 MSGQ에 나갈때 결정)
7. SubSystem
1) 실행시간에 WndProc를 가로채서 중간에 지정한 작업을 수행하도록 한다. Filter역할(바꿔치기)
2) EditProc = (WNDPROC)SetWindowLong( hEdit, GWL_WNDPROC, (LONG)foo ); // 핵심