Fenster oben links [erledigt] Danke an alle!

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Fenster oben links [erledigt] Danke an alle!

Beitrag von Bruno »

Hallo,
hat schon jemand in der Appsys die Koordinaten für die Fensteranzeige oben links gemacht? ( unabhängig der Bildschirmauflösung )
Wenn ja bitte den Link dazu.

mit aPos := 0,0 landet mein Fenster zwar links, aber unten.

Danke
Zuletzt geändert von Bruno am Mi, 26. Apr 2023 12:20, insgesamt 1-mal geändert.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Jan »

Moin,

wenn Du bei Deinem Main Dialog das einträgst

Code: Alles auswählen

XBPDialog():new(AppDesktop(), , {0, 0}, {1024, 786}, {{XBP_PP_ORIGIN, XBP_ORIGIN_TOPLEFT}} , .F.)
dann sind diser und alle davon abgeleiteten Dialog Top Left.

Standard bei Xbase++ ist Bottom Left, weil das ursprünglich aus OS/2 kommt. Und IBM hat halt im mathemtischen Koordinatensystem gedacht.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

Jan hat geschrieben: Mo, 24. Apr 2023 5:18

Code: Alles auswählen

XBPDialog():new(AppDesktop(), , {0, 0}, {1024, 786}, {{XBP_PP_ORIGIN, XBP_ORIGIN_TOPLEFT}} , .F.)
Moin Jan,
Danke, zählt das auch für Crt Fenster?
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Jan »

Bruno hat geschrieben: Mo, 24. Apr 2023 7:36zählt das auch für Crt Fenster?
Nein. Die sind ja kein XbpDialog.

Wobei CRT ja nach Clipper-Art zählt, und das ist immer TopLeft. Aber halt nicht in Pixeln sondern in Zeilen und Spalten.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

Jan hat geschrieben: Mo, 24. Apr 2023 7:42
Bruno hat geschrieben: Mo, 24. Apr 2023 7:36zählt das auch für Crt Fenster?
Nein. Die sind ja kein XbpDialog.

Wobei CRT ja nach Clipper-Art zählt, und das ist immer TopLeft. Aber halt nicht in Pixeln sondern in Zeilen und Spalten.

Jan
Hi Jan, das Fenster wird über die Appsys() erzeugt, wie bekomme ich entweder durch Änderung einer eigenen Appsys Procedure oder durch Aufruf die Position oben links hin?
Wobei das Crt Fenster ja auch ein GUI Fenster ist, der Inhalt dieses Fensters ist nicht GUI.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

In der Original Appsys Procedure wird das Fenster immer zentriert, ich wollte das in meinem kleinen Programm ändern auf oben links.

Code: Alles auswählen

      // Bestimmen der Fensterposition (Anordnen in der Mitte
      // des Desktop-Fensters)
      aSizeDesktop    := AppDesktop():currentSize()

      aPos            := { (aSizeDesktop[1]-(DEF_COLS * DEF_FONTWIDTH))  /2, ;
                         (aSizeDesktop[2]-(DEF_ROWS * DEF_FONTHEIGHT)) /2  }




      // XbpCRT-Fenster erzeugen
      oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
      oCrt:FontWidth  := DEF_FONTWIDTH
      oCrt:FontHeight := DEF_FONTHEIGHT
      oCrt:title      := AppName()
#ifdef __OS2__
      oCrt:FontName   := "System VIO"
#endif
#ifdef __WIN32__
      oCrt:FontName   := "Alaska Crt"
#endif
      oCrt:Create()

      // Presentation Space initialisieren
      oCrt:PresSpace()

      // XbpCrt wird aktives Fenster und Ausgabeger„t
      SetAppWindow ( oCrt )

    // Anwendung wurde im VIO oder NOVIO Modus gelinkt, eine RootCrt
    // Instanz ist zu erzeugen.
    CASE nAppType == APPTYPE_VIO .OR. nAppType == APPTYPE_NOVIO

      // RootCrt Instanz erzeugen.
      //
      // Die IVar :CreateBuffer bestimmt wie sich das RootCrt verhaelt
      // wenn es in einem Shell Fenster erzeugt wird.
      //
      //   :CreateBuffer == .T. : Das RootCrt wird einen eigenen Bildschirm
      //                          Puffer erzeugen der dann fuer die Darstellung
      //                          verwendet wird. Dies hat zur Folge das
      //                          Ausgaben mit OutStd() nicht mit anderen
      //                          Text Ausgaben (z.B: Qout(), Dispbox() gemischt
      //                          werden koennen.
      //   :CreateBuffer == .F. : Es wird kein eigener Bildschirm Puffer erzeugt
      //                          und der des Shell Fensters verwendet. OutStd()
      //                          Ausgaben werden nun gleichzeitig dargestellt.
      oCrt := RootCrt():New()
      oCrt:CreateBuffer := .T.
      oCrt:Create()

      // RootCrt wird aktives Fenster und Ausgabeger„t.
      SetAppWindow ( oCrt )

  ENDCASE
