在Delphi 10.3中带有预览的文件打开对话框

问题描述 投票:1回答:1

我更改了Delphi 10.3,其默认TOpenDialog包含一个预览窗格。我进行了一些搜索,找到了Microsoft提供的用于自定义标准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;
delphi preview topendialog
1个回答
2
投票

我进行了一些搜索,找到了Microsoft提供的用于自定义标准WinAPI对话框的IFileDialogCustomize界面。

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

第二,TOpenDialog主要使用旧版Win32 API TOpenDialog函数。在Windows Vista +上,GetOpenFileName()在内部使用GetOpenFileName()并启用了基本选项,因此旧版应用程序仍然可以具有现代外观。

尽管,在以下情况下,GetOpenFileName()将直接使用IFileOpenDialog,而不是使用TOpenDialog

  • IFileOpenDialog为> = 6(Vista +)
  • GetOpenFileName()为真
  • Win32MajorVersion为真
  • UseLatestCommonDialogs为零
  • [StyleServices.EnabledTOpenDialog.TemplateTOpenDialog.OnIncludeItem未分配。

但是即使如此,TOpenDialog.OnClose在使用时仍然无法访问其内部TOpenDialog.OnShow接口。

如果您确实要访问对话框的TOpenDialog并因此访问它的IFileOpenDialog,则需要使用IFileOpenDialog而不是IFileDialogCustomize(只要知道该对话框在XP和更早的系统上将无法使用,需要支持他们)。

对我来说,最大的问题是:如何通过TFileOpenDialog访问预览窗格图像?

你不知道。预览窗格不是对话框自定义项,因此无法通过TFileOpenDialog访问。即使您可以获得预览窗格的控件ID(您不能),也没有TOpenDialog功能允许您访问预览窗格的IFileDialogCustomizeIFileDialogCustomize,或者更改内容以任何方式显示预览窗格。对于支持预览的任何文件类型,预览窗格是IFileDialogCustomize不可或缺的和private组件。您不能直接访问和使用它。当用户选择要显示(或缺少)预览的文件时,HWND本身将根据需要更新预览窗格。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.