Seite 1 von 1

ToolWindow in Taskleiste minimieren ...

Verfasst: 31.08.2007 11:18
von Ghosty1967
Hallo Leute...

Ich habe eine kleine Anwendung in einem Toolwindow erstellt (siehe Code)

Code: Alles auswählen

OpenWindow(0, 0, 0, 1, 1, "WorkClock",#PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_ScreenCentered) 
  SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_EX_TOOLWINDOW)
  ResizeWindow(0,winx,winy,100,262)
  ShowWindow_(WindowID(0),#SW_SHOW)
  StickyWindow(0,ontop)
...
und möchte nun, das das Fenster bei einem Doppelklick in den Fenstertitel
in die Taskleiste minimiert und dor auch angezeigt wird.
Beim wiederherstellen aus der Taskleiste, soll das Fenster jedoch weiterhin
NICHT in der Taskleiste angezeigt werden ;)
Könnte mir jemand zeigen, wie ich das bewerkstelligen kann?...

Verfasst: 31.08.2007 13:13
von Ligatur
Hallo,
du musst dazu mit einem Windowcallback arbeiten und die message #WM_NCLBUTTONDBLCLK auswerten. Wenn du die Message abgearbeitet hast 0 zurückgeben, dann maximiert das Fenster nach einem Doppelklick auf die Titelleiste nicht mehr. Wegen den minimieren auf die Taskleiste siehe PB - Hilfe.

Gruß,
Ligatur

Edit: Ich sehe gerade das du gar nicht auf ein Trayicon minimieren willst. Dann kannst du ja mal versuchen, beim Fenster beim Minimieren die Flags so zu verändern, das das Fenster in der Taskleiste angezeigt wird (Message #WM_SIZE, wParam = SIZE_MINIMIZED) und beim Maximieren das Toolwindow wiederhergestellt wird (Message #WM_SIZE, wParam = #SIZE_MAXIMIZED).

Verfasst: 03.09.2007 06:10
von Ghosty1967
...ich stoße schon bein Windowcallback an meine Grenzen.

Aber abgesehen davon, gelingt es mir erst garnicht das Toolwindow so zu
minimieren, das es in der Taskleiste sichtbar ist. Ich habe versucht, zuerst
den Fensterstil dahingehend zu ändern, das aus dem Toolwindow ein
normales Fenster wird und dieses dann zu minimieren
(erstmal über einen normalen Button).

Code: Alles auswählen

  SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_CAPTION)
  ShowWindow_(WindowID(0),#SW_SHOW)
  SetWindowState(0,#PB_Window_Minimize)
Was mache ich denn falsch ?!

Verfasst: 03.09.2007 17:17
von Ligatur
Hallo,
das Problem ist, das Windows die Taskleiste bei SetWindowLong_() nicht aktualisiert. Am einfachsten ist es wenn du das Fenster kurz versteckst und wieder erscheinen lässt, dann klappts:

Code: Alles auswählen

hwnd = OpenWindow(0, 0, 0, 200, 100, "WorkClock",#PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_ScreenCentered)
CreateGadgetList(hwnd)
ButtonGadget(0, 5, 5, 80, 25, "Minimize")

 OldFl = SetWindowLong_(hwnd, #GWL_EXSTYLE, #WS_EX_TOOLWINDOW)
 ShowWindow_(hwnd,#SW_SHOWNORMAL)

Repeat
	event = WaitWindowEvent()
	If event = #PB_Event_Gadget
		If EventGadget() = 0
			SetWindowLong_(hwnd, #GWL_EXSTYLE, OldFl)
			ShowWindow_(hwnd, #SW_HIDE)
			ShowWindow_(hwnd, #SW_SHOW)
			SetWindowState(0, #PB_Window_Minimize)
		EndIf
	EndIf

Until event = #PB_Event_CloseWindow
Aber wenn du darauf reagieren willst, wenn das Fenster wieder erscheint müsstest du dich am besten doch wieder mit Windowcallbacks beschäftigen. Es geht zwar evtl. mit #PB_Event_SizeWindow und den undokumentirten Befehlen EventwParam() und EventlParam() aber da diese Befehle nicht dokumentiert sind ist kein Verlass darauf, das diese Befehle in späteren PB - Versionen noch existieren.
Daß das Fenster bei Doppelklick auf die Titelleiste minimiert funktioniert nur über Windowcallback. Es bleibt dir also wohl nichts anderes übrig als dich mit Callbacks auseinanderzusetzen wenn du dein Projekt zuende bringen willst.

Gruß,
Ligatur

Verfasst: 03.09.2007 19:45
von roherter
Ich habe das mal mit Callback gemacht,Aber wie das mit der Titelleiste ist weiß ich jetzt auch nicht wenn du jetzt doppelt auf das Fenster selber klickst wird es minimiert.

Code: Alles auswählen

Global hwnd
  Procedure WinCallback(hwnd, uMsg, wParam, lParam) 
  
    
    If uMsg = #WM_LBUTTONDBLCLK 
      SetWindowLong_(hwnd, #GWL_EXSTYLE, OldFl)
      ShowWindow_(hwnd, #SW_HIDE)
      ShowWindow_(hwnd, #SW_SHOW)
      SetWindowState(0, #PB_Window_Minimize)
    EndIf 
    
    ProcedureReturn #PB_ProcessPureBasicEvents 
  EndProcedure 
  
  
hwnd = OpenWindow(0, 0, 0, 200, 100, "WorkClock",#PB_Window_SystemMenu|#PB_Window_Invisible|#PB_Window_ScreenCentered)

CreateGadgetList(hwnd)
ButtonGadget(0, 5, 5, 80, 25, "Minimize")

OldFl = SetWindowLong_(hwnd, #GWL_EXSTYLE, #WS_EX_TOOLWINDOW)
ShowWindow_(hwnd,#SW_SHOWNORMAL)
SetWindowCallback(@WinCallback(),0)
Repeat
  Event = WaitWindowEvent()
 
  If Event = #PB_Event_Gadget
    If EventGadget() = 0
      SetWindowLong_(hwnd, #GWL_EXSTYLE, OldFl)
      ShowWindow_(hwnd, #SW_HIDE)
      ShowWindow_(hwnd, #SW_SHOW)
      SetWindowState(0, #PB_Window_Minimize)
    EndIf
  EndIf
  
Until Event = #PB_Event_CloseWindow 

Verfasst: 03.09.2007 20:01
von Ligatur
Das Callback durch folgenden Code ersetzen, dann funktioniert ein Doppelklick auf die Titelleiste:

Code: Alles auswählen

    If uMsg = #WM_NCLBUTTONDBLCLK And wParam = #HTCAPTION
      SetWindowLong_(hwnd, #GWL_EXSTYLE, OldFl) 
      ShowWindow_(hwnd, #SW_HIDE) 
      ShowWindow_(hwnd, #SW_SHOW) 
      SetWindowState(0, #PB_Window_Minimize) 
      ProcedureReturn 0
    EndIf 
Allerdings muß die Variable OldFl jetzt entweder global gemacht werden oder mit shared im Windowcallback deklariert werden.

Dann musst du ja nur noch dafür sorgen, daß beim Wiederherstellen das Fenster nicht mehr in der Taskleiste dargestellt wird.