Die Appsys wird doch auch bei XbpDialog benutzt, ODER ???
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Jan »

Bruno,

der PresentationParameter (hier also der für TopLeft) funktioniert nur, wenn Du ein XbpDialog() einbaust. Denn dort wird der aufgerufen. Und der funktioniert dann auch nur für alle Objekte, die in diesen Dialog eingebaut werden. Was halt alles nur grafische Objekte sein können.

Die Appsys wird IMMER aufgerufen, egal was für ein Typ Dein Programm ist.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Tom »

Die Appsys wird IMMER aufgerufen, egal was für ein Typ Dein Programm ist.
Weshalb man Code wie diesen verbaut, wenn man das nicht möchte:

Code: Alles auswählen

PROC AppSys() ; RETURN
Herzlich,
Tom
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Fenster oben links

Beitrag von AUGE_OHR »

hi Bruni,

Kopiere die PROCEDURE AppSys(), aus c:\ALASKA\XPPW32\Source\SYS\AppSys.prg, und füge es "in" deine Xbase++ App VOR Main() ein

---

bei einer VIO ( wie Cl*pper ) bekommst du ein

Code: Alles auswählen

oCrt := RootCrt():New()
da gibt es keine Methoden zum "manipulieren"

wenn du mit /PM:PM compilierst wird

Code: Alles auswählen

oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
verwendet was du konfigurieren kannst

die Position aPos kannst du auf {0,0} einstellen
Das Fenster wird "grosser" wenn man die #define DEF_FONTHEIGHT / DEF_FONTWIDTH ändert
das übliche 80 x 25 kann man z.b. auf 80 x 50 ändern

wenn du /PM:PM verwendest und GUI haben willst schreibt man, wie Tom schon sagte, eine "leere" AppSys()
sonst geht das XbpCrt() zusammen mit der GUI App auf

---

den DLL Code, welcher eine weiteren Start verhindern soll, gehört auch in die AppSys VOR dem DO CASE
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Jan »

Jimmy,

wie Du oben lesen kannst HAT Bruno schon eine eigene AppSys zusammen gestellt und eingebunden.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

Oh vielen Dank, jetzt die Frage aller Fragen, wenn ich ein XbpDialogFenster mache, kann ich darin ein Crt Fenster machen?
Jan hat geschrieben bei XbpDialog ginge es. Ich glaube ( nicht wissen ) dass dies möglich sein müßte, da das Crt Fenster ja ein Objekt darstellt.

Dazu aber gleich !!! : Ich habe von Objektorientierter Programmierung noch keinen blassen Schimmer :banghead: : also bitte so damit ich es verstehen kann. Habe noch kein Alzheimer oder Demenz, somit besteht Hoffnung noch etwas zu lernen! Ich sehe das mal so gesagt als Crashkurs Unterstützung für eigen Schule ( selbst beibringen ) :D
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

AUGE_OHR hat geschrieben: Mo, 24. Apr 2023 9:18 hi Bruni,


die Position aPos kannst du auf {0,0} einstellen

Das Fenster wird "grosser" wenn man die #define DEF_FONTHEIGHT / DEF_FONTWIDTH ändert
das übliche 80 x 25 kann man z.b. auf 80 x 50 ändern

wenn du /PM:PM verwendest und GUI haben willst schreibt man, wie Tom schon sagte, eine "leere" AppSys()
sonst geht das XbpCrt() zusammen mit der GUI App auf

---

den DLL Code, welcher eine weiteren Start verhindern soll, gehört auch in die AppSys VOR dem DO CASE
Hi Jimmy danke, ich benutze seit Anfang an immer PM ( Hybrid ), Die Fenstergröße ist auch kein Problem,
aPos (0,0) hat den Effekt, Fenster zwar links, aber ganz unten. Ich hoffte, daß schon jemand eine Formel ( wie die in der Appsys ) gemacht hat.

