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
[18926] Re:[질문] 서브폼 최상위 윈도우 만들기 ... 두번째
유영인.Chris [cuperido] 1703 읽음    2002-05-27 19:30
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에 이것저것 설정을 해 보았는데, 소용 없었습니다. 위와 같이 설정한 상태에서 빌더상에서 디버깅모드로 실행을 해 보면, 빌더의 소스영역을 클릭하는 것으로부터는 최상위 윈도우가 유지가 되나, 소스윈도우의 타이틀바를 누르면 최상위윈도우에서 뒤로 밀려 나더군요.
:
:
: 한번 확인해 봐 주시겠습니까 ?
:

+ -

관련 글 리스트
18903 [질문] 서브폼 최상위 윈도우 만들기 ... 두번째 하느리 1056 2002/05/27
18926     Re:[질문] 서브폼 최상위 윈도우 만들기 ... 두번째 유영인.Chris 1703 2002/05/27
18927         [재질문]:Re:[질문] 서브폼 최상위 윈도우 만들기 ... 두번째 하느리 1139 2002/05/27
18943             Re:[재질문]:Re:[질문] 서브폼 최상위 윈도우 만들기 ... 두번째 유영인.Chris 1446 2002/05/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.