Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.036 c
4-1179910807
kolos_rus
2007-05-23 13:00
2007.12.09
Необходимо определить имя залогиневшегося юзера


15-1194591394
Gydvin
2007-11-09 09:56
2007.12.09
Траблы с сетевым сканером


2-1195123175
Новичок
2007-11-15 13:39
2007.12.09
Виборка записей по полю


2-1194938145
Layner
2007-11-13 10:15
2007.12.09
DBGrid, 8 знаков после запятой, как?


2-1195133837
unnamed
2007-11-15 16:37
2007.12.09
TIdUDPServer и TIdUDPClient: проблема!(не знаю как её обозвать)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский