打开/保存文件对话框设置焦点到文件列表视图

Posted

技术标签:

【中文标题】打开/保存文件对话框设置焦点到文件列表视图【英文标题】:Open / save file dialog set focus to the file list view 【发布时间】:2011-07-29 01:55:00 【问题描述】:

是否可以打开 TOpenDialog、TSaveDialog 并将焦点设置为文件列表视图而不是文件名编辑框?

非常感谢

问候

【问题讨论】:

像往常一样回答这些问题:您有什么特别的原因想要更改 default 行为吗? 你可以通过 hack 来做到这一点。你最好使用 Cosmin 亲密的标准行为。 我现在正在编写的应用程序的 GUI 已经不寻常了,因为用户主要浏览文件(而不是通过输入文件名)我更喜欢这个功能。 然后破解对话框。向它发送消息以更改焦点。确保您处理好 XP 和 Vista/7 具有不同对话框的事实,这些对话框无疑需要不同的 hack。 您首先要自己调用GetOpenFileName Function,因此您可以使用自己的OFNHookProc Callback Function 设置lpfnHook 参数。不确定它是否会起作用,没有时间测试它(因此这是评论,而不是答案) 【参考方案1】:

您可以将焦点放在您喜欢的控件上,但是当您这样做时对话框应该准备好了。 'OnShow' 活动还为时过早。例如,您可以使用“OnFolderChange”事件和一个标志,以便在每次更改文件夹时不更改焦点:

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    procedure OpenDialog1FolderChange(Sender: TObject);
  private
    FDlgSetFocus: Boolean;

uses
  dlgs;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FDlgSetFocus := False;
  OpenDialog1.Execute;
end;

procedure TForm1.OpenDialog1FolderChange(Sender: TObject);
begin
  if not FDlgSetFocus then
    windows.SetFocus(GetDlgItem(GetParent((Sender as TOpenDialog).Handle), lst2));
  FDlgSetFocus := True;
end;

【讨论】:

+1;我刚开始写一个关于如何挂钩TFileOpenDialog.CreateFileDialog: IFileDialog 以便注册自己的IFileDialogEvents 以响应OnFolderChange 事件的小演示。我从来没有想过 VCL 本身会出现相同的事件!但很明显它会......而且 OnFolderChange 看起来正是这样做的地方(即:不是 inelegant),因为它在对话框显示在屏幕上之前被调用一次。 @Cosmin - 嘿!,我曾经对 OnCanClose 事件也有同样的看法。根据您的评估,我删除了最后一段,谢谢! 如果人们想要在 Vista/7 和 XP 上运行的代码,他们会怎么做?是否每个人都围绕这两个对话框编写自己的包装器并根据底层操作系统在它们之间切换? @David - VCL 可以做到这一点,所以在这种情况下不需要这样做。我在 2K 和 W7 中测试了上述内容,似乎工作正常。但我想这在某些情况下可能是必要的。 @Sertac 好的,我现在明白了,TFileDialogWrapper。我不熟悉它,因为我有自己的更通用的包装器(并且早于 VCL 包装器)。

以上是关于打开/保存文件对话框设置焦点到文件列表视图的主要内容,如果未能解决你的问题,请参考以下文章

C# OpenFileDialog和SaveFileDialog:打开文件与保存文件

VC对话框读取文件

文件对话框

怎么将sublime设置为打开指定文件格式的默认方式,而不是如图所示的这种出来对话框让自己再选择的方式?

MFC C++:如何将某个文件实际保存到系统中,而不仅仅是打开另存为对话框

Delphi 保存文件对话框(SaveDialog)和打开文件对话框(OpenDialog)