【发布时间】:2020-06-10 11:06:05
【问题描述】:
我针对 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;
【问题讨论】:
-
您可能已经知道这一点,但要明确一点:此对话框是标准的 Win32 打开对话框,预览窗格是其中的一部分。例如,如果您在记事本中打开“打开”对话框并按 Alt+P,则会打开预览窗格。我根本没有玩过预览窗格(尽管我用其他方式玩过这些对话框,例如在底部添加自定义控件),但我最初的猜测是应用程序不应该控制预览窗格。系统只是预览它知道如何预览的文件。我认为您可以创建自定义的此类“处理程序”。
-
我认为没有任何 API 可以让您从对话框中获取预览图像。您可能要做的是调用 shell 扩展使用的 shell 接口来提供这些预览图像。 Raymond 称之为对界面的两侧进行编程。你想达到什么目的?提出这个问题的动机是什么?
-
@DavidHeffernan 我的老板想展示我们自己的文件格式的预览。
-
@AndreasRejbrand 是的!预览处理程序将是答案!感谢安德烈亚斯的指导!
-
“我的老板想显示我们自己的文件格式的预览。”是的,和我想的一样。在这种情况下,你不想做你在问题中概述的事情。
标签: delphi preview topendialog