fensterinhalt
-
- Beiträge: 173
- Registriert: 30.11.2010 02:34
fensterinhalt
hallo leute,
hab hier im forum jetzt viel nachgelesen aber keine wirkliche antwort für mein anliegen finden können.
hier meine zwei fragen:
1)
ich möchte den hintergrund eines fensters durch eine farbe wie WEIß ohne API und ohne ImageGadget ändern.
Ohne API, damit der ganze übel auch unter mac und lin funktioniert.
2)
ich verwendete imagegadgets als Elemente, die ich auf dem Fenster hin und her mit der maus verschieben kann.
ich habe mir damit etwas ausgeholfen, das ich mittels DesktopMouseX und DesktopMouseY, WindowsX, WindowsY,
sowie GadgetX und GadgetY einiges zusammengebraut habe, womit ich dann ein Gadget beim anklicken, genau an der
Stelle, wo ich das Gadget angeklickt habe, hin und her moven kann.
Das Problem hier ist, das die WindowsX und WindowY nicht den Clientbereich des Fensters angeben, sondern die
absoluten X/Y Werte des Fensters mit Rändern und Titelleistenbereich. Dadurch muss ich am Code zusätzliche
Werte wie die Höhe des Titelbereichs und des linken Randabschnitts miteinkalkulieren, damit das Erfassen eines
Gadgets korrekt gelinkt. Das dumme nur dabei ist, das diese Werte sich je nach Desktop-Theme und natürlich
Betriebssystem stark ändern kann und damit der erwünschte Koordinatenberechnung nichts mehr nützt.
Welche Ansätze gebe es, dieses Problem korrekt zu lösen?
Nochmals: Wichtig ist mir, das den Clientbereich des Fensters korrekt erfasse, damit ich die absolute Mausposition
innerhalb des Klientbereichs ausrechnen kann, die ich dann dazu verwende, um den Gadget korrekt zu erfassen und
zu bewegen.
Mit freundlichen Grüßen
kurt
hab hier im forum jetzt viel nachgelesen aber keine wirkliche antwort für mein anliegen finden können.
hier meine zwei fragen:
1)
ich möchte den hintergrund eines fensters durch eine farbe wie WEIß ohne API und ohne ImageGadget ändern.
Ohne API, damit der ganze übel auch unter mac und lin funktioniert.
2)
ich verwendete imagegadgets als Elemente, die ich auf dem Fenster hin und her mit der maus verschieben kann.
ich habe mir damit etwas ausgeholfen, das ich mittels DesktopMouseX und DesktopMouseY, WindowsX, WindowsY,
sowie GadgetX und GadgetY einiges zusammengebraut habe, womit ich dann ein Gadget beim anklicken, genau an der
Stelle, wo ich das Gadget angeklickt habe, hin und her moven kann.
Das Problem hier ist, das die WindowsX und WindowY nicht den Clientbereich des Fensters angeben, sondern die
absoluten X/Y Werte des Fensters mit Rändern und Titelleistenbereich. Dadurch muss ich am Code zusätzliche
Werte wie die Höhe des Titelbereichs und des linken Randabschnitts miteinkalkulieren, damit das Erfassen eines
Gadgets korrekt gelinkt. Das dumme nur dabei ist, das diese Werte sich je nach Desktop-Theme und natürlich
Betriebssystem stark ändern kann und damit der erwünschte Koordinatenberechnung nichts mehr nützt.
Welche Ansätze gebe es, dieses Problem korrekt zu lösen?
Nochmals: Wichtig ist mir, das den Clientbereich des Fensters korrekt erfasse, damit ich die absolute Mausposition
innerhalb des Klientbereichs ausrechnen kann, die ich dann dazu verwende, um den Gadget korrekt zu erfassen und
zu bewegen.
Mit freundlichen Grüßen
kurt
-
- Beiträge: 173
- Registriert: 30.11.2010 02:34
Re: fensterinhalt
ok das mit dem hintergrundfarbe war echt dumm. habe gelöst. 

