Seite 1 von 1

XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Mo, 03. Sep 2018 18:52
von georg
Guten Abend,


für ein Projekt muss ich innerhalb eines Xbase-Programms einen XbpDialog() anzeigen, der ohne die oben genannten Buttons daherkommt. Der Dialog ist recht klein, und die Buttons aufgrund seiner Funktion nicht erforderlich (eher: hinderlich).

Ich zitiere da mal aus der Dokumentation zu :maxButton:
The pushbutton is always displayed within an MDI client window, unless :titleBar is set to .F. (false).
OK, mein Problem ist, dass ich die Titlebar brauche. Nach mehreren Versuchen bin ich auf diese Lösung gekommen:

Code: Alles auswählen

   oDlg := XbpDialog():new(AppDeskTop(), oPart2Move:setOwner(), aPos, aSize)
Das funktioniert, wäre da nicht ein Schönheitsfehler:

Bild

Beide XbaseParts, also die XbpListBox() im Hintergrund, als auch der XbpDialog(), haben die gleiche Grösse, in diesem Fall 120 * 120 Pixel. Die angezeigte Grösse des XbpDialog() ist aber nur 105 * 112 Pixel (plus/minus 1 Pixel).

Ich hoffe, ich konnte mein Problem deutlich genug beschreiben:

ich brauche einen XbpDialog() mit der gleichen, angezeigten Grösse wie ein anderes XbasePart, dessen Titlebar sichtbar und nutzbar sein muss (zwecks mit der Maus packen und verschieben). Daher sind bei kleinen Ausgangs-XbaseParts die Buttons hinderlich und könnten alle entfallen.

Der Lösungsansatz, den Desktop als Parent zu verwenden, klappt - allerdings ist der XbpDialog() in der Anzeige etwas kleiner als die Vorgabe, die beim :new() mittels aSize vorgegeben wird. Rufe ich im Debugger die :currentSize() ab, wird sie (in diesem Fall) mit {120, 120} angegeben.

Jetzt suche ich nach einem Lösungsweg.

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Mo, 03. Sep 2018 22:56
von AUGE_OHR
georg hat geschrieben:
Mo, 03. Sep 2018 18:52
... allerdings ist der XbpDialog() in der Anzeige etwas kleiner als die Vorgabe, die beim :new() mittels aSize vorgegeben wird.
in solchen Fällen arbeite ich mit o:Clientsize d.h. von "innen nach aussen"

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 10:09
von Dieter
Hallo Georg,

wenn in aSize={120,120} enthalten ist, dann muss das Fenster auch diese Größe haben. Bei deiner Fragestellung gehe ich davon aus, dass du die äußere Fenstergröße meinst. Überprüfe bei dir, ob die oDlg:create-Methode die Fenstergöße nochmals verändert.
Mit oDlg:clientsize kannst du die Göße des Fensterrahmen und der Titlebar ausrechnen. Mit oDlg:border=XBPDLG_NO_BORDER hat auf meinem Windowsrechner die Titlebar eine Höhe von 23 Pixel und der Fensterrahmen hat 3 Pixel. oDlg:clientSize beträgt dann {114,91}.

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 11:45
von georg
Hallo, Dieter -


ich habe die ganzen Anweisungen (sind ja nicht so viele) mittels XppDbg verfolgt, und der XbpDialog() wird mit einer Grösse von {120, 120} erstellt. Seine linke, untere Ecke ist deckungsgleich mit der linken, unteren Ecke der XbpListBox().

Wenn ich die Grösse des XbpDialog() mittels :currentSize() abfrage, ist das Ergebnis {120, 120}. Das ist es ja, was mich verwirrt - gäbe es z.B. einen transparenten Rahmen, dann würde ich erwarten, dass er sich an allen Seiten des XbpDialog() befindet.

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 15:57
von Dieter
Hallo Georg,

