Seite 1 von 1

Frage bezgl. multipler APPBARs (Bildschirmlupe)

Verfasst: 18.10.2015 13:01
von es_91
Seit Accessibility ein Thema für grafische Betriebssysteme ist gibt es Bildschirmlupen und diverse optische u. akkustische Hilfsmittel. Unter Windows gibt es die Bildschirmlupe, die den vergrößerten Screen wahlweise als rechteckige Lupe, als Komplettview oder als Balken an der oberen Bildschirmgrenze anzeigen kann.

Ich interessiere mich für die letztere Ansicht: Wie schafft es dieses Programm, den kompletten Desktop mit allen darauf laufenden Anwendungen zu verkleinern, um die Vergrößerungsansicht am oberen Rand 'erhaben' und immer im Vordergrund befindlich zu machen?

Bild
Ein Beispiel für den Einsatz der Bildschirmlupe... der obere Bildschirmrand enthält die Vergrößerungsansicht, der Desktop wird auf den darunteren Bereich verkleinert.

Direkt zur Frage: Kann man denn soetwas über die API auch mit PureBasic machen? Was muss man für Hebel umlegen, damit der Desktop rechtlich in den Hintergrund tritt und die eigene Aplikation bestimmen kann, wieviel der Bildschirmfläche für sie, und nur für sie, reserviert ist?

Dieses Problem ist Teil einer Videochatanwendung, die den Desktop des Gegenübers zeigen soll, _ohne_ darin Fenster für den Videochat der beiden Kameras zu managen. Aber das Problem sollte abstrakt betrachtet sein, ich weiß nämlich noch nicht einmal, wo es DLLs für Kameras gibt.

Schöne Grüße

es_91

Re: Wie macht die Bildschirmlupe das?

Verfasst: 18.10.2015 13:05
von RSBasic
Du kannst die Desktopgröße manuell anpassen. Wird oft auch für Sidebars verwendet.
Beispiel: http://www.rsbasic.de/aktualisierung/wi ... stellen.pb

Re: Wie macht die Bildschirmlupe das?

Verfasst: 18.10.2015 13:05
von Bisonte
Bei RSBasic's WinAPI Library nach " AppBar erstellen " Ausschau halten.

Dieses erstellt einen Bereich auf dem Desktop indem Du Fenster usw öffnen kannst, und der Desktop wird um diesen Bereich verkleinert.
(Das Ausmass kann man schön mit einem Fenster darstellen indem man es maximiert.

edit : Argl 30 sekunden zu spät ;)

Re: Wie macht die Bildschirmlupe das?

Verfasst: 18.10.2015 14:37
von es_91
Entschuldigt, ich muss noch eine Frage stellen.

Und zwar wollte mein Ideegeber jetzt, dass der Desktop nicht nur an einer Kante beschnitten wird, sondern an zwei; dabei soll die zweite AppBar sich der ersten unterordnen, das heißt, das System soll den Zustand der Desktopverkleinerung zweimal berechnen, nicht durch die zweite Bar die erste ersetzen.

Etwa so:

Bild

Meine bisherigen Versuche scheiterten kläglich daran, dass das OS nur einen "Sperrbereich" zu akzeptieren scheint. Falls es sich jemand antun möchte:

Code: Alles auswählen

;Autor: Stefan
; Re-author: es_91 (forums.purebasic.fr/german)

EnableExplicit

Define EventID
Define *APPBD.APPBARDATA
Define *APPB2.APPBARDATA
Define X
Define Y
Define Width
Define Height

Procedure CreateAPPBar(Edge,Size,*exsAPPBD.APPBARDATA=#Null); unterstützt #ABE_LEFT,#ABE_RIGHT,#ABE_TOP,#ABE_BOTTOM für Edge
  Protected *APPBD.APPBARDATA=AllocateMemory(SizeOf(APPBARDATA))
  Protected TBD.APPBARDATA
  SHAppBarMessage_(#ABM_GETTASKBARPOS,TBD)
  Protected TBEdge=TBD\uEdge
  
  SHAppBarMessage_(#ABM_NEW,*APPBD)
  
  *APPBD\uEdge=Edge
  
  Select Edge
    Case #ABE_LEFT
      
      If TBEdge=Edge
        *APPBD\rc\Left=TBD\rc\Right
        *APPBD\rc\Right=TBD\rc\Right+Size
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      Else
        *APPBD\rc\Left=0
        *APPBD\rc\Right=Size
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
      
    Case #ABE_RIGHT
      
      If TBEdge=Edge
        *APPBD\rc\Left=TBD\rc\Left-Size
        *APPBD\rc\Right=TBD\rc\Left
        *APPBD\rc\Top=*exsAPPBD\rc\bottom
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      Else
        *APPBD\rc\Left=GetSystemMetrics_(#SM_CXSCREEN)-Size
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=*exsAPPBD\rc\bottom
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
      
    Case #ABE_TOP
      
      If TBEdge=Edge
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=TBD\rc\Bottom
        *APPBD\rc\Bottom=TBD\rc\Bottom+Size
      Else
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=Size
      EndIf
      
    Case #ABE_BOTTOM
      
      If TBEdge=Edge
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=TBD\rc\Top-Size
        *APPBD\rc\Bottom=TBD\rc\Top
      Else
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=GetSystemMetrics_(#SM_CYSCREEN)-Size
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
  EndSelect
  
  SHAppBarMessage_(#ABM_SETPOS,*APPBD)
  
  ProcedureReturn *APPBD
EndProcedure

Procedure RemoveAPPBar(*APPBD.APPBARDATA)
  SHAppBarMessage_(#ABM_REMOVE,*APPBD)
  FreeMemory(*APPBD)
EndProcedure

Procedure APPBarX(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Left
EndProcedure

Procedure APPBarY(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Top
EndProcedure

Procedure APPBarWidth(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Right-*APPBD\rc\Left
EndProcedure

Procedure APPBarHeight(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Bottom-*APPBD\rc\Top
EndProcedure

ExamineDesktops ()

*APPBD.APPBARDATA=CreateAPPBar(#ABE_TOP,120) ; AppBar am oberen Rand erstellen
*APPB2.APPBARDATA=CreateAPPBar(#ABE_RIGHT,300,*APPBD.APPBARDATA)
X=APPBarX(*APPBD)
Y=APPBarY(*APPBD)
Width=APPBarWidth(*APPBD)
Height=APPBarHeight(*APPBD)

If OpenWindow(0,X,Y,Width,Height,"Window",#PB_Window_BorderLess)
  
  SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
  
  Repeat
    EventID=WaitWindowEvent()
    If EventID=#PB_Event_LeftDoubleClick
      EventID = #PB_Event_CloseWindow
    EndIf
    If EventID = #PB_Event_CloseWindow
      RemoveAPPBar(*APPBD) ; AppBar entfernen
      RemoveAPPBar(*APPB2)
      End
    EndIf
  ForEver
EndIf
(zum Beenden bitte doppelt auf das leere Fenster klicken)


Kann mir jemand weiterhelfen?

Re: Wie macht die Bildschirmlupe das?

Verfasst: 20.10.2015 15:44
von es_91
Habe obigen Post editiert.

Ursprünglicher Inhalt: Hey, das ist beeindruckend! Vielen Dank. :) Danke, RSBasic.

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Verfasst: 26.10.2015 02:19
von Andreas21
So?

Code: Alles auswählen

;Autor: Stefan

EnableExplicit

Define EventID
Define *APPBD.APPBARDATA
Define *APPBD2.APPBARDATA
Define X
Define Y
Define Width
Define Height
Define X2
Define Y2
Define Width2
Define Height2

Procedure CreateAPPBar(Edge,Size); unterstützt #ABE_LEFT,#ABE_RIGHT,#ABE_TOP,#ABE_BOTTOM für Edge
  Protected *APPBD.APPBARDATA=AllocateMemory(SizeOf(APPBARDATA))
  Protected TBD.APPBARDATA
  SHAppBarMessage_(#ABM_GETTASKBARPOS,TBD)
  Protected TBEdge=TBD\uEdge
  
  SHAppBarMessage_(#ABM_NEW,*APPBD)
  
  *APPBD\uEdge=Edge
  
  Select Edge
    Case #ABE_LEFT
      
      If TBEdge=Edge
        *APPBD\rc\Left=TBD\rc\Right
        *APPBD\rc\Right=TBD\rc\Right+Size
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      Else
        *APPBD\rc\Left=0
        *APPBD\rc\Right=Size
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
      
    Case #ABE_RIGHT
      
      If TBEdge=Edge
        *APPBD\rc\Left=TBD\rc\Left-Size
        *APPBD\rc\Right=TBD\rc\Left
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      Else
        *APPBD\rc\Left=GetSystemMetrics_(#SM_CXSCREEN)-Size
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
      
    Case #ABE_TOP
      
      If TBEdge=Edge
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=TBD\rc\Bottom
        *APPBD\rc\Bottom=TBD\rc\Bottom+Size
      Else
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=0
        *APPBD\rc\Bottom=Size
      EndIf
      
    Case #ABE_BOTTOM
      
      If TBEdge=Edge
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=TBD\rc\Top-Size
        *APPBD\rc\Bottom=TBD\rc\Top
      Else
        *APPBD\rc\Left=0
        *APPBD\rc\Right=GetSystemMetrics_(#SM_CXSCREEN)
        *APPBD\rc\Top=GetSystemMetrics_(#SM_CYSCREEN)-Size
        *APPBD\rc\Bottom=GetSystemMetrics_(#SM_CYSCREEN)
      EndIf
  EndSelect
  
  SHAppBarMessage_(#ABM_SETPOS,*APPBD)
  
  ProcedureReturn *APPBD
EndProcedure

Procedure RemoveAPPBar(*APPBD.APPBARDATA)
  SHAppBarMessage_(#ABM_REMOVE,*APPBD)
  FreeMemory(*APPBD)
EndProcedure

Procedure APPBarX(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Left
EndProcedure

Procedure APPBarY(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Top
EndProcedure

Procedure APPBarWidth(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Right-*APPBD\rc\Left
EndProcedure

Procedure APPBarHeight(*APPBD.APPBARDATA)
  ProcedureReturn *APPBD\rc\Bottom-*APPBD\rc\Top
EndProcedure



*APPBD2.APPBARDATA=CreateAPPBar(#ABE_LEFT,40) ; AppBar am linken Rand erstellen
X2=APPBarX(*APPBD2)
Y2=APPBarY(*APPBD2)
Width2=APPBarWidth(*APPBD2)
Height2=APPBarHeight(*APPBD2)

If OpenWindow(1,X2,Y2,Width2,Height2,"Window",#PB_Window_BorderLess)
  ButtonImageGadget(6,10,10,20,20,LoadIcon_(0,102))
  ButtonImageGadget(7,10,40,20,20,LoadIcon_(0,102))
  ButtonImageGadget(8,10,70,20,20,LoadIcon_(0,101))
  ButtonImageGadget(9,10,100,20,20,LoadIcon_(0,104))
  
  *APPBD.APPBARDATA=CreateAPPBar(#ABE_TOP,40) ; AppBar oben erstellen
  X=APPBarX(*APPBD)
  Y=APPBarY(*APPBD)
  Width=APPBarWidth(*APPBD)
  Height=APPBarHeight(*APPBD)
  
  If OpenWindow(0,X,Y,Width,Height,"Window",#PB_Window_BorderLess)
    ButtonImageGadget(2,10,10,20,20,LoadIcon_(0,100))
    ButtonImageGadget(3,40,10,20,20,LoadIcon_(0,100))
    ButtonImageGadget(4,70,10,20,20,LoadIcon_(0,100))
    ButtonImageGadget(5,100,10,20,20,LoadIcon_(0,103))
    
    SetWindowPos_(WindowID(0),#HWND_TOPMOST,0,0,0,0,#SWP_NOSIZE|#SWP_NOMOVE)
    
    Repeat
      EventID=WaitWindowEvent()
      If EventID=#PB_Event_Gadget
        Select EventGadget()
          Case 5
            EventID = #PB_Event_CloseWindow
          Case 9
            MessageRequester("","Hallo")
        EndSelect
      EndIf
      If EventID = #PB_Event_CloseWindow
        RemoveAPPBar(*APPBD) ; AppBar entfernen
        RemoveAPPBar(*APPBD2)
        End
      EndIf
    ForEver
  EndIf
EndIf

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Verfasst: 26.10.2015 10:32
von Bisonte
Es ist doch nur eine AppBar....

Versuche mal ein anderes Fenster (z.B. die PB-IDE die beim kompilieren ja noch auf ist ;) ) erst einmal zu minimieren und dann
wieder zu maximieren.

Die "AppBar" links hat sich erledigt, es zählt also nur die zuletzt erstellte AppBar auch wirklich als eine solche, egal wie viele man erstellt.

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Verfasst: 07.11.2015 13:53
von es_91
Tschuldigt, dass ich mich so lang nicht gemeldet habe!

Könnten zwei AppBars funktionieren, wenn sie von zwei separaten Anwendungen kommandiert werden?

Bevor ich das mühsam ausprobiere, wollte ich fragen ...

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Verfasst: 07.11.2015 13:59
von es_91
War garnicht so mühsam, das auszuprobieren ... und nein, leider klappt es nicht. Es gibt nur eine AppBar (neben der Systemleiste) ...

// Aber das heißt ja auch, wenn ein Programm eine AppBar verwendet, kann ein anderes diese überschreiben ... und das heißt, man sollte gar keine AppBar nutzen. :(