Mein Laptop hat Auflösung 1600 * 900, mehr macht der nicht. Aber ich wollte ja auch nicht auf meinem Laptop sondern egal welche Auflösung
" Oben Links "
Wer dann das Fenster verschieben will, soll es machen, aber generell soll es oben links sein.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von brandelh »

das CRT oder XbpCrt() Fenster (also wie früher bei Clipper) wird intern wie Clipper in 0-24 Zeilen und 0 bis 79 Spalten aufgeteilt (man könnte das ändern, aber das lassen wir mal)
Die Koordinaten innerhalb dieses Fensters, sind so wie Clipper die auch verwaltet hat.

Außen aber ist das ein normales Windowsfenster, das man auf dem Bildschirm wild verteilen kann. Jan hat ja schon mal geschrieben, dass man die Ausrichtung von XbpDialog() Fenstern ändern kann,
aber im Grunde musst du nur ermitteln welche Auflösung der Rechner hat und vom Y-Wert, den Y-Wert des Fenster-Außenrahmens abziehen.

Ich persönlich finde aber immer besser wenn man ein Fenster zentriert auf dem Bildschirm aufmacht und der Anwender kann es dann verschieben.

Mal sehen ob ich Beispiel-Code finde - zum zentrieren des Fensters:

Code: Alles auswählen

procedure CenterCRT()
   local oCrt := SetAppWindow()
   local aSizeDesktop    := AppDesktop():currentSize()
   local nDesktopBreite  := aSizeDesktop[1]
   local nDesktopHoehe   := aSizeDesktop[2]
   local nBreite, nHoehe, nPosX, nPosY

   nBreite := oCrt:currentSize()[1]
   nHoehe  := oCrt:currentSize()[2]
   if nHoehe < nDesktopHoehe
      nPosY := (nDesktopHoehe-nHoehe)/2 // oben wäre (nDesktopHoehe-nHoehe)+nAbstand (es wäre nützlich, eventuell 1 bis 10 Pixel Abstand zum oberen Rand zu haben, oder 0 
   else
      nPosY := (nDesktopHoehe-nHoehe)
   endif
   if nBreite < nDesktopBreite
      nPosX := (nDesktopBreite-nBreite)/2 // bei linksbündig einfach 0 oder ein paar Pixel mehr.  (0,0 ist linke untere Ecke)
   else
      nPosX := 1
   endif
   oCrt:setPos( { nPosX , nPosY } )
return
nPosS := 0 und ### EDIT ### muss natürlich nPosX := 0 lauten
nPosY := (nDesktopHoehe-nHoehe) wäre dann linke obere Ecke

Es kann sein, dass die Einstellung von der Menüleiste unten den oberen Rand etwas verschiebt, daher der möglicherweise nötige obere Rand.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9361
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Tom »

Die genaue Größe des nutzbaren Desktops (ohne Taskleiste, ganz egal, wo sie ist), ermittelt man über SystemParametersInfoA. AppDeskTop():CurrentSize() liefert ja alles, und das ist nicht hilfreich.

Wie das genau geht, ist hier erklärt:
https://www.xbaseforum.de/viewtopic.php ... oA#p115204
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von brandelh »

Danke Tom, so ist es natürlich genauer !

Eventuell hilft dir insgesamt mein Vortrag zur Devcon 2007, zur Migration von Clipper zu Xbase++

- was geht so wie bisher, also einfach das Clipper Verhalten im Fenster (RootCrt() - Textmodus, XbpCrt() - mit grafischen Möglichkeiten)
- wie weit kann man die XbpCrt() aufbohren, z.B. Font-Auswahl, Cut & Paste (nicht mit der Maus), Drucker etc.
- was sollte man bleiben lassen.

https://www.xbaseforum.de/viewtopic.php?f=16&t=2294

Zu deiner Frage, man kann KEIN CRT Fenster in einem XbpDialog() platzieren, man kann aber in einem grafischen XbpCrt() Fenster grafische Objekte verwenden, lies was ich dort dazu geschrieben habe.

Aus meiner Sicht macht es aber nur Sinn, die XbpDialog() Fenster neben anderen XbpCrt() Fenstern (in einer Anwendung) oder auch neben einer anderen EXE zu haben.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von brandelh »

Ich hab mir die Infos gleich mal lokal gespeichert und die .CH Dateien dazu gesucht:

Code: Alles auswählen

