장성호 님이 쓰신 글 :
: [서론]
: 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, 정도 떨어 지게 위치할려면 어떻게 해야되나요..
: :
: : 알려주세요ㅠㅠ