Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Was muss in die Function rein für trayiconpopupmenü (https://www.delphipraxis.net/18645-muss-die-function-rein-fuer-trayiconpopupmenue.html)

Delphi-Noobie 22. Mär 2004 17:42


Was muss in die Function rein für trayiconpopupmenü
 
Code:
unit TNA;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms, ExtCtrls,
  ShellApi, Menus;

const
  k_WM_TASKMSG = WM_APP + 100; //die "100" ist ein frei wählbarer Wert

type
  TForm1 = class(TForm)
    TPopupMenu1: TPopupMenu;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDblClick(Sender: TObject);
    procedure PopupMenuClick(Sender: TObject);
  private
    { Private-Deklarationen } 
    tTNA: TNotifyIconData;

    procedure WMTaskMsg(var Msg: TMessage); message k_WM_TASKMSG;
    procedure AppActive;
    procedure AppDeactivate;
    procedure ShowIcon;
    procedure ChangeIcon;

  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;


implementation


{$R *.DFM} 
{$R TNA.RES} //eine Resource mit 2 Icons oder Bitmaps


procedure TForm1.FormCreate(Sender: TObject);
begin
  {läßt die Form schon bei Programmstart verschwinden} 
  Application.ShowMainForm := False;

  {Symbol im TNA anzeigen} 
  Self.ShowIcon;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  {Symbol aus dem TNA entfernen} 
  Shell_NotifyIcon(NIM_DELETE, @tTNA);
end;


procedure TForm1.FormDblClick(Sender: TObject);
begin
  {lassen wir doch die Form wieder verschwinden ...} 
  Self.AppDeactivate;

  {... und ändern das Symbol in dem TNA} 
  Self.ChangeIcon;
end;


procedure TForm1.PopupMenuClick(Sender: TObject);
begin
  case TPopupMenu(Sender).Tag of

    {hier steht dann die Auswahl was getan werden soll} 
    {wenn auf das erschienene Popupmenü geklickt wurde} 
  end;
end;


procedure TForm1.WMTaskMsg(var Msg: TMessage);
var
  rCursor: TPoint;
begin
  {wenn die Nachricht aus unserem definierten Bereich kommt dann ...} 
  if Msg.wParam = tTNA.uID then
  begin
    {... tu was wenn das Ereignis ein ...} 
    case Msg.lParam of

      {... rechter Mausklick ist oder ...} 
      WM_RBUTTONDOWN:
        begin
          {aktuelle Cursoposition holen} 
          GetCursorPos(rCursor);

          {ACHTUNG!!!!! Der folgende Aufruf ist an dieser Stelle ganz wichtig!!!!} 
{Erst durch diese API-Funktion wird das Popupmenü dazu bewegt zu verschwinden
wenn ein Klick außerhalb des Popupmenüs erfolgt} 

          SetForegroundWindow(Self.Handle);

          {Also, nicht vergessen!!!} 


          {Das Popupmenü erscheint an der gewünschten Position in dem TNA} 
          TPopupMenu1.Popup(rCursor.x, rCursor.y);
        end;

      {... ein linker doppelter Mausklick ist} 
      WM_LBUTTONDBLCLK: Self.AppActive;
    end;
  end;
end;


procedure TForm1.AppActive;
var
  hOwner: THandle;
begin
  {Form einblenden} 
  SendMessage(Self.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
  ShowWindow(Self.Handle, SW_SHOW);
  SetForegroundWindow(Self.Handle);

  {Symbol in der Taskbar einblenden} 
  hOwner := GetWindow(Self.Handle, GW_OWNER);
  SendMessage(hOwner, WM_SYSCOMMAND, SC_RESTORE, 0);
  ShowWindow(hOwner, SW_SHOW);
end;


procedure TForm1.AppDeactivate;
begin
  {Form ausblenden} 
  ShowWindow(Self.Handle, SW_HIDE);

  {Symbol in der Taskbar ausblenden} 
  ShowWindow(GetWindow(Self.Handle, GW_OWNER), SW_HIDE);
end;


procedure TForm1.ShowIcon;
begin
  tTNA.cbSize := SizeOf(tTNA);
  tTNA.Wnd   := Self.Handle;
  tTNA.uID   := 24112000;                    //frei wählbarer Wert zur Identifizierung
  tTNA.uCallbackMessage := k_WM_TASKMSG;
  tTNA.hIcon := LoadIcon(hInstance, 'xxx');
  //xxx ist die Bezeichnung eines Icons aus "TNA.res"
  StrCopy(tTNA.szTip, 'Hallo');            //Hint
  tTNA.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
  {CB Symbol in dem TNA einrichten CE} 
  Shell_NotifyIcon(NIM_ADD, @tTNA);
end;


procedure TForm1.ChangeIcon;
begin
  tTNA.cbSize := SizeOf(tTNA);
  tTNA.hIcon := LoadIcon(hInstance, 'yyy');
  //yyy ist die Bezeichnung eines weiteren Icons aus "TNA.res"
  StrCopy(tTNA.szTip, 'Welt');             //Hint

  {CB Symbol im TNA ändern CE} 
  Shell_NotifyIcon(NIM_MODIFY, @tTNA);
end;


end.
Ich hab das aus Swissdelphicenter und das icon is nun unten neben der Uhr aber was muss in die Function
Code:
procedure TForm1.PopupMenuClick(Sender: TObject);
begin
  case TPopupMenu(Sender).Tag of

  // <---- ???????¿¿¿¿ 
  end;
end;
rein, damit ein Menü erscheint wo ich was auswählen kann und er dann irgendwas macht??

Markus K. 22. Mär 2004 17:46

Re: Was muss in die Function rein für trayiconpopupmenü
 
Hallo Delphi-Noobie,
da müssen glaub ich die Tags der MenuItem des PopUpMenues rein (Tag=Variable vom Typ LongInt). Zum Beispiel:
Delphi-Quellcode:
procedure TForm1.PopupMenuClick(Sender: TObject);
begin
  case TPopupMenu(Sender).Tag of
    1: {Prozedur einfügen}
    ...
  end;
end;
Tschüß Markus

Delphi-Noobie 22. Mär 2004 18:56

Re: Was muss in die Function rein für trayiconpopupmenü
 
Das Problem war bei mir, dass da gar kein Popup menu erst kommt! also ich kann da rausdrücken wie ich will da passiert immer nur dieses appactivate oder so aber es kommt kein menü. Wie kann ich da eins hinmachen?

Markus K. 22. Mär 2004 19:01

Re: Was muss in die Function rein für trayiconpopupmenü
 
Du musst wissen wo und wann das PopUpMenu angezeigt werden soll. Das Formular sowie einzelne Komponenten besitzen die Eigenschaft PopUpMenu, wo du leicht ein PopUpMenu der entsprechenden Komponente/Form zuweisen kann.

Tschüß Markus

Delphi-Noobie 22. Mär 2004 19:15

Re: Was muss in die Function rein für trayiconpopupmenü
 
K da kommt jetzt nen Menü! Und bei der Procedure von oben hab ich das mit der 1 eingefügt un da müsste doch eigendlich was passieren wenn ich dann den ersten Eintrag anklicke?? als BSp. hab ich showmessage genommen aber funzt net :/ why?

Delphi-Noobie 22. Mär 2004 19:18

Re: Was muss in die Function rein für trayiconpopupmenü
 
Ach jetzt hab ichs :)) ich musste doppelklick aus die Popup Componente machen und dann bei den einmzelnen Einträgen nochmal on click ne Procedure reinhauen ^^ Darauf muss man erstmal kommen :)

Mackhack 30. Apr 2004 02:27

Re: Was muss in die Function rein für trayiconpopupmenü
 
Hi,

wo müsste ich denn den Code hier einfügen damit wenn ich auf den Minimieren-Button klicke das Programm nicht in die Taskleiste geht sondern wieder in die SysTray?

Delphi-Quellcode:
If IsWindowVisible(Handle) Then
  Begin
    ShowWindow(GetWindow(Handle, GW_OWNER), SW_HIDE);
    Hide;
  End;
Danke!

SirThornberry 30. Apr 2004 06:57

Re: Was muss in die Function rein für trayiconpopupmenü
 
Krass, so viel source für nen einfaches Tray mit popup

Matze 30. Apr 2004 07:02

Re: Was muss in die Function rein für trayiconpopupmenü
 
@Mackhack: Die DP hat eine Code-Lib :roll:

Siehe Luckie's Post. ;)

Mackhack 1. Mai 2004 01:19

Re: Was muss in die Function rein für trayiconpopupmenü
 
Danke,

hab es gefunden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz