https://msdn.microsoft.com/ko-kr/library/cc438644%28v=vs.71%29.aspx


CWnd::OnCommand 변경

사용 중인 응용 프로그램이 OnCommand를 재정의하는 경우 코드를 주의깊게 검토하고 수정하여 wParamlParam의 압축을 제대로 풀도록 해야 합니다. OnCommand를 16비트용으로 재정의하면 컴파일은 성공하더라도 제대로 실행되지는 않습니다.

프레임워크는 WM_COMMAND 메시지를 받으면 다음 인수와 함께 CWnd::OnCommand 멤버 함수를 호출합니다.

virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );

명령 ID, 컨트롤 핸들 및 알림 메시지는 호출 상황에 따라 wParamlParam으로 압축될 수 있습니다.

명령 ID는 두 가지 환경 모두에서 동일한 방법으로 압축되므로 명령 ID의 추출 방법을 바꿀 필요가 없습니다. 다음과 같은 방법으로 추출할 수 있습니다.

UINT nID = LOWORD(wParam);

16비트 프레임워크에서는 남은 두 값을 다음과 같은 방법으로 추출합니다.

HWND hWndCtrl = (HWND)LOWORD(lParam);    //Control handle
int nCode = HIWORD(lParam);              //Notification code

32비트 프레임워크에서는 다음과 같은 방법으로 추출합니다.

HWND hWndCtrl = (HWND)lParam;           //Control handle
int nCode = HIWORD(wParam);             //Notification code

16비트와 32비트 버전 모두에서 OnCommand 메시지가 액셀러레이터 키로부터 나올 경우 nCode에서 검색된 값은 1입니다. 메시지가 메뉴에서 나올 경우 nCode의 값은 0입니다.

CWnd::OnParentNotify 변경

OnCommand에 대해서는 OnParentNotify를 재정의하는 응용 프로그램의 모든 코드를 주의깊게 검토하고 수정하여 lParam 값의 압축을 제대로 풀도록 해야 합니다. OnParentNotify를 16비트용으로 재정의하면 컴파일은 성공하더라도 제대로 실행되지는 않습니다.

프레임워크는 다음 인수와 함께 CWnd::OnParentNotify 멤버 함수를 호출합니다.

afx_msg void OnParentNotify( UINT message, LPARAM lParam );

OnParentNotify 멤버 함수는 마우스를 자식 창 위에서 클릭하거나 자식 창을 만들거나 제거하는 두 경우에 자식 창의 부모를 위해 호출됩니다.

message 매개 변수가 WM_CREATEWM_DESTROY와 동등할 때 프레임워크에서 lParam을 16비트로 압축하면 자식 창 핸들은 하위 워드로, 자식 창의 식별자는 상위 워드로 지정됩니다. 32비트 프레임워크에서는 자식 창 핸들의 크기가 증가되어 lParam 전체를 차지하므로 자식 창 식별자는 사용할 수 없습니다.

OnParentNotify의 Win32 코드에서 자식 ID가 필요한 경우 다음과 같이 검색하십시오.

CWnd* pChild = FromHandle( (HWND)lParam );
int nID = pChild->GetDlgCtrlID();

이 예제에서 FromHandle은 자식 창 핸들에 연결된 CWnd 개체를 반환합니다. GetDlgCtrlID 멤버 함수는 자식 창 ID를 반환합니다. 또한, 자식 핸들을 직접 Windows GetDlgCtrlID 함수로 전달하여 자식 ID를 검색할 수도 있지만, 위의 코드로도 자식 CWnd 개체의 포인터를 검색할 수 있습니다.

pChild에서 반환된 포인터는 일시적이며 OnParentNotify의 범위 외부에서 사용하기 위해 저장해서는 안됩니다.

Posted by 곰돌이짱
,