如何在Delphi2010中向TSaveDialog添加复选框

如何在Delphi2010中向TSaveDialog添加复选框,delphi,delphi-2010,tcheckbox,tsavedialog,Delphi,Delphi 2010,Tcheckbox,Tsavedialog,我想在TSaveDialog中添加一个复选框或其他VCL组件 坎图说 新的Vista打开和保存对话框(由IFileOpenDialog和 IFileSaveDialog接口)由新的FileOpenDialog和 FileSaveDialog组件,但标准OpenDialog和SaveDialog组件也使用 设置全局UseLatestCommonDialogs时的新样式 我不知道这意味着什么(我从未做过任何接口编程…) 我不想使用第三方工具 我刚才在一次网络搜索中看到有人建议我查看TOpenPict

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

坎图说

新的Vista打开和保存对话框(由IFileOpenDialog和
IFileSaveDialog接口)由新的FileOpenDialog和
FileSaveDialog组件,但标准OpenDialog和SaveDialog组件也使用
设置全局UseLatestCommonDialogs时的新样式

我不知道这意味着什么(我从未做过任何接口编程…)

我不想使用第三方工具

我刚才在一次网络搜索中看到有人建议我查看TOpenPictureDialog代码并复制它

在尝试任何一条路径之前,我想我应该在这里寻求一些指导。对于XP到Win7解决方案,在现代文件中添加复选框,以独立于Windows版本的方式打开对话框,有什么建议吗


汤姆

罗伯特,你可以用一个对话框模板

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

检查一下这个样品

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

这是源代码

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;
这就是输出


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

做得很好,RRUZ。很好的答案,加上示例代码,并显示结果的屏幕截图。谢谢
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;