|
SetWindowPos(hdHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
이 명령은, 현재 다른 폼이 StayOnTop 상태이더라도, 그걸 덮어쓰고 앞으로 끌어냅니다. 항상 나중에 명령이 먹은 폼이 최상위 폼이 된다고 보시면 됩니다. (물론 알고 계시겠지만요.. -_-a)
현재 이것에 대하여 알려진 버그는 Flickering 현상이라고 있는데, 이 현상은 StayOnTop으로 설정을 해도, 나중에 어느순간에 뒤로 가버리는 버그 입니다. 폼을 어쨌든 최상위로 올려 두시려면, 메세지 처리를 하여 WM_WINDOWPOSCHANGING 메세지를 받아서 이 메세지가 발생되면 다시 올려주는 루틴을 만드시면, 결과적으로는 맨 위로 항상 올라오게 됩니다.
주의하실점은.. 만약 FormActive 같은 곳에 다른폼의 SetWindowPos 같은 처리를 넣어두셨다면.. 이상한 현상이 일어납니다. SetWindowPos는 해당폼에 Focus를 옮겨버리는 역할도 가지고 있기 때문에, OnActivate 이벤트가 발생되게 됩니다. 서로 호출하며 이상하게 돌아가는거죠..
하느리님이 어디에 놓으셨냐도 중요한 문제인것 같습니다.
하느리 님이 쓰신 글 :
: 빌더 5를 사용하고 있는데, 메인 폼인 경우에는 아무런 문제없이 최상위 윈도우가 되나 서브폼(메인폼을 제외한 프로젝트 내에 포함되어진 모든 폼)의 경우 최상위 윈도우 기능이 제대로 작동하지 않아, 혹 편법적인 방법이 있는지 알고 싶어 글을 올립니다.
: 1. 메인 폼의 경우
: FormStyle = fsStayOnTop;
: 이거 하나면 최상위 윈도우가 잘 됨.
:
: 2. 서브 폼의 경우
: 1) FormStyle = fsStayOnTop; // 최상위 윈도우 않됨. -__-
: 2) 폼 생성형태 변경 // 이것 역시 않됨. -___-;
: void __fastcall TForm2::CreateParams (TCreateParams& Params)
: {
: TForm::CreateParams(Params);
: Params.ExStyle |= WS_EX_TOPMOST;
: }
: 3) SetWindowPos (Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE); // 이것 역쉬 않됨. T____T;;;
:
: 빌더의 버그인지 답답하네요.
: 혹 편법적으로 변경가능한 방법이 있을까요 ?
:
|