Frage bezgl. multipler APPBARs (Bildschirmlupe)

Für allgemeine Fragen zur Programmierung mit PureBasic.
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Frage bezgl. multipler APPBARs (Bildschirmlupe)

Beitrag 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
Zuletzt geändert von es_91 am 21.10.2015 15:05, insgesamt 2-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Wie macht die Bildschirmlupe das?

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Wie macht die Bildschirmlupe das?

Beitrag 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 ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Wie macht die Bildschirmlupe das?

Beitrag 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?
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Wie macht die Bildschirmlupe das?

Beitrag von es_91 »

Habe obigen Post editiert.

Ursprünglicher Inhalt: Hey, das ist beeindruckend! Vielen Dank. :) Danke, RSBasic.
Andreas21
Beiträge: 390
Registriert: 30.08.2004 09:05
Computerausstattung: Desktop
Windows 10 Pro x64
CPU: AMD Ryzen 5 2600 3.40 GHz
Ram: 16GB RAM
Grafik: NVIDA Geforce 1060
PB: 5.72 X86/X64
Wohnort: Heidelberg

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Beitrag 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
Windows 10 x64 Pro - PB 5.61 X64 / x32 - PB 4.6 x32
Benutzeravatar
Bisonte
Beiträge: 2465
Registriert: 01.04.2007 20:18

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Beitrag 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.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

Beitrag 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 ...
es_91
Beiträge: 410
Registriert: 25.01.2011 04:48

Re: Frage bezgl. multipler APPBARs (Bildschirmlupe)

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