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
[50663] Re:다이얼로그 대화창위치를 마음대로 정하고 싶은데.. 어떻게 해야되요
장성호 [nasilso] 2223 읽음    2007-09-28 12:36
[서론]
TOpenDialog를 비롯하여 공통Dialog(TCommonDialog)들은
모두  comdlg32.dll 에 있는 API를 호출하여 Dialog를 만듭니다.
TOpenDialog의 경우도 Execute 할때 comdlg32.dll의 GetOpenFileNameA 같은 api를 호출하여
Dialog를 열죠
다시 말해 Execute를 호출 하기전에는 TOpenDialog의 Handle이 없습니다.
즉 window의  Handle이 없다는것은 size조정 및 아무것도 할수 없겠죠
(TOpenDialog에서 지원하지 않는이상)


그래서 결론적으로 방법은?

Execute()를 호출한후에 TOpenDialog의 핸들을 가져와야 합니다.
여러가지 방법이 있겠지만 간단히 FindWindow로 할수 있겟죠
FindWindow로 TOpenDialog의 Handle을 찾았으면 SetWindowPos로 size및 위치를 조정하면 되겟죠

여기서 문제가 있습니다.
Execute()를 함수가 끝난후에는 이미 TOpenDialog도 닫혀진후라는것입니다.
그러므로 Execute()호출한 직후에 핸들을 찾아 SetWindowPos해야 하는것입니다.


[방법1]

TOpenDialog 의 OnShow이벤트에서 PostMessage를 날려서 메세지를 받는데서 SetWindowPos 한다.

void __fastcall TForm1::OpenDialogShowAfter(TMessage &Msg)
{
    HWND  hWnd;
    hWnd = FindWindow(NULL, "열기");
   ::SetWindowPos( hWnd, HWND_TOPMOST, 0,0, 656,390, SWP_SHOWWINDOW );
}
void __fastcall TForm1::OpenDialog1Show(TObject *Sender)
{
    PostMessage(Handle,WM_USER+1,0,0);
}

그런데 방법1은 문제점이 하나 있습니다.
문제점은 일단 Dialog가 떴다가 위치를 옮깁니다.


[방법2]

쓰레드로 한다.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    class TCenterDialog : TThread
    {
        int X,Y;
    public:
        __fastcall TCenterDialog(int x,int y) : TThread(false) { X=x;Y=y;}
        void __fastcall Execute()
        {
            FreeOnTerminate = true;
            HWND  hWnd;
            while((hWnd = FindWindow(NULL, "열기")) == NULL)
                Sleep(40);

            ::SetWindowPos( hWnd, HWND_TOPMOST, X,Y, X+656,Y+390, SWP_SHOWWINDOW );
        }
    };
    TCenterDialog*  pTemp = new TCenterDialog(50,10); pTemp;
    OpenDialog1->Execute();

}
//---------------------------------------------------------------------------

쓰레드에 관해서는 아래 참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=670

그럼...


구윤태 님이 쓰신 글 :
: 대화창이 중앙말고.
:
: 상당에서 100, 정도 떨어 지게 위치할려면 어떻게 해야되나요..
:
: 알려주세요ㅠㅠ

+ -

관련 글 리스트
50661 다이얼로그 대화창위치를 마음대로 정하고 싶은데.. 어떻게 해야되요 구윤태 3012 2007/09/28
50663     Re:다이얼로그 대화창위치를 마음대로 정하고 싶은데.. 어떻게 해야되요 장성호 2223 2007/09/28
50665         답변주셔서 고맙습니다. 구윤태 1218 2007/09/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.