Fenster oben links [erledigt] Danke an alle!
Moderator: Moderatoren
- Bruno
- 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!
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
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
Xbase++ 1.9.355 ohne eExpress
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Fenster oben links
Moin,
wenn Du bei Deinem Main Dialog das einträgst
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
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.)
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Bruno
- 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
Moin Jan,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.)
Danke, zählt das auch für Crt Fenster?
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Fenster oben links
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Bruno
- 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
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
Xbase++ 1.9.355 ohne eExpress
- Bruno
- 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
In der Original Appsys Procedure wird das Fenster immer zentriert, ich wollte das in meinem kleinen Programm ändern auf oben links.
Die Appsys wird doch auch bei XbpDialog benutzt, ODER ???
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
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Fenster oben links
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Fenster oben links
Weshalb man Code wie diesen verbaut, wenn man das nicht möchte:Die Appsys wird IMMER aufgerufen, egal was für ein Typ Dein Programm ist.
Code: Alles auswählen
PROC AppSys() ; RETURN
Herzlich,
Tom
Tom
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Fenster oben links
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
da gibt es keine Methoden zum "manipulieren"
wenn du mit /PM:PM compilierst wird
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
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()
wenn du mit /PM:PM compilierst wird
Code: Alles auswählen
oCrt := XbpCrt():New ( NIL, NIL, aPos, DEF_ROWS, DEF_COLS )
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
Jimmy
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Fenster oben links
Jimmy,
wie Du oben lesen kannst HAT Bruno schon eine eigene AppSys zusammen gestellt und eingebunden.
Jan
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Bruno
- 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
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 : 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 )
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 : 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 )
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- Bruno
- 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
Hi Jimmy danke, ich benutze seit Anfang an immer PM ( Hybrid ), Die Fenstergröße ist auch kein Problem,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
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
Xbase++ 1.9.355 ohne eExpress
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Fenster oben links
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:
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.
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
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
Hubert
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: Fenster oben links
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
Wie das genau geht, ist hier erklärt:
https://www.xbaseforum.de/viewtopic.php ... oA#p115204
Herzlich,
Tom
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Fenster oben links
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.
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
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Fenster oben links
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
Hubert
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Fenster oben links
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
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Fenster oben links
hi Hubert,
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
p.s. so kann man dann auch die Maus im XbpCRT() Fenster nutzen
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() }
Code: Alles auswählen
SETMOUSE( .T. )
oCrt:mouseMode := XBPCRT_MOUSEMODE_VIO
gruss by OHR
Jimmy
Jimmy
- Bruno
- 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
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 !!!
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
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
Xbase++ 1.9.355 ohne eExpress
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Fenster oben links
hi Bruno,
ich habe noch mal in meinen Hybrid Sachen geschaut und das für Position 0,0 gefunden
du stellst nach dem Create() die Gösse fest und positionierst ihn dann auf 0,0
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()
gruss by OHR
Jimmy
Jimmy
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Fenster oben links
Jimmy,
das ist jetzt die Antwort auf welche Frage, die hier nicht gestellt wurde?
Jan
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.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Fenster oben links
hi,
Bruno hat dazu auch CODE veröffentlicht, bitte LESEN
was bruno bislang mit
gelöst hatte scheint nicht für verschiedene DPI Auflösungen zu funktioniert.
ich hatte es versucht mit
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
"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
ich hatte es versucht mit
Code: Alles auswählen
GetSystemMetrics( SM_CYCAPTION )
der "alte" CODE den ich gefunden habe macht nun das was Bruno möchte, egal mit welcher DPI Auflösung
gruss by OHR
Jimmy
Jimmy
- Bruno
- 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
Danke, das ist es, was ich meinte mit Formel ! Wichtig auch der Hinweis nach create() !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
du stellst nach dem Create() die Gösse fest und positionierst ihn dann auf 0,0Code: 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()
Zusatzfrage da Thread im Forum als erledigt, XbpPushputton:caption mehrzeilig. War damals nicht dabei.
Gruss Bruno
Xbase++ 1.9.355 ohne eExpress
Xbase++ 1.9.355 ohne eExpress
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: Fenster oben links
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
Hubert