Конференция "KOL" » Шаблон для создания утилит «сидящих в трее» [Delphi]
 
  • Ruzzz (01.08.09 04:13) [0]
    Вот попробовал сделать или здесь http://dumpz.org/11101/ или ниже:

    program PlasticNote;

    {$R 'main.res' 'main.rc'}

    uses
     Windows,
     Messages,
     Kol;

    type
     PProgramm = ^TProgramm;
     TProgramm = object(TObj)
     private
       Form,
       Memo: PControl;
       Tray: PTrayIcon;
       MenuTray: PMenu;

       //flagFormClose: Boolean; // Флаг указывает что форма закрывается :)

       procedure IniFileSaveLoad(Save: Boolean);

       procedure FormShowHide(Show: Boolean);
       procedure DoTrayMouse(Sender: PObj; Message: Word);
       procedure DoMenuTrayMenuItem(Sender: PMenu; Item: Integer);
       procedure DoFormClose(Sender: PObj; var Accept: Boolean);
       function  DoFormMessage(var Msg: TMsg; var Rslt: Integer): Boolean;
    end;

    var
     Programm: PProgramm;

     // Settings
     optCloseToHide: Boolean = False;
     optMinToHide: Boolean = False;
     optStartHide: Boolean = False;

    { TProgramm }

    procedure TProgramm.DoFormClose(Sender: PObj; var Accept: Boolean);
    begin
     //flagFormClose := True;
     IniFileSaveLoad(True);
     //DeleteCriticalSection...
    end;

    function TProgramm.DoFormMessage(var Msg: TMsg;
     var Rslt: Integer): Boolean;
    begin
     Result := False;
     if Msg.message = WM_SYSCOMMAND then
       case Msg.wParam of
         SC_MINIMIZE:
           if optMinToHide then begin
             FormShowHide(False);
             Result := True;
           end;
         SC_CLOSE:
           if optCloseToHide then begin
             FormShowHide(False);
             Result := True;
           end
       end;
    end;

    procedure TProgramm.DoMenuTrayMenuItem(Sender: PMenu; Item: Integer);
    begin
     // Не забыть указать правильные "номера" пунктов меню
     case Item of
       0: FormShowHide(not Programm.Form.Visible);
       2: Programm.Form.Close; // Посылаем WM_CLOSE
     end;
    end;

    procedure TProgramm.DoTrayMouse(Sender: PObj; Message: Word);
    var
     p: TPoint;
    begin
     case Message of
       WM_RBUTTONUP: begin
         SetForegroundWindow(Programm.Form.Handle); // TODO Лучше получать handle родителя меню!?
                                                    // Эта строка также помогает с багом, когда меню не закрывается само собой если мы кликаем вне его
         GetCursorPos(p);
         MenuTray.PopUp(p.x, p.y);
       end;
       WM_LBUTTONDBLCLK: FormShowHide(not Programm.Form.Visible); // Двойной клик у нас работает как Show/Hide
     end;
    end;

    procedure TProgramm.FormShowHide(Show: Boolean);
    var
     s: String;
    begin
     Programm.Form.Visible := Show; //not Programm.Form.Visible; //ApletRestore/Hide
     if Programm.Form.Visible then begin
       // Если мы в прошлый раз скрыли минимизированную форму, то она такая же и
       // появится, поэтому мы принудительно ее восстанавливаем
       ShowWindow(Programm.Form.Handle, SW_RESTORE); // SW_SHOWNOACTIVATE
       SetForegroundWindow(Programm.Form.Handle);
       s := 'Hide';
     end else
       s := 'Show';
     Programm.MenuTray.ItemText[0] := s; // Не заюываем указать правильный "номер" меню
    end;

    procedure TProgramm.IniFileSaveLoad(Save: Boolean);
    var
     IniFile: PIniFile;
    begin
     IniFile := OpenIniFile(GetStartDir + 'settings.ini');
     try
       if Save then IniFile.Mode := ifmWrite;
       IniFile.Section := 'Main';
       optMinToHide := IniFile.ValueBoolean('MinToHide', optMinToHide);
       optCloseToHide := IniFile.ValueBoolean('CloseToHide', optCloseToHide);
       optStartHide := IniFile.ValueBoolean('StartHide', optStartHide);
       // ...
     finally
       IniFile.Free;
     end;
    end;

    begin
     New(Programm, Create);
     with Programm^ do begin      
       //flagFormClose := False;
       IniFileSaveLoad(False);

       Form := NewForm(nil, 'Programm');
       Form.Add2AutoFree(Programm);
       Form.OnMessage := DoFormMessage;
       Form.OnClose := DoFormClose;
       Form.IconLoad(hInstance, 'MAINICO');
       Form.SetClientSize(439, 275);
       Form.Border := 0;
       Form.CenterOnParent;
       Form.CanResize := False;
       Form.Style := Form.Style and not WS_MAXIMIZEBOX;
       Form.Font.FontHeight := 13;
       Form.Font.FontName := 'Tahoma';
       NewMenu(Form, 0, [], nil); // Создаем "пустое" главное меню, чтобы главным не стало MenuTray? :)
       //Form.Perform(WM_INITMENU, 0, 0); // Зачем это?
       //Applet := Form; // Нужно ли???

       MenuTray := NewMenu(Form, 0, ['show/hide', '-', 'Exit' ], DoMenuTrayMenuItem);
       MenuTray.Items[0].DefaultItem := True;

       Tray := NewTrayIcon(Form, Form.Icon);
       Tray.AutoRecreate := True;
       Tray.Active := True;
       Tray.OnMouse := DoTrayMouse;

       // ------------------------------------------------------------------------
       // ...

       FormShowHide(not optStartHide);
       Run(Form);
     end;
    end.

 
Конференция "KOL" » Шаблон для создания утилит «сидящих в трее» [Delphi]
Есть новые Нет новых   [134465   +2][b:0][p:0.003]