ToolWindow in Taskleiste minimieren ...

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

ToolWindow in Taskleiste minimieren ...

Beitrag 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?...
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag 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).
Benutzeravatar
Ghosty1967
Beiträge: 205
Registriert: 29.08.2005 13:56
Computerausstattung: Intel i7, 128GB Ram, Win10 Ultimate, PB6.00 Alpha 3
Wohnort: Köln

Beitrag 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 ?!
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag 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
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag 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 
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Ligatur
Beiträge: 196
Registriert: 09.07.2006 00:41

Beitrag 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.
Antworten