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
[18927] [재질문]:Re:[질문] 서브폼 최상위 윈도우 만들기 ... 두번째
하느리 [] 1139 읽음    2002-05-27 20:01
저도 처음에 SetWindowPos를 이용하여 처리하여 보려고 했는데, 이상한 것은 WINDOWPOSCHANGING 메세지 처리 함수 내에서 이 함수를 이용하면 시스템이 먹통이 되더군요(운영체제 : Windows Me). 지금의 방법으로 하여도 마찬가지이고요.

죄송한데, 테스트 해 보신 프로그램 소스를 좀 올려 주실 수 있으시겠어요 ? 제가 무엇이 잘못되어 그러는지 확인 좀 해 볼려구요.




유영인.Chris 님이 쓰신 글 :
: 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 1704 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.