10

チェックボックスまたはその他の VCL コンポーネントを TSaveDialog に追加したいと考えています。

カントゥ曰く、

新しい Vista の [開く] および [保存] ダイアログ ボックス (IFileOpenDialog および
IFileSaveDialog インターフェイスによって実装される) は、新しい FileOpenDialog および FileSaveDialog コンポーネントによって直接マップされます が、グローバルな UseLatestCommonDialogs が設定されている場合、
標準の OpenDialog および SaveDialog コンポーネントも新しいスタイルを使用します。

それが何を意味するのかわかりません(インターフェイスプログラミングをしたことがありません...)

また、サードパーティのツールを使用したくありません。

TOpenPictureDialog コードを見てコピーしたところ、Web 検索で提案されたのを見ました。

パスのいずれかを試す前に、ここでガイダンスを求めたいと思いました。XP から Win7 までのソリューションで、最新の [ファイル]、[開く] ダイアログ ボックスに 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 に答える