-
- Beiträge: 173
- Registriert: 30.11.2010 02:34
Re: fensterinhalt
habs gelöst, trotzdem danke an alle. 

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: fensterinhalt
Wenn Du uns dann auch noch einweihen würdest, wie Du das ohne API gelöst hast,delikanli_19_82 hat geschrieben:habs gelöst, trotzdem danke an alle.
wäre es schon nett

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: fensterinhalt
Hab sein Post auch erst gelesen als er's schon selber gelöst hatte.ts-soft hat geschrieben:Wenn Du uns dann auch noch einweihen würdest, wie Du das ohne API gelöst hast,
wäre es schon nett
Aber ich tippe mal:
zu 1) SetWindowColor(#Window, Farbe) ; <- Ändert die Hintergrundfarbe des angegebenen Fensters '#Window'
zu 2) Beim Klick-Event auf's Gadget die Mausposition zwischenspeichern
- dann das Gadget um soviel Pixel verschieben, wie sich die aktuelle Maus-Position von der Klick-Position unterscheidet (also relative Mausbewegung)
- das ganze so lange, bis die Maustaste wieder losgelassen wird.
(Zumindest wäre das mein Vorschlag gewesen, wenn er's nicht schon selber gelöst gehabt hätte.

[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
-
- Beiträge: 173
- Registriert: 30.11.2010 02:34
Re: fensterinhalt
hallo leute,
also das mit der hintergrundfarbe einfach mit setwindowcolor. ich hab wohl dieses befehl irgenwie übersehen.
das mit dem radbox sieht schonmal abgespeckt so aus:
; DrawFile liefert die Datei, das die Zeichendaten enthält
; Für jeden Controltyp ist es eine andere.
Die Prozedur AddObject ließt Zeichnungsdaten aus zusätzliche definierten Template-Dateien. Es gibt dann noch einen Parser der hier eingebaut ist und die Daten einließt. Die bekannten Befehle wie Box, Line und Co werden dann entsprechend eingesetzt um die Elemente zu zeichnen. Auch die Positions und Flächendaten werden so eingelesen.
Ich hoffe, ich konnte euch damit etwas inspiration geben. Vielen dank für eure interesse.
mfg
kurt
also das mit der hintergrundfarbe einfach mit setwindowcolor. ich hab wohl dieses befehl irgenwie übersehen.
das mit dem radbox sieht schonmal abgespeckt so aus:
; DrawFile liefert die Datei, das die Zeichendaten enthält
; Für jeden Controltyp ist es eine andere.
Code: Alles auswählen
Global LObject.l = 0
Procedure AddObject()
If CreateImage(LObject, 50, 40) And StartDrawing(ImageOutput(LObject))
; ...
StopDrawing()
ImageGadget(LObject, 0, 0, 50, 40, ImageID(LObject))
EndIf
LObject = LObject + 1
EndProcedure
ctrl_id.l = -1
ctrl_mv.b = 0
If OpenWindow(0, 0, 0, 500, 400, "Formular", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget )
SetWindowColor(0,RGB(255,255,255))
AddWindowTimer(0, 10, 11)
x.l = 0;
y.l = 0;
gx.l = 35;
gy.l = 35;
AddObject()
AddObject()
AddObject()
AddObject()
Repeat
Event = WindowEvent()
If Event = #PB_Event_Timer And EventTimer() = 10
x = WindowMouseX(0)
y = WindowMouseY(0)
If ctrl_id > -1
ResizeGadget(ctrl_id,x-gx,y-gy,50,40)
EndIf
EndIf
If Event = #PB_Event_Gadget
If ctrl_mv = 0
ctrl_mv = 1
If ctrl_id = -1
x = DesktopMouseX()-WindowX(0)
y = DesktopMouseY()-WindowY(0)
gx = WindowMouseX(0)-GadgetX(EventGadget())
gy = WindowMouseY(0)-GadgetY(EventGadget())
ctrl_id = EventGadget()
Else
ctrl_id = -1
EndIf
ElseIf ctrl_mv = 1
ctrl_mv = 0
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Ich hoffe, ich konnte euch damit etwas inspiration geben. Vielen dank für eure interesse.
mfg

kurt
-
- Beiträge: 173
- Registriert: 30.11.2010 02:34
Re: fensterinhalt
hallo PureLust,
deine Idee zu Punkt zwei wahr auch mein anliegen. ist es eigentlich immer noch. Aber wenn ich auf die detailierte Mausereignisse reagieren muss, so muss ich wieder die win-api usen und damit wäre die cross-plattform-fähigkeit verloren.
möglicherweise hat purebasic auch an diesen ecken nützliche mittel. ich habe leider keine gefunden. wenn du dazu tipps hast, wäre ich ebenfalls sehr dankbar.
also in meiner lösung ist es so, das wenn man auf ein element geklickt hat so kann man ihn einfach hin und her bewegen. um ihn an der gewünschten stelle abzulegen muss man nochmal klicken. ich bin mit dieser lösung wie gesagt auch nicht ganz zufrieden, aber bis sich da crossplattform was ergibt oder ich die entsprechenden lösungswege finde, werde ich es anpassen.
falls du dazu schon helfen kannst, wäre echt nett
mfg
kurt
deine Idee zu Punkt zwei wahr auch mein anliegen. ist es eigentlich immer noch. Aber wenn ich auf die detailierte Mausereignisse reagieren muss, so muss ich wieder die win-api usen und damit wäre die cross-plattform-fähigkeit verloren.
möglicherweise hat purebasic auch an diesen ecken nützliche mittel. ich habe leider keine gefunden. wenn du dazu tipps hast, wäre ich ebenfalls sehr dankbar.
also in meiner lösung ist es so, das wenn man auf ein element geklickt hat so kann man ihn einfach hin und her bewegen. um ihn an der gewünschten stelle abzulegen muss man nochmal klicken. ich bin mit dieser lösung wie gesagt auch nicht ganz zufrieden, aber bis sich da crossplattform was ergibt oder ich die entsprechenden lösungswege finde, werde ich es anpassen.
falls du dazu schon helfen kannst, wäre echt nett

mfg
kurt
- PureLust
- Beiträge: 1145
- Registriert: 21.07.2005 00:02
- Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
- Wohnort: am schönen Niederrhein
Re: fensterinhalt
Naja, nachdem ich mir nochmal die nativen Möglichkeiten von PureBasic genauer angeschaut und voller Entsetzen festgestellt habe, dass man hierüber noch nicht mal den Status der Maustasten bzw. einen Event für eine Mausbewegung abfragen kann, hat sich das mit dem einfachen "Drag" per anklicken und ziehen leider erledigt.delikanli_19_82 hat geschrieben:falls du dazu schon helfen kannst, wäre echt nett
Ich bin halt inzwischen so sehr an die Benutzung der API gewöhnt, dass ich schon ganz vergessen habe wie sehr eingeschränkt man mit PB selber ist.

Mal kurz was zu Deinen (in meinen Augen sehr ritterlichen) Ambitionen, Deine Programme crossplattformtauglich zu entwickeln:
Die (trügerische) Aussage in der PureBasic-Beschreibung, dass man mit PB plattformunabhängige Applikationen entwickeln kann, war für mich damals der Hauptgrund, mich FÜR PureBasic und gegen eine der vielen anderen Sprachen zu entscheiden (da ich damals halt auch solch "ritterliche" Ambitionen hatte).
Leider hat sich schnell raus gestellt, dass es mit PB-Bordmittel nicht möglich ist, eine auch nur halbwegs vernünftige (heutigen Maßstäben entsprechende) Applikation ohne die zusätzliche Nutzung der API zu entwickeln.
Somit musst Du Dich also früher oder später mal entscheiden, ob Du Deinem ritterlichen Vorhaben (OS unabhängige Programme zu erstellen) treu bleiben willst - diese dafür dann ggfl. in Optik und Funktion sehr eingeschränkt sind - oder aber Du Dich durch Zuhilfenahme der API mehr oder weniger auf ein OS fixierst.
Meine Entscheidung viel irgendwann (schweren Herzens) dann FÜR die Zuhilfenahme der API und somit zu Gunsten besserer Bedienbarkeit und Funktionalität meiner Programme.
Du solltest es Dir also vielleicht wirklich nochmal überlegen ob Du unter allen Umständen OS unabhängige Programme mit PB machen willst, bei denen Du komplett auf die API verzichtest.
Wie Du ja bereits an Deinem hier beschriebenen Anliegen (welches im Grunde ja wirklich noch sehr simpel ist) sehen kannst, sind Deine Möglichkeiten, eine halbwegs komfortable Applikation mit PB-Bordmitteln zu erstellen, EXTREM beschränkt.
Könntest Du mit solchen Programmen (die dann halt in keinster Weise heutigen Maßstäben gerecht würden) wirklich leben?

Nun ja ... nu' aber genug abgeschweift.

Hier mal mein kleiner Vorschlag für Dein Problem:
Code: Alles auswählen
EnableExplicit
#DragableObject = 87348 ; irgendeine Zahl, die dazu benutzt wird, um ein Gadget als "verschiebbar" zu markieren.
#MainWindow = 0
#DragGadgetTimer = 0
Procedure AddObject()
Static LObject = 0
If CreateImage(LObject, 50, 40) And StartDrawing(ImageOutput(LObject))
; ...
StopDrawing()
ImageGadget(LObject, 0, 0, 50, 40, ImageID(LObject))
SetGadgetData(LObject, #DragableObject) ; Diesem Gadget eine "Markierung" hinzufügen, dass es verschiebbar ist.
EndIf
LObject = LObject + 1
EndProcedure
If OpenWindow(#MainWindow, 0, 0, 500, 400, "Formular", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget )
SetWindowColor(0,RGB(255,255,255))
Define Event, ActGadget
Define MouseDownX , MouseDownY
Define GadgetXPos , GadgetYPos
Define Dragging = #False
Define DragGadget
AddObject()
AddObject()
AddObject()
AddObject()
Repeat
Event = WindowEvent()
Select Event
Case #PB_Event_Gadget
ActGadget = EventGadget()
If Dragging ; es wird zur Zeit ein Gadget verschoben
Dragging = #False
RemoveWindowTimer(#MainWindow, #DragGadgetTimer)
Else ; z.Zt. wird kein Gadget verschoben
If GetGadgetData(ActGadget) = #DragableObject ; überprüfen ob das angeklickte Gadget als verschiebbar "markiert" wurde
DragGadget = ActGadget
GadgetXPos = GadgetX(ActGadget)
GadgetYPos = GadgetY(ActGadget)
MouseDownX = DesktopMouseX()
MouseDownY = DesktopMouseY()
Dragging = #True
AddWindowTimer(#MainWindow, #DragGadgetTimer, 20) ; Timer-Event aktivieren, in dem dann alle 20ms das Gadget verschoben wird
EndIf
EndIf
Case #PB_Event_Timer
Select EventTimer()
Case #DragGadgetTimer ; Timer-Event, hier wird das aktuelle Gadget verschoben
ResizeGadget(DragGadget, GadgetXPos + DesktopMouseX() - MouseDownX, GadgetYPos + DesktopMouseY() - MouseDownY, #PB_Ignore, #PB_Ignore)
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
Ich weiss nicht, ob das absichtlich so gewollt war - ich fand es auf jeden fall etwas "gewöhnungsbedürftig".
Deshalb habe ich es im obigen Beispiel momentan so umgesetzt, dass Du durch einen Klick verschieben und durch einen weiteren Klick "loslassen" kannst.
Falls das nicht das war was Du wolltest, sag nochmal Bescheid.
(Und wenn Du wie gesagt ein Programm schreiben möchtest, dass sich dann so "anfühlt" und bedienen lässt wie man es normalerweise gewohnt ist, dann überlege Dir nochmal, vielleicht doch auf die API zurückzugreifen - auch, wenn Deine Programme dann ggfl. nur auf einem OS laufen - dafür aber "anständig".

Schöne Grüße, PL.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
-
- Beiträge: 173
- Registriert: 30.11.2010 02:34
Re: fensterinhalt
hi PureLust,
dein Ansatz finde ich sehr gut. das wollte ich auch erreichen. Vielen dank.
Du hast schon recht mit den Bordmitteln von PureBasic.
Ich habe mir aber überlegt, so eine DLL für Win und SharedLib für Lin/Mac in C zusammenflicken, die einige API funktionen wrapped, damit dieserlei probleme zumindest teilweise gelöst werden.
ich verwende auch nicht für alle meine projekte purebasic. damit habe ich erst neulich angefangen. ich finde nur, das einige kleinere sachen und vor allem programme, die sehr schnell laufen müssen, in pb gecodet werden könnten. aus meiner sicht. ich bastelle meine programme meist aus mehreren executables zusammen, so ist es ok, wenn der eine oder andere executable in pb programmiert wird.
bei dem vorhaben mit der wrapper-lib habe ich derzeit kaum ahnung von der mac-api und auch bei linux bin ich mir nicht sicher, welche schnittstellen am besten sind. und win wäre es kein problem. aber wenn ich schon sonne lib code, dann eben so das es für alle läuft. bin noch am recherchieren.
was der lib in meinen gedanken so alles haben soll, sind grob erstmal diese dinge:
- mausereignisse auf einem Fenster selbst und auf gadgets: down, up, over, out, move, dblclick
- ein fenster in immer in vordergrund eines anderen (haupt)fensters zu halten, aber dabei die bedienung beider fenster sicherzustellen. Also quai das was in Visual Basic möglich war mit Form2.Show 0,Form1 etc.
- ist der fenter, über dem sich der mauszeiger befindet, der aktive fenster?
- eine fenster-resizing-limit
- eine möglichkeit sowas wie MDI nachzubauen, in dem ein Hauptfenster definiert wird und weitere fenster innerhalb seiner X,Y,W,H eingegrenzt werden oder sowas in der art.
was mir noch sehr fählt sind klassen. die lösungen die es dazu für pb gibt beschränken sich überwiegend auf windows. und damit bin ich halt nicht einverstanden.
dein Ansatz finde ich sehr gut. das wollte ich auch erreichen. Vielen dank.
Du hast schon recht mit den Bordmitteln von PureBasic.
Ich habe mir aber überlegt, so eine DLL für Win und SharedLib für Lin/Mac in C zusammenflicken, die einige API funktionen wrapped, damit dieserlei probleme zumindest teilweise gelöst werden.
ich verwende auch nicht für alle meine projekte purebasic. damit habe ich erst neulich angefangen. ich finde nur, das einige kleinere sachen und vor allem programme, die sehr schnell laufen müssen, in pb gecodet werden könnten. aus meiner sicht. ich bastelle meine programme meist aus mehreren executables zusammen, so ist es ok, wenn der eine oder andere executable in pb programmiert wird.
bei dem vorhaben mit der wrapper-lib habe ich derzeit kaum ahnung von der mac-api und auch bei linux bin ich mir nicht sicher, welche schnittstellen am besten sind. und win wäre es kein problem. aber wenn ich schon sonne lib code, dann eben so das es für alle läuft. bin noch am recherchieren.
was der lib in meinen gedanken so alles haben soll, sind grob erstmal diese dinge:
- mausereignisse auf einem Fenster selbst und auf gadgets: down, up, over, out, move, dblclick
- ein fenster in immer in vordergrund eines anderen (haupt)fensters zu halten, aber dabei die bedienung beider fenster sicherzustellen. Also quai das was in Visual Basic möglich war mit Form2.Show 0,Form1 etc.
- ist der fenter, über dem sich der mauszeiger befindet, der aktive fenster?
- eine fenster-resizing-limit
- eine möglichkeit sowas wie MDI nachzubauen, in dem ein Hauptfenster definiert wird und weitere fenster innerhalb seiner X,Y,W,H eingegrenzt werden oder sowas in der art.
was mir noch sehr fählt sind klassen. die lösungen die es dazu für pb gibt beschränken sich überwiegend auf windows. und damit bin ich halt nicht einverstanden.