我想在TSaveDialog中添加一个复选框或其他VCL组件。
坎图说,
新的Vista打开和保存对话框(由IFileOpenDialog和
实现 IFileSaveDialog接口)由新的FileOpenDialog和
直接映射 FileSaveDialog组件,也是标准的OpenDialog和SaveDialog组件使用
设置全局UseLatestCommonDialogs时的新样式。
我不知道这意味着什么(我从未做过任何接口编程......)
我不想使用第三方工具。
我刚刚在网络搜索中看到它建议我查看TOpenPictureDialog代码并将其复制。
在尝试任何路径之前,我想我会在这里寻求一些指导。有关XP到Win7解决方案的任何建议,以独立于Windows版本的方式向现代文件,打开对话框添加复选框吗?
汤姆
答案 0 :(得分:15)
首先,您必须将模板存储为应用程序中的资源,然后使用TOpenFilename
结构加载模板(不要担心名称,打开和保存对话框是相同的),最后调用GetSaveFileName
函数传递TOpenFilename
结构。
检查此示例
使用对话框模板创建资源文件(calledSaveDialog.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;
这是输出
答案 1 :(得分:9)
您可以使用模板执行此操作,但这会导致Vista / 7中的旧版对话框。在这些平台上,您应该使用IFileDialogCustomize。当然,为了支持XP,你也需要实现模板方法。