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