die äußere Größe der richtigen Fenster (oDlg) stimmt genau. Die Göße der Listbox wird in xBase ohne Scrollbalken und ohne Rahmen angegeben.
Du mußt also das oDlg-Fenster etwas gößer kalkulieren. Wie vieles andere ist das in xBase etwas mühsam. :(

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 18:55
von Dieter
Hallo Georg,

gerade habe ich festgestellt, dass auch grafische oDlg-Fenster mit gleicher Größe, aber unterschiedlichen Rahmentypen nicht kongruent sind.
Das wurde von mir mit oDlg:border:= XBPDLG_NO_BORDER und XBPDLG_SIZEBORDER getestet. Also muss es soetwas wie ein unsichtbaren Rahmenanteil geben! Ich hatte bisher immer geglaubt, dass Dialogfenster mit gleicher aSize außen immer gleich groß sind. Man kann sich also nur auf die oDlg:clientSize verlassen.

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 19:27
von georg
Hallo, Dieter -


ich habe den Code mal ein wenig erweitert.

Code: Alles auswählen

   aPos := oPart2Move:currentPos()
   aSize := oPart2Move:currentSize()
   aPosDesk := RootWindow():currentPos()
   FOR nI := 1 TO 2
      aPos[nI] += aPosDesk[nI]
   NEXT

   oDlg := XbpDialog():new(AppDeskTop(), oPart2Move:setOwner(), aPos, aSize)
   oDlg:title := "bewege mich"
   oDlg:minButton := .F.
   oDlg:maxButton := .F.
   oDlg:create()

   aPos := oPart2Move:currentPos()
   aPos[1] += 20 + aSize[1]

   oDlg := XbpDialog():new(, , aPos, aSize)
   oDlg:title := "bewege mich 2"
   oDlg:create()
Das zweite (rechte) Fenster hat die gleiche Dimension, aber Parent ist nicht der Desktop, sondern die :drawingArea des Programms. Und es ist, denke ich, gut erkennbar, dass beide Fenster unterschiedlich gross sind:

Bild

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 22:10
von Dieter
Hallo Georg,
Und es ist, denke ich, gut erkennbar, dass beide Fenster unterschiedlich gross sind:
Ja das kann man deutlich erkennen, trotzdem sind die Fenstergrößen durch unsichtbare (transparente) Rahmenteile gleich groß gehalten.

Ändere deinen Code

Code: Alles auswählen

aPos[1] += 20 + aSize[1]
nach

Code: Alles auswählen

aPos[1] += aSize[1]
dann wird zwischen den Fenstern eine Lücke sichtbar, obwohl diese aneinander liegen müssten.

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Di, 04. Sep 2018 22:36
von AUGE_OHR
georg hat geschrieben:
Di, 04. Sep 2018 19:27
Das zweite (rechte) Fenster hat die gleiche Dimension, aber Parent ist nicht der Desktop, sondern die :drawingArea des Programms. Und es ist, denke ich, gut erkennbar, dass beide Fenster unterschiedlich gross sind:
schon mal versucht wenn es grösser ist als die 3 Buttons + Icon ?

die Xbase++ MDI Fenster sind "irgendwie verkehrt" ... schon die Titlebar stimmt nicht unter Windows 10.
mit o:Clientsize funktioniert es im Prinzip --- auch wenn mal paar Pixel fehlen und ein Horizontaler Schrollbar erscheint.

ich mache es dann die o:DrawingArea "sichtbar" mit

Code: Alles auswählen

oDlg:DrawingArea:SetColorBG(GRA_CLR_PINK)
p.s. zum "wegmachen" des Min+Max Button gibt es noch diese Möglichkeit von Phil Ide : SetWindowPropertyOff()
winprop.zip
Source
(1.2 KiB) 26-mal heruntergeladen

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Mi, 05. Sep 2018 7:52
von Koverhage
Georg,
eventuell kann dich ein Express++ Spezialist auf die richtige Fährte führen.
Dort gibt es NOMIN und NOMAX Anweisungen die zumindest diese 2 ausblenden.

Re: XbpDialog() ohne Min-, Max- und Close-Button

Verfasst: Mi, 05. Sep 2018 9:56
von georg
Guten Morgen,


die Windows-Property-Funktion von Phil hat das Problem gelöst.

Vielen Dank an alle!