 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 04.07.2011, 12:47 Titel: |
|
|
isiprimax hat Folgendes geschrieben: | Würde das über das WinZ machen, damit du die reihenfolge hat in der die Labels geschrieben werden. |
Wie meinst du das? WinZ ist nicht die Reihenfolge, in der die Labels geschrieben werden. |
|
Nach oben |
|
 |
isiprimax
Anmeldungsdatum: 02.01.2009 Beiträge: 77
|
Verfasst am: 04.07.2011, 13:13 Titel: |
|
|
Na du brachst ja eine reihenfolge in der die labels geschrieben werden sollen. Zur zeit zeichnet er die fenster dann die labels, auch wenn da ein fenster drüber ist.
edit: oder du machst in deine for schleife eine abfrage ob auf dem window ein label ist und läst es dann mitzeichnen. Statt 2 schleifen zu machen. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 04.07.2011, 13:16 Titel: |
|
|
Die Reihenfolge in der die Labels gezeichnet werden ist LabZ.  |
|
Nach oben |
|
 |
XOR
Anmeldungsdatum: 23.07.2010 Beiträge: 161
|
Verfasst am: 05.07.2011, 00:29 Titel: |
|
|
Du solltest die Label auf den fenstern aufbauen.
wenn man also ein fenster zeichnet dann zeichnest du auch die label und die anderen sachen fuer das window, danach dann das naechste window.
dabei ist es einfacher mit linkedlists zu arbeiten und nicht mit arrays.
weil mir gerade langweilig war habe ich noch ein kleines beispiel geschriben |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 01:09 Titel: |
|
|
Sebastian hat Folgendes geschrieben: | XOR hat Folgendes geschrieben: | weil mir gerade langweilig war habe ich noch ein kleines beispiel geschriben |
Schick!  |
+1
Vorschlag:
Mach noch eine "MouseOver"-Callback rein, damit die Buttons ihr aussehen ändern können, wenn die Maus darüber wandert. Dazu noch die Fenster in der größe veränderlich und das FakeOS is fast fertig.
Wenn du keine lust hast, kommentier den Code mal bitte etwas, kam ad hoc nicht gut darin zurecht, deswegen hab ich die vorgeschlagenen Anderungen nicht selbst eingebaut  _________________ Milch ftw  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.07.2011, 11:43 Titel: |
|
|
Danke, obwohl ich mittlerweile eine andere(schlechtere, aber für mein Vorhaben eher geeignete) Lösung gefunden habe. Jedes Fenster ist bei mir nun ein Image und in dieses Image werden die Gadgets eingezeichnet. Ich nehme an, dass man das alles mit Linked Lists besser lösen kann, aber ich möchte nicht meinen kompletten Code (schon wieder) ändern, aber trotzdem Danke.  |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 13:10 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | Danke, obwohl ich mittlerweile eine andere(schlechtere, aber für mein Vorhaben eher geeignete) Lösung gefunden habe. Jedes Fenster ist bei mir nun ein Image und in dieses Image werden die Gadgets eingezeichnet. Ich nehme an, dass man das alles mit Linked Lists besser lösen kann, aber ich möchte nicht meinen kompletten Code (schon wieder) ändern, aber trotzdem Danke.  |
Verwerfen und neu machen ist wichtig für den Lernfaktor... zumindest meint das einer meiner Kollegen auf Arbeit.
Die idee mit dem Image-Buffer für den Fenster-Inhalt kam mir auch schon. Dann könnte man sogar ne Schnittstelle bauen um "Programme" per dll und Callback einzubinden damit die ihren Fenster-Inhalt an dein Projekt weitergeben können. _________________ Milch ftw  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.07.2011, 13:16 Titel: |
|
|
Milka hat Folgendes geschrieben: | Verwerfen und neu machen ist wichtig für den Lernfaktor... zumindest meint das einer meiner Kollegen auf Arbeit. |
Und was meinst du?
Milka hat Folgendes geschrieben: | Die idee mit dem Image-Buffer für den Fenster-Inhalt kam mir auch schon. Dann könnte man sogar ne Schnittstelle bauen um "Programme" per dll und Callback einzubinden damit die ihren Fenster-Inhalt an dein Projekt weitergeben können. |
Die Idee ist nicht schlecht, ich denke, ich darf sie dir klauen?
EDIT: Ich habe ein seltsames Problem mit der Sache, dass die Fenster in ein Image geschrieben werden. Ich kann die anderen Fenster zwar noch auswählen und verschieben, allerdings bliebt dieses Fenster immer hinter den anderen und es wird als ein inaktives Fenster gezeichnet:
Code: | #DEFINE Quit Inkey=Chr(255,107)
Dim Shared As Integer mx,my,mb,mxa,mya,mba,move_win,move_lab
Dim Shared As Integer anz_win,anz_lab
Type WizWindow
As Integer id
As Integer typ
As String title
As Integer active
As Integer x
As Integer y
As Integer w
As Integer h
As Any Ptr img,img2
End Type
Type Label
As String title
As Integer win
As Integer x
As Integer y
As Integer realx,realy
End Type
Dim Shared As WizWindow win(5000)
Dim Shared As UInteger winZ(5000)
Dim Shared As Label lab(5000)
Dim Shared As UInteger labZ(5000)
Declare Sub InitGUI()
Declare Sub DrawGadgets()
Declare Sub DrawWindow(id As Integer)
Declare Sub WinAdd()
Declare Sub WindowToTop(id As Integer)
Declare Sub DrawLabel(id As Integer)
Declare Sub LabADD()
Declare Sub LabelToTop(id As Integer)
Screenres 640,480,32
InitGUI()
Dim Shared anz_alloc As UInteger
Sub WinAdd()
if anz_win > anz_alloc then
anz_alloc += 25
'redim Preserve win(anz_alloc) as WizWindow
'redim Preserve winZ(anz_alloc) as UInteger
end if
anz_win+=1
winZ(anz_win) = anz_win
win(winZ(anz_win)).img=Imagecreate(win(winZ(anz_win)).w+4,win(winZ(anz_win)).h+4)
win(winZ(anz_win)).img2=Imagecreate(win(winZ(anz_win)).w+4,win(winZ(anz_win)).h+4)
End Sub
With win(1)
.id=1
.typ=1
.title="Testwindow"
.x=100
.y=50
.w=400
.h=300
End With
WinADD()
With lab(1)
.title="Ahoi :D"
.win=1
.x=100
.y=100
End With
LabADD()
With win(2)
.id=2
.typ=1
.title="Testwindow 2"
.x=120
.y=100
.w=400
.h=300
End With
WinADD()
Do
mxa = mx
mya = my
mba = mb
Getmouse mx,my,,mb
If mb = 0 Then'wenn die maus losgelassen wird ist wird kein fenster verschoben
move_win = 0
move_lab=0
End If
If mb = 1 And mba = 0 Then'wenn maus down dann schauen welches fenster angecklickt wurde
For i As Integer= anz_win To 1 Step -1
If (mx>win(winZ(i)).x And mx<win(winZ(i)).w+win(winZ(i)).x) And (my>win(winZ(i)).y And my<win(winZ(i)).h+win(winZ(i)).y) Then
If i < anz_win Then 'ist ganz sinvoll, um nicht jedes mal die liste zu durchlaufen, wenn das fenster sowieso schon am ende is.
WindowToTop (i)
End If
'einfach noch eine prüfung hinzu fügen (kann man natürlich optimieren)
'welche prüft, ob man auf das ""bar klickt.
If my<24+win(winZ(anz_win)).y Then
'wen dem so ist, dann:
'move
move_win = winZ(anz_win)
move_lab=labZ(anz_lab)
End If
Exit For 'exit danach
End If
Next
End If
'wenn move gesetzt, dann move es
If move_win <> 0 Then
'move variante ist SEHR unschön!!!
win(move_win).x += mx - mxa
win(move_win).y += my - mya
End If
If move_lab <> 0 Then
For i As Integer=1 To anz_lab
If lab(winZ(i)).win=win(winZ(i)).id Then lab(move_lab).realx+=mx-mxa
If lab(winZ(i)).win=win(winZ(i)).id Then lab(move_lab).realy+=my-mya
Next
End If
Sleep 10,1
ScreenLock
Cls
Line (0,0)-(640,480),&h376ea5,BF
DrawGadgets()
ScreenUnLock
Loop Until Quit
End
Sub InitGUI()
End Sub
Sub DrawGadgets()
For i As Integer=1 To anz_win
If win(winZ(i)).typ=1 Then DrawWindow(winZ(i))
Next
For i2 As Integer=1 To anz_lab
DrawLabel(i2)
Next
End Sub
Sub DrawWindow(id As Integer)
If id=winZ(anz_win) Then
Line win(winZ(id)).img, ( 0, 0+24)-(win(id).w ,win(id).h+ 0),&hFFFFFF,BF
Line win(winZ(id)).img, ( 0, 0)-(win(id).w+ 0, 0+23),&hDDDDDD,BF
Line win(winZ(id)).img, ( 0, 0)-(win(id).w+ 0,win(id).h+ 0),&h000000,B
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img,Trans
Else
Line win(winZ(id)).img2, ( 0, 0+24)-(win(id).w+ 0,win(id).h+ 0),&hC0C0C0,BF
Line win(winZ(id)).img2, ( 0, 0)-(win(id).w+ 0, 0+23),&hA0A0A0,BF
Line win(winZ(id)).img2, ( 0, 0)-(win(id).w+ 0,win(id).h+ 0),&h000000,B
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img2,Trans
End If
End Sub
Sub WindowToTop(id As Integer)
if id > anz_win then exit sub
Dim TWinID As Uinteger = winZ(id)
For X As Uinteger = id To anz_win -1
winZ(x) = winZ(x + 1)
Next
winZ(anz_win) = TWinID
End Sub
Sub DrawLabel(id As Integer)
If id=labZ(anz_lab) Then
Color &h000000
Draw String(lab(id).realx,lab(id).realy),lab(id).title
End If
End Sub
Sub LabADD()
anz_lab+=1
labZ(anz_lab) = anz_lab
With lab(anz_lab)
.realx=win(winZ(lab(anz_lab).win)).x+lab(anz_lab).x
.realy=win(winZ(lab(anz_lab).win)).y+lab(anz_lab).y
End With
End Sub
Sub LabelToTop(id As Integer)
If id > anz_lab Then Exit Sub
Dim TLabID As Uinteger = labZ(id)
For X As Uinteger = id To anz_lab -1
labZ(x) = labZ(x + 1)
Next
labZ(anz_lab) = TLabID
End Sub |
|
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 17:30 Titel: |
|
|
Code: | Sub DrawGadgets()
For i As Integer=1 To anz_win
If win(winZ(i)).typ=1 Then DrawWindow(i)
Next
For i2 As Integer=1 To anz_lab
DrawLabel(i2)
Next
End Sub |
Dann gehts.
Du hast DrawWindow die Interne Fenster-ID übergeben, nicht die Position im Array.
Nachtrag:
Ja, meine Idee darfst du gerne übernehmen.
Und das Nächte mal solche überlangen Codes bitte ins NoPaste
Noch ein Nachtrag:
Du solltest die Label in den Image-Buffer der Fenster malen, und danach die Fenster zeichnen, sonst kommt es zu Problemen (die Label sind nämlich aktuell immer im Vordergrund) _________________ Milch ftw  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.07.2011, 17:48 Titel: |
|
|
Danke
Aber das ändert leider "nur", dass das Fenster wieder in den Vordergrund geholt wird, allerdings bleibt es nach wie vor grau(inaktiv).
MilkFreeze hat Folgendes geschrieben: | Und das Nächte mal solche überlangen Codes bitte ins NoPaste  |
Tut mir Leid  |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 18:13 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | Danke
Aber das ändert leider "nur", dass das Fenster wieder in den Vordergrund geholt wird, allerdings bleibt es nach wie vor grau(inaktiv).
MilkFreeze hat Folgendes geschrieben: | Und das Nächte mal solche überlangen Codes bitte ins NoPaste  |
Tut mir Leid  |
Auch das lässt sich lösen:
Code: | Sub DrawWindow(id As Integer)
If id = anz_win Then
Line win(winZ(id)).img, ( 0, 0+24)-(win(id).w ,win(id).h+ 0),&hFFFFFF,BF
Line win(winZ(id)).img, ( 0, 0)-(win(id).w+ 0, 0+23),&hDDDDDD,BF
Line win(winZ(id)).img, ( 0, 0)-(win(id).w+ 0,win(id).h+ 0),&h000000,B
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img,TRANS
Else
Line win(winZ(id)).img2, ( 0, 0+24)-(win(id).w+ 0,win(id).h+ 0),&hC0C0C0,BF
Line win(winZ(id)).img2, ( 0, 0)-(win(id).w+ 0, 0+23),&hA0A0A0,BF
Line win(winZ(id)).img2, ( 0, 0)-(win(id).w+ 0,win(id).h+ 0),&h000000,B
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img2,Trans
End If
End Sub |
edit:
Ich hab mir mal die Freiheit genommen das ganze noch weiter aufzubohren:
http://www.freebasic-portal.de/porticula/westbeams-windowmanager-etwas-aufgebohrt-1287.html _________________ Milch ftw  |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 18:24 Titel: |
|
|
Noch eine sache:
Ich würde dir Empfehlen die Draw-methode in den UDT des Fensters zu legen, und dem Fenster noch eine Variable "ist_ganz_oben" (oder in der art) zu verpassen. Ich kann dir das gerne hinbiegen, wenn du magst. Sollte dann zu weniger Problemen kommen. _________________ Milch ftw  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.07.2011, 18:29 Titel: |
|
|
Hvorfor kan jeg ikke og alt det? GRR!
Warum könnt ihr das alle und ich nicht?
Danke btw.  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 05.07.2011, 18:59 Titel: |
|
|
MilkFreeze hat Folgendes geschrieben: | Die idee mit dem Image-Buffer für den Fenster-Inhalt kam mir auch schon. Dann könnte man sogar ne Schnittstelle bauen um "Programme" per dll und Callback einzubinden damit die ihren Fenster-Inhalt an dein Projekt weitergeben können. |
Re .... Da musste aber aufpassen, Das kann schnell zu massiven Problemen führen. Und zu noch grösseren, wenn du Threads nutzt. Hab da schon so einiges mti erlebt, und is echt n gewaltakt, das halbwegs zum laufen zu bringen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 19:03 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | Hvorfor kan jeg ikke og alt det? GRR!
Warum könnt ihr das alle und ich nicht?
Danke btw.  |
Erfahrung
ThePuppetMaster hat Folgendes geschrieben: | MilkFreeze hat Folgendes geschrieben: | Die idee mit dem Image-Buffer für den Fenster-Inhalt kam mir auch schon. Dann könnte man sogar ne Schnittstelle bauen um "Programme" per dll und Callback einzubinden damit die ihren Fenster-Inhalt an dein Projekt weitergeben können. |
Re .... Da musste aber aufpassen, Das kann schnell zu massiven Problemen führen. Und zu noch grösseren, wenn du Threads nutzt. Hab da schon so einiges mti erlebt, und is echt n gewaltakt, das halbwegs zum laufen zu bringen.
MfG
TPM |
Musst du mir nicht erzählen. Multithreading mit DLLs und Grafik ist wahrlich ein Akt. Mutexe und Conds helfen aber. Nur muss man wissen was man tut (und vorallem warum und wie). _________________ Milch ftw  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.07.2011, 19:04 Titel: |
|
|
TPM hat Folgendes geschrieben: | Da musste aber aufpassen, Das kann schnell zu massiven Problemen führen. Und zu noch grösseren, wenn du Threads nutzt. Hab da schon so einiges mti erlebt, und is echt n gewaltakt, das halbwegs zum laufen zu bringen. |
Ich nutze keine Threads, also kann es nur zu massiven Problemen und nicht zu größeren kommen.
Es läuft bei mir super gut und es verbraucht weder sonderlich viel Speicher noch ist es überraschend CPU belastend. Was für Probleme können da auftauchen? |
|
Nach oben |
|
 |
