自己实现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);
}
}
//---------------------------------------------------------------------------