#include "dll.ch"
#include "WinUser_constants.ch" // interessant, zu jeder Windows-API DLL scheint es schon (zumindest in 2.x) eine passende für die Abkürzungen der API zu geben, bisher hab ich mir das immer bei deren Doku raus gesucht.

DLLFUNCTION SystemParametersInfoA( nAction, nParam1, @Param2, nWinIni ) ;
  USING STDCALL FROM USER32.DLL

FUNCTION DC_GetWorkArea()
LOCAL cBuffer := SPACE(16)
LOCAL aRet := ARRAY(4)

   SystemParametersInfoA( SPI_GETWORKAREA, 0, @cBuffer, SPIF_SENDCHANGE )
   aRet[1] := BIN2U( SUBSTR( cBuffer,  1,4 ))
   aRet[2] := BIN2U( SUBSTR( cBuffer,  5,4 ))
   aRet[3] := BIN2U( SUBSTR( cBuffer,  9,4 ))
   aRet[4] := BIN2U( SUBSTR( cBuffer, 13,4 ))
RETURN aRet
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Jan »

Bruno,

wie ich schrieb: TopLeft geht nur auf XbpDialog. Nicht auf XbpCrt.

Wenn Du ein Hybrid-Programm schreibst das sowohl CRT als auch GUI anzeigen soll dann "malst" Du die grafischen Elemente in das DOS-Fenster. Nicht auf ein XbpDialog. Also geht da kein TopLeft. Das geht einfach nicht, Punkt, aus, vorbei.

Wenn ein Dialog komplett grafisch ist dann kannst Du dafür den XbpDialog erstellen, und darauf dann Deine grafischen Elemente setzen. Den Dialog mußt Du aber hinterher wieder wegräumen (:hide, :destroy), weil Grafik immer DOS überlagert. Du kannst zwar DOS-Ausgaben auf das ursprüngliche Fenster machen soviel Du willst (nicht auf den XbpDialog, das ist verboten), aber Du siehst die nicht weil die hinter dem XbpDialog verborgen liegen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Fenster oben links

Beitrag von AUGE_OHR »

hi Hubert,
brandelh hat geschrieben: Mo, 24. Apr 2023 16:00 Zu deiner Frage, man kann KEIN CRT Fenster in einem XbpDialog() platzieren, man kann aber in einem grafischen XbpCrt() Fenster grafische Objekte verwenden, lies was ich dort dazu geschrieben habe.
warum soll man kein XbpCRT() auf der o:DrawingArea von einem XbpDialog haben können :?:

ich habe auf der Devcon 2018 vorgeführt wie man DBU, als XbpCRT(), "in" einem XbpDialog() verwenden kann

---

wenn man ein XbpCRT() auf der o:DrawingArea hat und dann ein Control erzeugt was auch die DrawingArea als Parent hat dann wird es "vorne" angezeigt

das "Problem" ist nur das es nach "hinten" verschwinden kann wenn das Control nicht "modal", wie eine Msgbox(), ist
man muss dann mit SETAPPWINDOW() und SETAPPFOCUS() arbeiten wobei man die entsprechenden Codeblock Slot nutzen kann

Code: Alles auswählen

   oDlgMain:SetInputFocus := { | mp1, mp2, oSelf | Such1oCrt( oDlgMain ) }
   oDlgMain:setDisplayFocus := { | uNIL1, uNIL2, oSelf | Such1oCrt( oDlgMain ) }

Code: Alles auswählen

   oCrt:SetInputFocus := { | mp1, mp2, obj | SETAPPWINDOW( oCrt ), SETAPPFOCUS( oCrt ), JOBSTART() }
   oCrt:setDisplayFocus := { | uNIL1, uNIL2, oSelf | SETAPPWINDOW( oCrt ), SETAPPFOCUS( oCrt ), JOBSTART() }
p.s. so kann man dann auch die Maus im XbpCRT() Fenster nutzen

Code: Alles auswählen

   SETMOUSE( .T. )
   oCrt:mouseMode := XBPCRT_MOUSEMODE_VIO
gruss by OHR
Jimmy
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

brandelh hat geschrieben: Mo, 24. Apr 2023 15:43
nPosS := 0 und nPosY := (nDesktopHoehe-nHoehe) wäre dann linke obere Ecke

