Robert, you can do that using a dialog template.
First you must store the template as a resource in your app, then load the template using the TOpenFilename
structure (don't worry by the name, is the same for open and save dialogs) and finally call the GetSaveFileName
function passing the TOpenFilename
structure.
check this sample
Create a resource file (calledSaveDialog.rc) with the dialog template (look the MyCheckBox added)
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
}
this is the source code
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;
and this is the output