Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 28.07.2010, 15:17 Titel: |
|
|
Cherry hat Folgendes geschrieben: | - Es gibt eine neue Function fbWindow.Attach(hWnd), mit der ein bestehendes Window zu einem Screen umfunktioniert werden kann (das ist, was ich oben vorgeschlagen habe), dementsprechend wurde der Constructor um einen attachHWnd-Parameter erweitert. So kann man jetzt einfach mit FBEdit ein Static Control o.ä. in einen Dialog einbauen und es zu einem Screen machen. |
Das ist eine tolle Sache! Das Feature hätte ich bei einem Projekt vor einer Weile ganz gut gebrauchen können. Da habe ich umständlich mit WinAPI "gezeichnet", was auch relativ billig aussah. Die fbgfxlib ist da doch viel angenehmer.  _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 28.07.2010, 17:51 Titel: |
|
|
@Cherry: ABSOLUT KRASS
Ich hatte sowas ähnliches überlegt um mehrere Buffer-Fenster in einem MDI-Fenster unterzubringen!
Ich schätze, mit der attach-funktion wird genau das auch funktionieren!
Leider werd ich in den nächsten tagen und nächste woche nicht dazu kommen das genau auszuprobieren, aber, das ist schon absolut fantastisch!!!
Ich mag die fb-gfx-lib auch lieber! Da erscheint alles noch aus den QB-Zeiten so vertraut
Kennst du eine möglichkeit die Funktion DoEvents() in einen Thread zu packen?
So dass das fenster sich auch ohne expliziten aufruf der jeweiligen DoEvents-Funktion erneuert?
Bei mir stürzt das programm immer ab, sobald ich .DoEvents in einen Thread packe
Das mit dem NULL-Screen ist ne feine sache , die funktion, so wie du sie implementiert hast, hatte ich auch innem SDL-Projekt realisiert.
Einzig schade wäre, wenn man das "nur" für Windows so realisieren kann. Für Linux wär sowas auch klasse
Vielleicht mit GTK? Da hatte ich ja auch mal was mit versucht.. aber das is ziemlich instabil, wenn man dort die gtk_main() als Thread aufruft..
( http://forum.qbasic.at/viewtopic.php?t=7079 )
Zuletzt bearbeitet von OneCypher am 28.07.2010, 18:00, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 28.07.2010, 17:57 Titel: |
|
|
DoEvents ist eine Funktion innerhalb eines UDTs, da will das Threadstarten nicht ohne Weiteres.
Das Problem hab ich im EventSystem-Tutorial per Static gelöst (siehe Sub "eventSub" und Function "windowCreate").
Das könnte dir vielleicht weiterhelfen. |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 28.07.2010, 17:58 Titel: |
|
|
Probier mal: ThreadCreate(This.DoEvents, @This)
Dann natürlich einen Do Until QuitMessage...Loop rein und in den Destructor ein ThreadWait.
Äh, das hab ich eingebaut.
mfG Cherry
EDIT: Ah, da war doch was... wenn es wieder nicht funktioniert, kommt das afaik daher, dass die Messages threadspezifisch sind, das DoEvents also im selben Thread sein muss wie der call zu CreateWindowEx. Aber da bin ich mir jetzt nicht 100%ig sicher.
EDIT2: Eigentlich könnte man das RedrawWindow aus DoEvents rausnehmen, weil es durch meinen Timer auch gecallt wird (es wird jetzt also pro Frame 2x gecallt, was unnötig ist). Verwendet man Attach mit einem Childwindow, braucht und kann man DoEvents übrigens nicht verwenden! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 28.07.2010, 18:11 Titel: |
|
|
@Cherry: Sorry, habs gerade auch noch gesehen XD .. war da irgendwie verrutscht, sorry!!!! (habs auch korrigiert)
Die Ehre, gebührt natürlich dir
@MOD: Es ist eigentlich kein Problem eine Funktion eines UDT als Thread zu starte. Das geht natürlich nicht direkt sondern nur indirekt über eine static-funktion. z.B:
Code: |
type testtype
a as integer
b as integer
declare sub c()
end type
sub testtype.c()
print "lalalalalala"
end sub
sub c_thread(ttype as testtype ptr)
do
ttype->c()
loop
end sub
dim meinetype as testtype
var thread = threadcreate(cast(any ptr, @c_thread), @meinetype)
threadwait thread
|
Ich hab den code grade nicht getestet, aber so ungefähr kapselt man eine member-funktion einer klasse in einer "normalen" funktion.
@Cherry nochmal: Ja genau, sowas hab ich auch schon irgendwo inner MSDN gelesen. Was es leider nicht einfacher macht :-/ .. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 28.07.2010, 18:20 Titel: |
|
|
Nein, darum auch das [quote] rundherum: OneCypher hat geschrieben "@Sebastian: DAS IST ABSOLUT KRASS, etc. etc."  |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 29.07.2010, 12:13 Titel: |
|
|
@Cherry: Ich hab deine Änderungen jetzt mal ins Projekt übernommen. Hab mal alles kurz angetestet
Unter welche Lizenz stellt man diesen Quelltext am besten? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4702 Wohnort: ~/
|
Verfasst am: 29.07.2010, 13:23 Titel: |
|
|
Kommt drauf an, was du willst. Wenn du es möglichst frei handhaben willst, wäre wahrscheinlich LGPL ganz gut. MIT kenne ich nicht so gut, könnte auch in Frage kommen _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 29.07.2010, 13:55 Titel: |
|
|
Oder WTFPL, die ist ganz gut, wenn es WIRKLICH frei sein soll.  |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 29.07.2010, 13:56 Titel: |
|
|
Vielleicht hilft dir diese Zusammenstellung ja: http://www.osscc.net/en/licenses.html#compatibility
BSD ist toll.
Westbeam hat Folgendes geschrieben: | Oder WTFPL, die ist ganz gut, wenn es WIRKLICH frei sein soll.  |
Die ist nur "gut", wenn es dir wirklich vollkommen scheißegal ist, was andere Leute mit deinem Code machen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 29.07.2010, 13:58 Titel: |
|
|
Sag ich ja. WIRKLICH frei halt.  |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 29.07.2010, 20:51 Titel: |
|
|
OneCypher hat Folgendes geschrieben: | @Cherry: Ich hab deine Änderungen jetzt mal ins Projekt übernommen. Hab mal alles kurz angetestet
Unter welche Lizenz stellt man diesen Quelltext am besten? |
Danke
Mir fällt grade noch was ein: Du solltest noch die Möglichkeit einbauen, dass nicht im Constructor automatisch ein Screen erzeugt wird (außer man will es so). In meinem Beispiel hab ich das gelöst, indem ich New verwendet habe (und Delete vergessen, merk ich grade), aber angenehmer wäre es vllt anders. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 30.07.2010, 20:13 Titel: |
|
|
@Cherry: Ich denke, das er im Constructor automatisch einen Screen erzeugt, hast du schon 100% korrekt implementiert!
Denn ein GFX-Screen MUSS erzeugt "sein" bzw "werden", damit man überhaupt FB-Images mit ImageCreate korrekt anlegen und benutzen kann.
Bei meinen Versuchen stürzt jedes Programm ab sobald man Grafikbefehle auf einen Image-Buffer anwenden will bei dem KEIN GFX-Screen vorher erzeugt wurde.
Ich bin dann auch der Meinung, man sollte einen initialisierten Screen nicht mehr nachträglich deaktivieren..
Was genau macht:
Code: |
SetWindowLong(hWnd, GWL_WNDPROC, @WndProc)
|
?
Ich bin übrigens immer noch total überrascht wie verdammt GEIL die neue Wine-Version (1.2) funktioniert XXD .... ich brauch eigentlich nicht mehr Windows-Booten um Windows-Programme mit Freebasic zu programmieren XXD |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 30.07.2010, 21:05 Titel: |
|
|
Es ersetzt den Nachrichtenhandler.
btw. gehört zu gutem Code gehört an dieser Stelle auch, dass man den alten Handler beim Schließen des Fensters wieder einsetzt und darüber in Kenntniss setzt. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 30.07.2010, 21:54 Titel: |
|
|
@28398: Ich weiss leider jetzt nicht genau, was du damit meinst. Du darfst das aber gerne mal in das Projekt einbauen, damit ich mir das mal anschauen kann  |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 31.07.2010, 09:57 Titel: |
|
|
@OneCypher: ich meinte, dass fbWindow nicht sofort einen fbWindow-Screen erzeugen sollte.
@28938: Stimmt, nur wird die alte Prozedur hier nie mehr benötigt, weil das Platzhaltercontrol quasi für immer durch den fbWindow-Screen ersetzt werden soll. Aber du hast Recht, ich sollte vllt noch eine Detach-Funktion schreiben, und dann muss ich das natürlich speichern. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 31.07.2010, 13:21 Titel: |
|
|
@Cherry: Siehe Signatur.
Es ist immer gut möglich, dass ein Control beim Erstellen Speicher alloziert. Damit dieser korrekt freigegeben werden kann, muss der alte Handler bei WM_DESTROY wieder eingesetzt werden und ebenfalls eine WM_DESTROY-Nachricht bekommen. Es muss ja nicht unbedingt Speicher sein, Handles gibts ja auch noch.
@OneCypher:
Das ist nicht mehr das ganz einfache Win32-rumgeplänkel^^ |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 31.07.2010, 14:43 Titel: |
|
|
28398 hat Folgendes geschrieben: | @Cherry: Siehe Signatur.
Es ist immer gut möglich, dass ein Control beim Erstellen Speicher alloziert. Damit dieser korrekt freigegeben werden kann, muss der alte Handler bei WM_DESTROY wieder eingesetzt werden und ebenfalls eine WM_DESTROY-Nachricht bekommen. Es muss ja nicht unbedingt Speicher sein, Handles gibts ja auch noch. |
Ach soo, ich dachte, es ging nur ums Prinzip. Daran hab ich überhaupt nicht gedacht. Danke für die Info! |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 02.08.2010, 22:26 Titel: |
|
|
@cherry: Hm, also, ich hatte das schon so konzipiert, dass sich direkt ein fenster öffnen soll.
Denn das hat mehrer gründe:
einerseits wollte ich es für jeden "normalen" freebasic-programmierer ermöglichen mehrere GFX-Ausgabefenster zur verfügung zu stellen
und andererseits glaube ich das diese "attach" funktion eine plattformübergreifende programmierung nicht leichter macht!
auch wenn diese attach-funktion ziemlich faszinierend ist
ich hatte überlegt, die reopen-funktion in screenres() umzubennenen und eine neue namens screen() anzulegen.
so das eine solche screen-erstellung so nahe wie möglich an die GFX-lib-syntax angelehnt ist.
im nächsten schritt such ich mir die richtiigen api-funktionen für ein linux-X11-pendant zusammen und fange eine plattformübergreifende fbwindow-lib zu schreiben
Das soll dich natürlich an nichts hindern .. also ich würde es sehr begrüßen, wenn du noch ideen hättest die du hier implementieren könntest
PS: ich hab den quelltext für die fbwindow.bi aus seite 1 aktualisiert, da waren noch ein paar sachen drin, die nich so ganz funktioniert hatten..
über die funktion .Resized() kann man auslesen ob die größe eines screens durch den benutzer geändert wurde.
ein beispiel liefere ich noch dazu!
und bei mir hatte dein code immer ein fenster erzeugt dessen größe man nicht ändern kann. Die stelle hab ich ein bischen umformuliert.
konkret:
Code: |
if not resizable then ...
|
heisst jetzt
Code: |
if resizable = false then ...
|
es sollte eigentlich das selbe sein, ist es aber anscheinend nicht  |
|
Nach oben |
|
 |
|