MilkFreeze

Anmeldungsdatum: 22.04.2011 Beiträge: 116
|
Verfasst am: 05.07.2011, 19:20 Titel: |
|
|
Westbeam hat Folgendes geschrieben: | TPM hat Folgendes geschrieben: | Da musste aber aufpassen, Das kann schnell zu massiven Problemen führen. Und zu noch grösseren, wenn du Threads nutzt. Hab da schon so einiges mti erlebt, und is echt n gewaltakt, das halbwegs zum laufen zu bringen. |
Ich nutze keine Threads, also kann es nur zu massiven Problemen und nicht zu größeren kommen.
Es läuft bei mir super gut und es verbraucht weder sonderlich viel Speicher noch ist es überraschend CPU belastend. Was für Probleme können da auftauchen? |
Er meint im Bezug auf "Fensterinhalt kommt aus einer DLL". Ja, das kann tatsächlich Probleme machen.
Edith sagt ich solle dir das hier mal zeigen:
http://www.freebasic-portal.de/porticula/nochmal-aufgebohrt-1288.html
Ich rate die übrigens davon ab winZ() weiter zu benutzen. Das verwirrt sicher nicht nur mich. Wenn du meinen Code nimsmt, kanns du auf eine Umsortierung im Array verzichten, da nun das active-flag des WizWindow-Types genutzt wird. Das PUT innerhalb der Draw-Funktion habe ich entfernt, und lasse das nun DrawGadget machen. _________________ Milch ftw 
Zuletzt bearbeitet von MilkFreeze am 05.07.2011, 19:23, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 05.07.2011, 19:22 Titel: |
|
|
Probleme bezeiehn sich hier darauf, weil input, inkey, getmouse, usw. nicht Multithreading fähig sind. Daher kann es zu crash's, hang's, usw. kommen. Aber nur im multithreading betrieb. DLL's machen das ganez noch komplizierter, da hier Mutexe noch weitergegeben werden müssen. Zusätzlich kann durch die problematische interprozesskommunikation es zu weiteren problemen kommen.
Es ist sehr kritisch, wenn man versucht eingaben (getmouse, inkey, und co.) und ausgaben (grafik) zu threaden, und das ganze dann noch mit prozessübergreifende DLL aufrufe zu verknoten.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 05.07.2011, 19:36 Titel: |
|
|
Ein Glück bin ich Linuxnutzer und brauche keine DLLs ... aber ich nehme an, dass trifft auch auf .so zu?
@MilkFreeze
Öhm ja, cooler Code. Aber die einzige Änderung ist doch, dass die Sub "DrawWindow" nun als "Draw" im UDT funtkioniert? Oder sehe ich etwas falsch? Und wer ist Edith?  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|