Форум: "WinAPI";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
ВнизДобавить свою кнопку в SaveDialog Найти похожие ветки
← →
Igor_thief (2007-05-18 14:28) [0]Хочу добавить в SaveDialog свою кнопку (типа кнопки Options при нажатии на котрую выводится диалог настройки сжатия формата JPEG). Как это можно сделать? Естественно размер SaveDialog должен измениться.
Написал код, но он не совсем корректный:
var
Form1: TForm1;
btJPEGOptions: TButton;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog.Execute(Handle)
end;
procedure TForm1.SaveDialogClose(Sender: TObject);
begin
FreeAndNil(btJPEGOptions);
end;
procedure TForm1.BtnWndProc(var Message: TMessage);
begin
if btJPEGOptions <> nil then
begin
case Message.Msg of
WM_LBUTTONUP:
ShowMessage("click");
end;
btJPEGOptions.DefaultHandler(Message);
end;
end;
procedure TForm1.SaveDialogShow(Sender: TObject);
var
h: HWND;
aRect: TRect;
begin
btJPEGOptions := TButton.Create(nil);
h := GetParent(SaveDialog.Handle);
btJPEGOptions.ParentWindow := h;
Windows.GetClientRect(h, aRect);
// -------------------------------------------------------------------------------------------------
btJPEGOptions.Left := aRect.Right - 81;
btJPEGOptions.Top := aRect.Bottom - 5;
btJPEGOptions.WindowProc := BtnWndProc;
// -------------------------------------------------------------------------------------------------
aRect.Bottom := aRect.Bottom + 70;
aRect.Right := aRect.Right + 10;
SetWindowPos(h, HWND_TOP, aRect.Left, aRect.Top, aRect.Right, aRect.Bottom, SWP_SHOWWINDOW);
btJPEGOptions.Caption := "Options";
end;
Почему-то если код который меняет позицию кнопки поставить послеbtJPEGOptions.WindowProc := BtnWndProc;
, то позиция кнопки не меняется. Почему?
← →
clickmaker © (2007-05-18 14:35) [1]я бы посмотрел в сторону исходников стандартного SavePictureDialog (где preview). По аналогии бы написал наследника с кнопкой
← →
Igor_thief (2007-05-18 14:41) [2]Хотелось бы не переопределять диалог. Если переопределять диалог, то тогда моей кнопке легко можно присвоить обработчик
OnClick
, но мы не ищем легких путей :)
Я пробовал поднять эту тему тут (http://forum.vingrad.ru/forum/topic-149970/anchor-entry1125019/0.html) , но пока что тоже безуспешно
← →
имя (2007-05-18 15:01) [3]Удалено модератором
Примечание: спам
← →
имя (2007-05-18 15:20) [4]Удалено модератором
Примечание: спам
← →
clickmaker © (2007-05-18 15:23) [5]
> мы не ищем легких путей
похоже, в [3] и [4] поняли это буквально )
← →
имя (2007-05-18 15:30) [6]Удалено модератором
Примечание: спам
← →
Igor_thief (2007-05-18 15:30) [7]Спамеры :)
← →
имя (2007-05-18 17:53) [8]Удалено модератором
Примечание: спам
← →
Rouse_ © (2007-05-19 12:21) [9]ДАк это делается на уровне ресурсного файла...
Стандартная возможность. Смотри пример:
ресурс примерно такой:OFT DIALOG -1, 1, 304, 62
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
CONTROL "Select Options", 100, "button", BS_GROUPBOX | WS_CHILD | WS_VISIBLE | WS_GROUP, 69, 4, 224, 52
CONTROL "CheckBox1", 101, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 19, 60, 12
CONTROL "CheckBox2", 102, "button", BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 84, 38, 60, 12
}
Сам код:uses
commdlg;
{$R *.dfm}
{$R MYRES.RES} // файл ресурсов с шаблоном
var
ofn:TOpenFileName;
f:array[0..MAX_PATH-1] of Char;
// hook-процедура
function Fh(Wnd: HWND; Msg:cardinal; wParam,lParam: Integer): UINT stdcall;
begin
result:=0;
case Msg of
WM_INITDIALOG:
begin
CheckDlgButton(Wnd,101,BST_CHECKED); // отметим первый чекбокс
end;
WM_COMMAND: // реакция на изменение состояния чекбоксов
case LOWORD(wParam) of
101:
begin
if (IsDlgButtonChecked(Wnd,101)=BST_CHECKED) then MessageBox(Wnd,"CheckBox1 Checked!","FileOpenDialog",0);
end;
102:
begin
if (IsDlgButtonChecked(Wnd,102)=BST_CHECKED) then MessageBox(Wnd,"CheckBox2 Checked!","FileOpenDialog",0);
end;
end;
WM_NOTIFY:
case
POFNotify(lParam)^.hdr.code of
CDN_FILEOK: // реакция на выбор файла
begin
if (IsDlgButtonChecked(Wnd,101)=BST_CHECKED) then
MessageBox(Wnd,PChar("CheckBox1 Checked and "+ofn.lpstrFile+" selected"),"FileOpenDialog",0);
if (IsDlgButtonChecked(Wnd,102)=BST_CHECKED) then
MessageBox(Wnd,PChar("CheckBox2 Checked and "+ofn.lpstrFile+" selected"),"FileOpenDialog",0);
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FillChar(f,sizeof(f),0);
FillChar(ofn,sizeof(ofn),0);
ofn.lStructSize := sizeof(TOpenFileName);
ofn.hwndOwner := Handle;
ofn.hInstance := hInstance;
ofn.lpstrFilter := "Text Files (*.TXT)"#0"*.txt"#0+
"Executables (*.EXE)"#0"*.exe"#0+
"All files (*.*)"#0"*.*"#0#0;
ofn.lpstrTitle := "Select File";
ofn.lpstrFile := f;
ofn.nMaxFile := MAX_PATH;
ofn.lpTemplateName :="OFT"; // имя шаблона
ofn.lpfnHook := Fh; // hook-процедура
ofn.Flags := OFN_EXPLORER or OFN_CREATEPROMPT or
OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or
OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or
OFN_ENABLETEMPLATE;
// показываем диалог
if GetOpenFileName(ofn) then ShowMessage(ofn.lpstrFile);
end;
← →
Igor_thief (2007-05-19 20:47) [10]Спасибо! Метод конечно не очень простой :( Хотелось бы достить желаемого способом похожим на тот что я описал. Ладно, буду искать такой. Я немного продвинулся в нем, но появились новые проблемы :( Якоря у кноки не работают :((( И я уже понимаю почему. Все дело в том, что я не могу сделать SaveDialog parenotom моей кнопки.
TButtonReloaded = Class(TButton)
protected
Procedure WndProc(Var Msg: TMessage); Override;
End;
var
DM: TDM;
bJPEGOptions: TButtonReloaded;
implementation
uses
Windows, ExtCtrls;
{$R *.dfm}
procedure TDM.SaveDialogClose(Sender: TObject);
begin
if Assigned(DM.FJPEGOptions) then
FreeAndNil(FJPEGOptions);
FreeAndNil(bJPEGOptions);
end;
procedure TDM.SaveDialogShow(Sender: TObject);
var
h: HWND;
aRect: TRect;
begin
bJPEGOptions := TButtonReloaded.Create(nil);
h := GetParent(SaveDialog.Handle);
Windows.GetClientRect(h, aRect);
bJPEGOptions.ParentWindow := h;
aRect.Bottom := aRect.Bottom + 70;
aRect.Right := aRect.Right + 10;
bJPEGOptions.Caption := "Options";
bJPEGOptions.Left := aRect.Right - 91;
bJPEGOptions.Top := aRect.Bottom - 75;
bJPEGOptions.Anchors := [akRight, akBottom, akTop];
SetWindowPos(h, HWND_TOP, aRect.Left, aRect.Top, aRect.Right, aRect.Bottom, SWP_SHOWWINDOW);
end;
{ TButtonReloaded }
procedure TButtonReloaded.WndProc(var Msg: TMessage);
begin
if bJPEGOptions <> nil then
begin
case Msg.Msg of
WM_LBUTTONUP:
begin
Caption := "Hello";
end; // WM_
end; // case
end; // if
inherited WndProc(Msg);
end;
ПС: а можно подробнее с ресурсом? Это надо сделать файл rc и потом конвертнуть в RES?
В любом случае спасибо.
← →
имя (2007-05-19 22:58) [11]Удалено модератором
← →
Rouse_ © (2007-05-20 14:25) [12]
> ПС: а можно подробнее с ресурсом? Это надо сделать файл
> rc и потом конвертнуть в RES?
А поподробнее завтра если будет время покажу, сегодня выходной и не охота Дельфи запускать :)
← →
Igor_thief (2007-05-20 20:10) [13]
> А поподробнее завтра если будет время покажу, сегодня выходной
> и не охота Дельфи запускать :)
>
Спасибо большое! Очень жду! Я завтра снова попытаюсь разобраться с твоим примером.
← →
Rouse_ © (2007-05-20 21:36) [14]Значт вот тебе четко под тебя демка:
Вот тебе ресурс:ADV_SAVE_DLG DIALOG 0, 0, 500, 20
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS
CAPTION ""
FONT 8, "MS Sans Serif"
{
CONTROL "My button", 100, "BUTTON", WS_CHILD | WS_VISIBLE, 316, 0, 50, 15
}
Сохраняешь его в файл AdancedSaveDialogResource.rc и этот файл подключаешь к проекту через Shift+F11 (не забудь указать в диалоге что тебе RC файл нужен).
После чего следующий код сохраняй в отдельный файл и используй данный юнит через ShowAdvSaveDialog().unit AdancedSaveDialog;
interface
uses
Windows,
Messages,
CommDlg;
function ShowAdvSaveDialog(RootDir: String): String;
implementation
function AdvSaveDialog_lpfnHook(Wnd: HWND; Msg: UINT;
wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
begin
Result := NO_ERROR;
case Msg of
WM_COMMAND:
case LOWORD(wParam) of
100:
begin
MessageBox(Wnd, "Моя нажалася", "Кнопка", MB_OK);
end;
end;
end;
end;
function ShowAdvSaveDialog(RootDir: String): String;
var
SaveFilename: TOpenFilename;
begin
Result := StringOfChar(#0, MAX_PATH);
FillChar(SaveFilename, SizeOf(TOpenFilename), 0);
SaveFilename.lStructSize := SizeOf(TOpenFileName);
SaveFilename.hInstance := hInstance;
SaveFilename.lpstrFilter :=
"JPEG (*.JPG;*.JPEG;*.JPE;*.JFIF)"#0"*.JPG;*.JPEG;*.JPE;*.JFIF"#0+
"All files (*.*)"#0"*.*"#0#0;
SaveFilename.lpstrTitle := "Select File";
SaveFilename.lpstrFile := @Result[1];
SaveFilename.nMaxFile := MAX_PATH;
SaveFilename.lpTemplateName :="ADV_SAVE_DLG";
SaveFilename.lpfnHook := AdvSaveDialog_lpfnHook;
SaveFilename.Flags := OFN_EXPLORER or OFN_CREATEPROMPT or
OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or
OFN_PATHMUSTEXIST or OFN_ENABLEHOOK or
OFN_ENABLETEMPLATE;
GetSaveFileName(SaveFilename);
Result := PChar(Result);
end;
end.
← →
имя (2007-05-21 18:59) [15]Удалено модератором
← →
имя (2007-05-22 00:17) [16]Удалено модератором
Примечание: спам
← →
Igor_thief (2007-05-22 14:53) [17]Rouse_ © (20.05.07 21:36) [14] СПАСИБО! Низкий тебе поклон! Очень помог. Теперь осталось полностью разобраться с кодом и к бою!
Ксати, нашел вот статью но для С++ http://bcbjournal.org/articles/vol3/9912/Extending_the_common_dialogs.htm?PHPSESSID=9fbf62b23ad0ac712610faa0a0e865bb
Правда мне почему-то кажется что она немного устарела, но все равно прочитаю и разберусь.
Еще раз спасибо, если у меня будут вопросы, то я напишу в эту же ветку.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.12.09;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c