Es kann sein, dass die Einstellung von der Menüleiste unten den oberen Rand etwas verschiebt, daher der möglicherweise nötige obere Rand.
Hallo Hubert,
die Formel welche Du so schön angeführt hast ergibt 0,0 ! Ich will nicht kritisieren ! Im Gegenteil vielen Dank ! Mit dieser Formel hast Du ein paar graue Zellen bei mir aktiviert !!! :D
Schaut Euch mein kleines Testprogramm an, ich benutze immer ein Testprogramm um gewisse Vorgänge erkennen und verstehen zu können.
Wäre schön, wenn auf verschiedenen Auflösungen getestet würde, ich hab nur 1600 x 900 ! Wäre über Meldungen erfreut, ob auch bei höheren Auflösungen die Position des Fensters oben links wäre. Habe das Prog mit 1.9 compiliert. Prog und Quellcode in Test.zip
Test.zip
(5.99 KiB) 48-mal heruntergeladen

Code: Alles auswählen

#include "Appevent.ch"
#include "xbp.ch"
****************************************************************************
* Funktion AppSys() um Standard-Ausgabegeraete zu erzeugen
****************************************************************************
PROCEDURE AppSys()

#define DEF_ROWS       25
#define DEF_COLS       80
#define DEF_FONTHEIGHT 16
#define DEF_FONTWIDTH   8

    LOCAL oCrt, nAppType := AppType()
    LOCAL aSizeDesktop, aPos
    LOCAL nBreite, nHoehe, nAbstand  // nAbstand für oberen Rand

    nHoehe := (DEF_ROWS * DEF_FONTHEIGHT)
    nBreite := (DEF_COLS * DEF_FONTWIDTH)
    nAbstand := 40
    DO CASE

    // Anwendung wurde im PM Modus gelinkt, eine XbpCrt Instanz
    // ist zu erzeugen.
        CASE nAppType == APPTYPE_PM

      // Bestimmen der Fensterposition (Anordnen in der Mitte
      // des Desktop-Fensters)
        aSizeDesktop    := AppDesktop():currentSize()

        aPos            := { (aSizeDesktop[1] - aSizeDesktop[1]) ,;
                             (aSizeDesktop[2] - (nHoehe+nAbstand))  }

      // XbpCRT-Fenster erzeugen
        oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
        oCrt:FontWidth  := DEF_FONTWIDTH
        oCrt:FontHeight := DEF_FONTHEIGHT
        oCrt:title      := AppName()
#ifdef __OS2__
        oCrt:FontName   := "System VIO"
#endif
#ifdef __WIN32__
        oCrt:FontName   := "Alaska Crt"
#endif
        oCrt:Create()

      // Presentation Space initialisieren
        oCrt:PresSpace()

      // XbpCrt wird aktives Fenster und Ausgabeger„t
        SetAppWindow ( oCrt )

    // Anwendung wurde im VIO oder NOVIO Modus gelinkt, eine RootCrt
    // Instanz ist zu erzeugen.
        CASE nAppType == APPTYPE_VIO .OR. nAppType == APPTYPE_NOVIO

      // RootCrt Instanz erzeugen.
      //
      // Die IVar :CreateBuffer bestimmt wie sich das RootCrt verhaelt
      // wenn es in einem Shell Fenster erzeugt wird.
      //
      //   :CreateBuffer == .T. : Das RootCrt wird einen eigenen Bildschirm
      //                          Puffer erzeugen der dann fuer die Darstellung
      //                          verwendet wird. Dies hat zur Folge das
      //                          Ausgaben mit OutStd() nicht mit anderen
      //                          Text Ausgaben (z.B: Qout(), Dispbox() gemischt
      //                          werden koennen.
      //   :CreateBuffer == .F. : Es wird kein eigener Bildschirm Puffer erzeugt
      //                          und der des Shell Fensters verwendet. OutStd()
      //                          Ausgaben werden nun gleichzeitig dargestellt.
        oCrt := RootCrt():New()
        oCrt:CreateBuffer := .T.
        oCrt:Create()

      // RootCrt wird aktives Fenster und Ausgabeger„t.
        SetAppWindow ( oCrt )

    ENDCASE

RETURN

