10

我想在 TSaveDialog 中添加一个复选框或其他 VCL 组件。

坎图说,

新的 Vista 打开和保存对话框(由 IFileOpenDialog 和
IFileSaveDialog 接口实现)由新的 FileOpenDialog 和
FileSaveDialog 组件直接映射,而且标准的 OpenDialog 和 SaveDialog 组件
在设置全局 UseLatestCommonDialogs 时使用新样式。

我不知道这意味着什么(我从来没有做过任何接口编程......)

而且我不想使用第三方工具。

刚才在网上搜索看到有提示,我看了一下TOpenPictureDialog的代码,复制一下。

在尝试任何路径之前,我想我会在这里寻求一些指导。关于通过 Win7 解决方案的 XP 以独立于 Windows 版本的方式将复选框添加到现代文件、打开对话框的任何建议?

汤姆

4

2 回答 2

15

罗伯特,你可以使用对话模板来做到这一点。

首先,您必须将模板作为资源存储在您的应用程序中,然后使用TOpenFilename结构加载模板(不用担心名称,打开和保存对话框相同),最后调用GetSaveFileName传递TOpenFilename结构的函数。

检查这个样本

使用对话框模板创建一个资源文件(称为SaveDialog.rc)(查看添加的MyCheckBox)

MYSAVEFILE DIALOG -1, 1, 300, 60
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "Tahoma"
{
CONTROL "MyCheckBox", 666, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12
}

这是源代码

Uses
 CommDlg;

var
  lpofn    : TOpenFilename;
  lpstrFile: Array[0..MAX_PATH-1] of Char;

{$R *.dfm}
{$R SaveDialog.Res}

function _lpfnHook(hdlg: HWND; uiMsg:UINT;wParam:WPARAM;lParam:LPARAM): UINT stdcall;
begin
  Result:=0;
  case uiMsg of
    // Set the initial state of mycheckbox to checked
    WM_INITDIALOG : CheckDlgButton(hdlg,666,BST_CHECKED);
    WM_COMMAND    :
                   case wParam of
                    666:
                         begin
                          if (IsDlgButtonChecked(hdlg,666)=BST_CHECKED) then
                           ShowMessage('MyCheckBox was checked')
                          else
                          if (IsDlgButtonChecked(hdlg,666)=BST_UNCHECKED) then
                            ShowMessage('MyCheckBox was unchecked');
                         end;
                   end;
  end;
end;

procedure TFrmMain.Button1Click(Sender: TObject);
begin
  ZeroMemory(@lpofn,sizeof(lpofn));
  lpofn.lStructSize       := SizeOf(lpofn);
  lpofn.hwndOwner         := Handle;
  lpofn.hInstance         := hInstance;
  //set the filter name
  lpofn.lpstrFilter       := 'All files (*.*)'#0'*.*'#0#0;
  lpofn.lpstrTitle        := 'Save As';
  lpofn.lpstrFile         := lpstrFile;
  lpofn.nMaxFile          := MAX_PATH;
  //Set the template Name
  lpofn.lpTemplateName    :='MYSAVEFILE';
  //set the callback function
  lpofn.lpfnHook          := _lpfnHook;
  lpofn.Flags             := OFN_EXPLORER or OFN_CREATEPROMPT or  OFN_HIDEREADONLY or
                             OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or OFN_ENABLETEMPLATE;
  //execute the dialog
  if GetSaveFileName(lpofn) then ShowMessage(lpofn.lpstrFile);
end;

这是输出

在此处输入图像描述

于 2011-05-07T04:10:04.910 回答
9

您可以使用模板执行此操作,但这会导致 Vista/7 中的旧对话框。在这些平台上,您应该使用IFileDialogCustomize。当然,要支持 XP,您还需要实现模板方法。

于 2011-05-07T06:41:05.397 回答