|
void __fastcall TForm2::SetFormOnTop (TMessage &msg)
이 함수 안에서..
LPWINDOWPOS lpwp = (LPWINDOWPOS) (msg.LParam);
lpwp->hwndInsertAfter = NULL; // 내 앞에는 아무도 없어 !
이것 대신에...
SetWindowPos(Form1->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
이걸 한번 넣어보시는것은 어떠세요..? Focus 를 가져간다는 단점이 있지만요.. 긁적..
그리고.. SetWindowPos를 하시면, Message가 다시 발생하므로, 중복발생을 막기 위해서.. 아래와 같이 메세지 처리를 무시하는 부분도 필요하겠죠.
void __fastcall TForm2::SetFormOnTop (TMessage &msg)
{
if(!Form2->ProcessMessaging) {
Form2->ProcessMessaging = true;
SetWindowPos(Form2->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
Form2->ProcessMessaging = false;
}
}
Application->OnMessage 으로 간단하게 처리해볼려고 애썼는데.. 시간만 뺏기구.. 왜 WM_WINDOWPOSCHANGING 이 메세지는 그 핸들러로 뜨지 않는지 모르겠네요.
ProcessMessaging 는 그냥 변수 입니다. 임의로 지정된것이고요, 귀찮으시면 Tag 프로퍼티를 이용하셔도 됩니다. 만약, Form1 도 함께 처리해 주실려면, SetWindowPos 에서 Form1의 메세지도 함께 발생시키니..
Form1->ProcessMessaging = true;
Form2->ProcessMessaging = true;
SetWindowPos(Form2->Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
Form1->ProcessMessaging = false;
Form2->ProcessMessaging = false;
이런식으로 막아 주셔야 합니다. 폼이 많아지면, Application에서 ComponentConut로 쭉 돌다가.. StayOnTop 으로 설정되어 있는 모든 폼을 처리해 주시면 되겠지요. (이 부분 소스가 필요하시면 따로 첨부하겠습니다)
어쨌든.. 저렇게 하시면 됩니다.. 잘 되는거 확인까지 했어요.. -_-a
하느리 님이 쓰신 글 :
: 유영인님이 가르쳐 주신 방법으로 처리해 보았으나, 정상적으로 최상위 윈도우가 되지를 않네요. 될 때가 있고, 않될 때가 있네요. 처리한 방법은 폼에 이벤트를 추가하여 처리하였습니다. 혹 제가 잘못 처리한 것인지 몰라 테스트했던 소스를 올립니다.
: void __fastcall TForm2::SetFormOnTop (TMessage &msg)
: {
: LPWINDOWPOS lpwp = (LPWINDOWPOS) (msg.LParam);
: lpwp->hwndInsertAfter = NULL; // 내 앞에는 아무도 없어 !
:
: }
: 여러가지를 테스트해 보았는데, 위에 있는 hwndInsertAfter 이외에는 별다른 효과가 없더군요. flags에 이것저것 설정을 해 보았는데, 소용 없었습니다. 위와 같이 설정한 상태에서 빌더상에서 디버깅모드로 실행을 해 보면, 빌더의 소스영역을 클릭하는 것으로부터는 최상위 윈도우가 유지가 되나, 소스윈도우의 타이틀바를 누르면 최상위윈도우에서 뒤로 밀려 나더군요.
:
:
: 한번 확인해 봐 주시겠습니까 ?
:
|