PROCEDURE Main
    LOCAL oBtn1, oBtn2, nEvent, mp1, mp2, oXbp

    SetColor("N/W")                  // fill window with pale gray
    CLS

    ? AppDesktop():currentSize()

    oBtn1 := XbpPushButton():new(,, {10,20}, {200,40} )
    oBtn1:caption  := " Daten ins Netz übertragen "
    oBtn1:activate := {|| oBtn1:Disable(),oBtn2:Disable(),PostAppEvent( xbeP_Quit ) }
    oBtn1:create()
    oBtn1:show()

    oBtn2 := XbpPushButton():new(,, {400,20}, {200,40} )
    oBtn2:caption  := " Daten nicht übertragen "
    oBtn2:activate := {|| oBtn1:Disable(),oBtn2:Disable(),PostAppEvent( xbeP_Quit )  }
    oBtn2:create()
    oBtn2:show()

    SetMouse( .T. )                  // activate mouse events
    nEvent := xbe_None

    DO WHILE nEvent <> xbeP_Quit
        nEvent := AppEvent( @mp1, @mp2, @oXbp, 0 )

        oXbp:handleEvent( nEvent, mp1, mp2 )
    ENDDO
    QUIT
RETURN
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

UND RECHT VIELEN DANK AN ALLE !!!
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Fenster oben links

Beitrag von AUGE_OHR »

hi Bruno,

ich habe noch mal in meinen Hybrid Sachen geschaut und das für Position 0,0 gefunden

Code: Alles auswählen

   oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS, ,"My CRT",.F. )
   ...
   oCrt:Create()
   ...
   oCrt:setPos({0,aSizeDesktop[2]-oCrt:currentSize()[2]} )
   oCrt:Show()
du stellst nach dem Create() die Gösse fest und positionierst ihn dann auf 0,0
gruss by OHR
Jimmy
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14653
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von Jan »

Jimmy,

das ist jetzt die Antwort auf welche Frage, die hier nicht gestellt wurde?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Fenster oben links

Beitrag von AUGE_OHR »

hi,
Jan hat geschrieben: Di, 25. Apr 2023 7:37 das ist jetzt die Antwort auf welche Frage, die hier nicht gestellt wurde?
"Fenster oben links" lautet die Überschrift für diesen Thread

Bruno hat dazu auch CODE veröffentlicht, bitte LESEN :!:

was bruno bislang mit

Code: Alles auswählen

    nAbstand := 40
gelöst hatte scheint nicht für verschiedene DPI Auflösungen zu funktioniert.

ich hatte es versucht mit

Code: Alles auswählen

   GetSystemMetrics( SM_CYCAPTION )
aber auch das funktioniert nicht richtig

der "alte" CODE den ich gefunden habe macht nun das was Bruno möchte, egal mit welcher DPI Auflösung
gruss by OHR
Jimmy
Benutzeravatar
Bruno
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 103
Registriert: So, 16. Apr 2023 23:11
Wohnort: Lauterbach
Hat sich bedankt: 30 Mal
Danksagung erhalten: 4 Mal

Re: Fenster oben links

Beitrag von Bruno »

AUGE_OHR hat geschrieben: Di, 25. Apr 2023 7:35 hi Bruno,

ich habe noch mal in meinen Hybrid Sachen geschaut und das für Position 0,0 gefunden

Code: Alles auswählen

   oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS, ,"My CRT",.F. )
   ...
   oCrt:Create()
   ...
   oCrt:setPos({0,aSizeDesktop[2]-oCrt:currentSize()[2]} )
   oCrt:Show()
du stellst nach dem Create() die Gösse fest und positionierst ihn dann auf 0,0
Danke, das ist es, was ich meinte mit Formel ! Wichtig auch der Hinweis nach create() !

Zusatzfrage da Thread im Forum als erledigt, XbpPushputton:caption mehrzeilig. War damals nicht dabei.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fenster oben links

Beitrag von brandelh »

Bruno hat geschrieben: Mo, 24. Apr 2023 21:33
brandelh hat geschrieben: Mo, 24. Apr 2023 15:43 nPosS := 0 und nPosY := (nDesktopHoehe-nHoehe) wäre dann linke obere Ecke
Hallo Hubert,
die Formel welche Du so schön angeführt hast ergibt 0,0 ! Ich will nicht kritisieren !
Wenn du dich nicht auf meinen Tippfehler nPosS statt nPosX beziehst, kann es nur daran liegen, dass in der AppSys die Funktion
// XbpCrt wird aktives Fenster und Ausgabegerät
SetAppWindow ( oCrt )
nicht richtig gesetzt wurde.
Meine Funktion stammt aus meinem CRT Grundbausteinkasten und hat viele Jahre gute Dienste geleistet (zum Zentrieren des jeweils aktiven Fensters).

Die von Jimmy ist im Prinzip nichts anderes und erfüllt ihren Zweck
Gruß
Hubert
Antworten