2

我为 Delphi 10.3 进行了更改,其默认TOpenDialog包含一个预览窗格。我进行了一些搜索,发现了IFileDialogCustomize微软提供的自定义标准WinAPI对话框的界面。我知道我必须使用OnSelectionChange事件处理程序来修改窗格的图片。对我来说最大的问题是:如何访问预览窗格图像IFileDialogCustomize?这个 ItemID 是什么?我在网上找不到这个问题的任何答案。有人知道答案吗?然后请与我和社区分享!:)

为了简洁起见,我用 ... 替换了一些代码片段,因为这些是微不足道的或依赖于应用程序的部分。

procedure TMainWindow.OnSelectionChange( Sender : TObject );
var
  dc : HDC;
  aBMP : TBitmap;

  function isSelectedFilePreviewAble : boolean;
  begin
    result := ...;
  end;

  functon getPreviewPictureDC : HDC;
  var
    iCustomize : IFileDialogCustomize;
    h : THandle;
  begin
    if OpenDialog1.QueryInterface( IFileDialogCustomize, iCustomize ) = S_OK then
    begin
      h := iCustomize.??? this is the missing code fragment
      result := GetDC( h );
    end else
      result := 0;
  end;

  procedure generatePreviewPicture;  
  begin
    ...
  end;

begin
  dc := getPreviewPictureDC;
  if ( dc <> 0 ) then
  begin
    aBMP := TBitmap.Create;
    try
      if ( isSelectedFilePreviewAble ) then
        generatePreviewPicture;  
      StretchBlt( aBMP.Handle, ...);
    finally
      aBMP.Free;
      ReleaseDC( dc );
    end;    
  end;
end;
4

1 回答 1

3

我进行了一些搜索,发现了IFileDialogCustomize微软提供的自定义标准 WinAPI 对话框的界面。

首先,IFileDialogCustomize不“自定义标准 WinAPI 对话框”。它只自定义IFileOpenDialogIFileSaveDialog对话框,没有其他自定义。

其次,TOpenDialog主要使用遗留的Win32 APIGetOpenFileName()函数。在 Windows Vista+ 上,在启用基本选项的情况下在内部GetOpenFileName()使用IFileOpenDialog,以便旧版应用程序仍然可以具有现代外观。

虽然,在以下情况下,TOpenDialog将改为IFileOpenDialog直接使用而不是使用GetOpenFileName()

  • Win32MajorVersion>= 6 (Vista+)
  • UseLatestCommonDialogs是真的
  • StyleServices.Enabled是真的
  • TOpenDialog.Template是零
  • TOpenDialog.OnIncludeItem, TOpenDialog.OnClose, 和TOpenDialog.OnShow未赋值。

但即便如此,在使用它的时候,TOpenDialog仍然没有让你访问它的内部IFileOpenDialog接口。

如果您真的想访问对话框IFileOpenDialog并因此访问它IFileDialogCustomize,则需要使用,TFileOpenDialog而不是TOpenDialog(只要知道该对话框在 XP 和更早的系统上不起作用,如果您仍然需要支持它们)。

对我来说最大的问题是:如何访问预览窗格图像IFileDialogCustomize

你没有。预览窗格不是对话框自定义,因此无法通过IFileDialogCustomize. 即使您可以获得预览窗格的控件 ID(您不能),也没有任何功能IFileDialogCustomize可以让您访问预览窗格的HWNDor HDC,或以任何方式更改预览窗格的内容。对于任何支持预览的文件类型,预览窗格都是一个不可或缺的私有组件。IFileDialog它不是您可以直接访问和利用的东西。 IFileOpenDialog当用户选择具有(或缺少)要显示的预览的文件时,它本身将根据需要更新预览窗格。

我的老板想展示我们自己的文件格式的预览。

在 Vista+ 上处理该问题的正确方法是为您的自定义文件类型创建一个预览处理程序。然后,任何想要显示文件预览的 Shell 组件,包括IFileOpenDialog,都可以使用您的处理程序。

于 2020-06-10T19:08:08.080 回答