C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[18876] Re:[질문] 서브폼 최상위 윈도우 만들기
유영인.Chris [cuperido] 2520 읽음    2002-05-25 15:16
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;;;
:
: 빌더의 버그인지 답답하네요.
: 혹 편법적으로 변경가능한 방법이 있을까요 ?
:

+ -

관련 글 리스트
18861 [질문] 서브폼 최상위 윈도우 만들기 하느리 1585 2002/05/24
18876     Re:[질문] 서브폼 최상위 윈도우 만들기 유영인.Chris 2520 2002/05/25
18880         Re:Re:[질문] 답변 감사합니다. 메세지 처리 루틴을 한번 만들어 봐야겠네요. (냉무) 하느리 1173 2002/05/25
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.