我更改了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;
我进行了一些搜索,找到了Microsoft提供的用于自定义标准WinAPI对话框的
IFileDialogCustomize
界面。
首先,IFileDialogCustomize
不“自定义标准WinAPI对话框”。它仅自定义IFileOpenDialog
和IFileSaveDialog
对话框,无其他对话框。
第二,TOpenDialog
主要使用旧版Win32 API TOpenDialog
函数。在Windows Vista +上,GetOpenFileName()
在内部使用GetOpenFileName()
并启用了基本选项,因此旧版应用程序仍然可以具有现代外观。
尽管,在以下情况下,GetOpenFileName()
将直接使用IFileOpenDialog
,而不是使用TOpenDialog
:
IFileOpenDialog
为> = 6(Vista +)GetOpenFileName()
为真Win32MajorVersion
为真UseLatestCommonDialogs
为零StyleServices.Enabled
,TOpenDialog.Template
和TOpenDialog.OnIncludeItem
未分配。但是即使如此,TOpenDialog.OnClose
在使用时仍然无法访问其内部TOpenDialog.OnShow
接口。
如果您确实要访问对话框的TOpenDialog
并因此访问它的IFileOpenDialog
,则需要使用IFileOpenDialog
而不是IFileDialogCustomize
(只要知道该对话框在XP和更早的系统上将无法使用,需要支持他们)。
对我来说,最大的问题是:如何通过
TFileOpenDialog
访问预览窗格图像?
你不知道。预览窗格不是对话框自定义项,因此无法通过TFileOpenDialog
访问。即使您可以获得预览窗格的控件ID(您不能),也没有TOpenDialog
功能允许您访问预览窗格的IFileDialogCustomize
或IFileDialogCustomize
,或者更改内容以任何方式显示预览窗格。对于支持预览的任何文件类型,预览窗格是IFileDialogCustomize
不可或缺的和private组件。您不能直接访问和使用它。当用户选择要显示(或缺少)预览的文件时,HWND
本身将根据需要更新预览窗格。
我的老板想显示我们自己的文件格式的预览。
正确在Vista +上处理该问题的方法是为您的自定义文件类型创建HDC
。然后,any想要显示文件预览(包括IFileDialog
)的Shell组件可以使用您的处理程序。