首页  编辑  

自己实现Win2000 OpenDialog的PlaceBar功能?

Tags: /超级猛料/VCL/Common.Dialog.通用对话框和控件/   Date Created:

自己实现Win2000 OpenDialog的PlaceBar功能?

BCB_FANS:

TMD ,那些老外就喜欢采用一些歪门邪道的技术。不知道你有没有这样的印象,如果你在那个文件名编辑框中输入一个目录名,然后按确定按钮,那个对话框并没有被关闭,而是切换到那个新的目录。那个Folder Cache就是这样工作的,只是它把这些步骤用程序自动化执行了,具体步骤如下:

1、首先保存那个文件名编辑框的值

2、在那个编辑框中设置新的目录名

3、模拟鼠标单击"确定"按钮,这时候对话框切换到新的目录

4、恢复原来编辑框的值

----------------------------------

下面是我的C++Builder代码,只贴出关键部分,其它免了。

TButton *Btn;

TPanel* Panel;

HWND hFileNameWnd;

HWND hOkButtonWnd;

//DoShow

void __fastcall TMyOpenDialog::DoShow(void)

{

 TRect PreviewRect, StaticRect;

 //在对话框中添加一个按钮

 GetClientRect ( this->Handle, (RECT*)&PreviewRect );

 StaticRect = this->GetStaticRect();

 PreviewRect.Left = StaticRect.Left + (StaticRect.Right - StaticRect.Left);

 Panel = new TPanel(this);

 Panel->BoundsRect = PreviewRect;

 Btn = new TButton(this);

 Btn->Parent = Panel;

 Btn->OnClick = ButtonClick;//设置按钮事件句柄

 Panel->ParentWindow  = this->Handle;

 //得到"文件名"编辑控件和"确定"按钮的句柄

 hFileNameWnd = GetDlgItem(GetParent(this->Handle),0x480);

 hOkButtonWnd = GetDlgItem(GetParent(this->Handle),1);

}

//---------------------------------------------------------------------------

//ButtonClick

void __fastcall TMyOpenDialog::ButtonClick(TObject *Sender)

{

 if(hFileNameWnd != NULL)

 {

   char PrevBuf[64];

   //先保存原来的值

   GetWindowText(hFileNameWnd,PrevBuf,sizeof(PrevBuf));

   ///设置新的文件夹

   AnsiString NewPath;

   NewPath = "f:\\inprise";

   SetWindowText(hFileNameWnd,NewPath.c_str());

   //模拟鼠标单击"确定"按钮

   SendMessage(hOkButtonWnd,WM_LBUTTONDOWN,(WPARAM)MK_LBUTTON,(LPARAM)MAKEWORD(0,0));

   SendMessage(hOkButtonWnd,WM_LBUTTONUP,(WPARAM)MK_LBUTTON,(LPARAM)MAKEWORD(0,0));

   //恢复原来的值

   SetWindowText(hFileNameWnd,PrevBuf);

   //因为鼠标在"确定"上单击,所以它得到焦点,必须取消掉,否则会留下痕迹。

   //那个Folder Cache有Bug,它没有执行这一步,所以"确定"按钮仍然具有焦点,

   //从另一方面来说,这倒成为我的推断的证据^_^

   ::SetFocus(Btn->Handle);

 }

}

//---------------------------------------------------------------------------