Design des Dialoges
Moderator: Moderatoren
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Design des Dialoges
Hallo Leute,
weisst jemand, ob es eine Möglichkeit gibt, die Form des Dialog-Fensters nach eigenen Vorstellungen zu ändern, so wie es bei den modernen Anwendungen ist. Z.B. aus einem Rechteck eine Trapez zu machen oder noch irgendwie ganz wild zu gestalten.
Ich habe ein Programm, dass die Arbeit des Funkscanners mit unserem Server-Programm simuliert, um z.B. die Datenerfassung am PC zu ermöglichen, ohne den Scanner in die Hand zu nehmen.
Das Fenster dieses Emulators hätte ich gern im Aussehen des Scanners gehabt, das aber aber an der Bedienerfreundlichkeit nicht leiden darf ( Verschieben usw.).
weisst jemand, ob es eine Möglichkeit gibt, die Form des Dialog-Fensters nach eigenen Vorstellungen zu ändern, so wie es bei den modernen Anwendungen ist. Z.B. aus einem Rechteck eine Trapez zu machen oder noch irgendwie ganz wild zu gestalten.
Ich habe ein Programm, dass die Arbeit des Funkscanners mit unserem Server-Programm simuliert, um z.B. die Datenerfassung am PC zu ermöglichen, ohne den Scanner in die Hand zu nehmen.
Das Fenster dieses Emulators hätte ich gern im Aussehen des Scanners gehabt, das aber aber an der Bedienerfreundlichkeit nicht leiden darf ( Verschieben usw.).
- AUGE_OHR
- Marvin
- Beiträge: 12903
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 44 Mal
Re: Design des Dialoges
wüsste ich auch gerne. ich denke mal man müsste irgendwieandreas hat geschrieben:Hallo Leute,
weisst jemand, ob es eine Möglichkeit gibt, die Form des Dialog-Fensters nach eigenen Vorstellungen zu ändern, so wie es bei den modernen Anwendungen ist. Z.B. aus einem Rechteck eine Trapez zu machen oder noch irgendwie ganz wild zu gestalten.
"transparent" einsetzten um XBPart zu "verstecken".
Das Problem wo ich aufgehört habe war der Titlebar mit den
Buttons ... wohin damit ?
gruss by OHR
Jimmy
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Es gibt diverse Möglichkeiten. Eine ganz einfache ist diese hier:
Ein nicht sichtbarer, randloser Dialog wird erzeugt, auf diesem liegt eine Bitmap, die die gewünschten Eigenschaften hat (z.B. ein Trapez). Die Fläche um das Trapez herum ist einfarbig, und zwar in einer Farbe, die in der restlichen Bitmap nicht vorkommt. Als Hintergrundfarbe des Dialogs wird die Transparenz gesetzt. Als Transparenzfarbe für die Bitmap wird die "Außenfarbe" gewählt. Dialog anzeigen - und schwups: Es ist ausschließlich das Trapez zu sehen. Und das kann natürlich als Parent für alles mögliche dienen. Bzw. die Drawingarea dahinter. Funzt ganz wunderbar. Hier ist ein Beispiel:
Hat ein kleines bißchen Overhead, arbeitet aber.
Ein nicht sichtbarer, randloser Dialog wird erzeugt, auf diesem liegt eine Bitmap, die die gewünschten Eigenschaften hat (z.B. ein Trapez). Die Fläche um das Trapez herum ist einfarbig, und zwar in einer Farbe, die in der restlichen Bitmap nicht vorkommt. Als Hintergrundfarbe des Dialogs wird die Transparenz gesetzt. Als Transparenzfarbe für die Bitmap wird die "Außenfarbe" gewählt. Dialog anzeigen - und schwups: Es ist ausschließlich das Trapez zu sehen. Und das kann natürlich als Parent für alles mögliche dienen. Bzw. die Drawingarea dahinter. Funzt ganz wunderbar. Hier ist ein Beispiel:
Code: Alles auswählen
oLDialog := XbpDialog():new( AppDesktop(),,,{936,514} )
oLDialog:taskList := .F.
oLDialog:visible := .F.
oLDialog:title := "Nur für den Task-Manager"
oLDialog:border := XBPDLG_NO_BORDER
oLDialog:close := {|mp1,mp2,obj| obj:destroy() }
oLDialog:titlebar := .F.
oLDialog:create()
oLPS := XbpPresSpace():new():create( oLDialog:drawingArea:winDevice() )
oImage := XbpBitmap():new():create( oLPS )
oImage:load(,MEINE_HINTERGRUNDBITMAP)
oImage:transparentClr := GraMakeRGBColor({255,255,0}) // Gelb
nBGClr := XBPSYSCLR_TRANSPARENT
oLDialog:drawingarea:paint := {|x,y,obj| x:=obj:currentSize(), ;
oImage:draw( oLPS, {0, 0, x[1], x[2]}, ;
{0, 0, oImage:xSize, oImage:ySize},,;
)}
oLDialog:drawingArea:SetColorBG( nBGClr )
aPos:= CenterPos( oLDialog:currentSize(), AppDesktop():currentSize() )
aPos[2] := aPos[2]
oLDialog:setPos( aPos )
oLDialog:show()
oImage:draw( oLPS )
SetAppFocus( oLDialog )
Herzlich,
Tom
Tom
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Tom,
die Lösung an sich ist ja nicht schlecht (und ich will sie jetzt auch nicht madig machen!!), aber das ganze ist natürlich nur rudimentär!
Man müßte nämlich auch noch dafür Sorge tragen, das Mausklicks in den nicht sichtbaren Bereich entsprechend an den Bereich, der dahinter liegt, durchgereicht werden!
Viele Grüße,
Martin
die Lösung an sich ist ja nicht schlecht (und ich will sie jetzt auch nicht madig machen!!), aber das ganze ist natürlich nur rudimentär!
Man müßte nämlich auch noch dafür Sorge tragen, das Mausklicks in den nicht sichtbaren Bereich entsprechend an den Bereich, der dahinter liegt, durchgereicht werden!
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Hallo, Martin.
Das ist auch hinzukriegen, irgendwie, und es gibt davon abgesehen auch noch eine andere Lösung. Wer eXPress++ hat und sich den Quellcode der sog. "STATIC BUTTONS" mal ansieht, wird feststellen, daß Roger sie von XbpDialogs abgeleitet hat - inclusive der Fähigkeit, ihnen "Shapes" zu verleihen, also über eine Vektorenmatrix die äußere Gestalt festzulegen. Diese Buttons, die eigentlich Dialoge sind, nehmen dann tatsächlich nur den Raum dieser "Shapes" ein. Es ist zwar ein bißchen fummelig, die entsprechenden Matrizen zu formulieren, aber auf diesem Weg ginge es auch.
Genutzt werden die Funktionen CreateRectRgn, CombineRgn und SetWindowRgn aus der GDI32.DLL. Wer ein bißchen bei MSDN stöbert, wird fündig werden. Diese Dialoge haben dann keine rechteckige Grundfläche mehr, sondern tatsächlich eine andere.
Das ist auch hinzukriegen, irgendwie, und es gibt davon abgesehen auch noch eine andere Lösung. Wer eXPress++ hat und sich den Quellcode der sog. "STATIC BUTTONS" mal ansieht, wird feststellen, daß Roger sie von XbpDialogs abgeleitet hat - inclusive der Fähigkeit, ihnen "Shapes" zu verleihen, also über eine Vektorenmatrix die äußere Gestalt festzulegen. Diese Buttons, die eigentlich Dialoge sind, nehmen dann tatsächlich nur den Raum dieser "Shapes" ein. Es ist zwar ein bißchen fummelig, die entsprechenden Matrizen zu formulieren, aber auf diesem Weg ginge es auch.
Genutzt werden die Funktionen CreateRectRgn, CombineRgn und SetWindowRgn aus der GDI32.DLL. Wer ein bißchen bei MSDN stöbert, wird fündig werden. Diese Dialoge haben dann keine rechteckige Grundfläche mehr, sondern tatsächlich eine andere.
Herzlich,
Tom
Tom
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9345
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 100 Mal
- Danksagung erhalten: 359 Mal
- Kontaktdaten:
Hier noch der MSDN-Link:
http://msdn.microsoft.com/library/defau ... w_2him.asp
Edit: Um zum Beispiel mit "CreatePolygonRgn" komplexe Polygonzüge zu erstellen, die sehr detaillierte Umrisse zulassen, ist einiges an Arbeit nötig. Da erscheint es mir einfacher, das vermeintliche "Fenster" mit einem Grafikprogramm zu basteln und zu riskieren, daß ein Klick in einen ausgesparten, aber eigentlich zum Fenster gehörigen Bereich, erfolglos bleibt. Aber das ist eine persönliche Einschätzung.
http://msdn.microsoft.com/library/defau ... w_2him.asp
Edit: Um zum Beispiel mit "CreatePolygonRgn" komplexe Polygonzüge zu erstellen, die sehr detaillierte Umrisse zulassen, ist einiges an Arbeit nötig. Da erscheint es mir einfacher, das vermeintliche "Fenster" mit einem Grafikprogramm zu basteln und zu riskieren, daß ein Klick in einen ausgesparten, aber eigentlich zum Fenster gehörigen Bereich, erfolglos bleibt. Aber das ist eine persönliche Einschätzung.
Herzlich,
Tom
Tom
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Leute,
wer kennt sich mit API aus.
Ich habe hier an einem Testfenster gebastellt, was aber nicht funktioniert.
Hier erstmal mein Code:
Das Programm kommt zum Fehler in der Zeile
mit der Meldung:
wer kennt sich mit API aus.
Ich habe hier an einem Testfenster gebastellt, was aber nicht funktioniert.
Hier erstmal mein Code:
Code: Alles auswählen
**Fenster-Polygon
// PolyFill-Modi - von Bedeutung erst bei komplizierteren Regions
#DEFINE ALTERNATE 1
#DEFINE WINDING 2
// Verknüpfungs-Modus für CombineRgn()
#DEFINE RGN_AND 1
// mögliche Rückgabewerte von CombineRgn()
#DEFINE ERRORAPI 0
#DEFINE NULLREGION 1
#DEFINE SIMPLEREGION 2
#DEFINE COMPLEXREGION 3
DLLFUNCTION DeleteObject( hObject ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CombineRgn( hDestRgn, hSrcRgn1, hSrcRgn2, nCombineMode ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CreatePolygonRgn( aPoints, nCount, nPolyFillMode ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION PaintRgn( hDc, hRgn ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CreateRectRgn( nX1, nY1, nX2, nY2 ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION OffsetRgn( hRgn, nX, nY ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION FillRgn( hDc, hRgn, hBr ) USING STDCALL FROM GDI32.DLL
FUNCTION TestWin()
local oDlg := XbpDialog():new( ,, {50,30}, {300,200} )
local hWnd , hRgn
oDlg:title := "Test - Window"
oDlg:create()
nHwnd := oDlg:GetHwnd()
hRgn = CreatePolygonRgn({{50,30},{300,60},{300,140},{50,200}}, 4, ALTERNATE)
PaintRgn( nHwnd, hRgn )
oDlg:show()
RETURN nil
Code: Alles auswählen
hRgn = CreatePolygonRgn({{50,30},{300,60},{300,140},{50,200}}, 4, ALTERNATE)
Code: Alles auswählen
oError:args :
-> VALTYPE: C VALUE: _DLL ïw+¢ïw ÝA
-> VALTYPE: A VALUE: {{50, 30}, {300, 60}, {300, 140}, {50, 200}}
-> VALTYPE: N VALUE: 4
-> VALTYPE: N VALUE: 1
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : dllExecuteCall
oError:osCode : 0
oError:severity : 2
oError:subCode : 1025
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Andreas,
sorry, aber mit API kenne ich mich nicht so aus.
Habe aber gesehen, dass Du das Array mit den Koordinaten nicht als Array übergeben darfst, sondern als Zeiger auf den Speicher des Arrays (also als Pointer). Das besagt das * vor der Variable.
Näheres hierzu unter dem msdn-link
Viele Grüße,
Martin
sorry, aber mit API kenne ich mich nicht so aus.
Habe aber gesehen, dass Du das Array mit den Koordinaten nicht als Array übergeben darfst, sondern als Zeiger auf den Speicher des Arrays (also als Pointer). Das besagt das * vor der Variable.
Näheres hierzu unter dem msdn-link
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- Martin Altmann
- Foren-Administrator
- Beiträge: 16502
- Registriert: Fr, 23. Sep 2005 4:58
- Wohnort: Berlin
- Hat sich bedankt: 111 Mal
- Danksagung erhalten: 48 Mal
- Kontaktdaten:
Hallo Andreas,
sorry, aber da wird Dir jemand anders helfen müssen!
Wahrscheinlich wirst Du sogar BAP nutzen müssen, da dieser Zeiger auf ein STRUCT zeigt und dieses so unter Xbase++ nicht existiert. Dafür gibt es z.B. BAP von Alaska, um dieses dann nachzubilden.
Viele Grüße,
Martin
sorry, aber da wird Dir jemand anders helfen müssen!
Wahrscheinlich wirst Du sogar BAP nutzen müssen, da dieser Zeiger auf ein STRUCT zeigt und dieses so unter Xbase++ nicht existiert. Dafür gibt es z.B. BAP von Alaska, um dieses dann nachzubilden.
Viele Grüße,
Martin
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/
Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
- brandelh
- Foren-Moderator
- Beiträge: 15688
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
bei einfachen Variablen (z.b. VAR) reicht es, diese mit @VAR zu übergeben, denn eine Übergabe per Referenz übergibt den Pointer (Zeiger). Ein Array ist im Prinzip eine Ansammlung von Pointern auf andere Variablen, eventuell sollte es also auch mit @ gehen.
Allerdings bin ich auch nicht der API Spezialist, insbesondere mit Xbase, dem ja selbst die Datentypen (long, dword etc.) fehlen.
Funktionen der Gruppe ?2BIN bzw. BIN2? erzeugen Strings, welche man als Ersatz von Strukturen nutzen kann. cLong = L2BIN(1234) sollte alse eine LONG Variable in cLong speichern. Wenn man diese mit @cLong übergibt, sollte das ein Pointer auf eine LONG bzw. DWORD sein. Diese Strings kann man hintereinander hängen .... cLong1 + cLong2 + cLong3 etc. das wäre dann eine Struktur mit 2 Longvars.
Gemacht habe ich sowas allerdings noch nicht.
bei einfachen Variablen (z.b. VAR) reicht es, diese mit @VAR zu übergeben, denn eine Übergabe per Referenz übergibt den Pointer (Zeiger). Ein Array ist im Prinzip eine Ansammlung von Pointern auf andere Variablen, eventuell sollte es also auch mit @ gehen.
Allerdings bin ich auch nicht der API Spezialist, insbesondere mit Xbase, dem ja selbst die Datentypen (long, dword etc.) fehlen.
Funktionen der Gruppe ?2BIN bzw. BIN2? erzeugen Strings, welche man als Ersatz von Strukturen nutzen kann. cLong = L2BIN(1234) sollte alse eine LONG Variable in cLong speichern. Wenn man diese mit @cLong übergibt, sollte das ein Pointer auf eine LONG bzw. DWORD sein. Diese Strings kann man hintereinander hängen .... cLong1 + cLong2 + cLong3 etc. das wäre dann eine Struktur mit 2 Longvars.
Gemacht habe ich sowas allerdings noch nicht.
Gruß
Hubert
Hubert
- brandelh
- Foren-Moderator
- Beiträge: 15688
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
ich verbessere mich ...
L2BIN(n) -> LONG (long integer 32 Bit, 4 Byte +/- möglich)
U2BIN(n) -> DWORD (double word 32 Bit, 4 Byte nur ganze Zahlen)
die kleineren 16 Bit-Zahlen (i2bin und w2bin) kommen kaum noch vor.
Das Rechnen mit LONG ist schneller als mit Integer und daher Standard.
ich verbessere mich ...
L2BIN(n) -> LONG (long integer 32 Bit, 4 Byte +/- möglich)
U2BIN(n) -> DWORD (double word 32 Bit, 4 Byte nur ganze Zahlen)
die kleineren 16 Bit-Zahlen (i2bin und w2bin) kommen kaum noch vor.
Das Rechnen mit LONG ist schneller als mit Integer und daher Standard.
Gruß
Hubert
Hubert
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Leute,
die Funktion CreateEllipticRgn habe ich am laufen. Damit kann man z.B. das ganze Fenster oder Tasten rund machen.
Leider funktioniert die Farneinstellung dafür nicht mehr.
die Funktion CreateEllipticRgn habe ich am laufen. Damit kann man z.B. das ganze Fenster oder Tasten rund machen.
Code: Alles auswählen
oXbp := XbpPushButton():new( oDlg:drawingArea , , {20,20}, {40,40}, { { XBP_PP_BGCLR, GRA_CLR_DARKGREEN } } )
oXbp:caption := "Test"
oXbp:create()
oXbp:activate:= {|| msgbox( "Pushbutton B" ) }
hRgn := CreateEllipticRgn(0, 0, 40, 40)
hDc := oXbp:GetHwnd()
SetWindowRgn(hDc, hRgn, .t. )
Funktioniert leider nicht.bei einfachen Variablen (z.b. VAR) reicht es, diese mit @VAR zu übergeben, denn eine Übergabe per Referenz übergibt den Pointer (Zeiger).
Entweder bin ich zu blöd oder es funktioniert nicht. Ich bekomme die gleiche Fehlermeldung.Wahrscheinlich wirst Du sogar BAP nutzen müssen, da dieser Zeiger auf ein STRUCT zeigt und dieses so unter Xbase++ nicht existiert.
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Mit BAP habe ich erstmal so weit gekriegt, dass keine Fehlermeldung kommt.
Es sind aber keine Ergebnisse sichtbar.
Es sind aber keine Ergebnisse sichtbar.
Code: Alles auswählen
oDlg := XbpDialog():new( ,, {0,0}, {200,300} )
oDlg:title := "Test - Window"
oDlg:create()
hHwnd := oDlg:GetHwnd()
aBin := BaInit(2)
BaStruct( aBin, 0)
BaStruct( aBin, 0)
aBin1 := BaInit(2)
BaStruct( aBin1, 200)
BaStruct( aBin1, 150)
aBin2 := BaInit(2)
BaStruct( aBin2, 0)
BaStruct( aBin2, 300)
aBin3 := BaInit(3)
BaStruct( aBin3, aBin)
BaStruct( aBin3, aBin1)
BaStruct( aBin3, aBin2)
hRgn := CreatePolygonRgn( BaAccess( aBin3), 3, ALTERNATE)
SetWindowRgn(hHwnd, hRgn, .t. )
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Mit dem richtigen Einbinden von BAP funktioniert es.
Leider habe ich noch nicht rausgekriegt, wieso nur die ersten 3 Punkte genommen werden.
Leider habe ich noch nicht rausgekriegt, wieso nur die ersten 3 Punkte genommen werden.
Code: Alles auswählen
oDlg := XbpDialog():new( ,, {0,0}, {200,300} )
oDlg:title := "Test - Window"
oDlg:create()
hHwnd := oDlg:GetHwnd()
aBin := BaInit(2)
BaStruct( aBin, 0)
BaStruct( aBin, 30)
aBin1 := BaInit(2)
BaStruct( aBin1, 200)
BaStruct( aBin1, 0)
aBin2 := BaInit(2)
BaStruct( aBin2, 180)
BaStruct( aBin2, 40)
aBin3 := BaInit(2)
BaStruct( aBin3, 180)
BaStruct( aBin3, 260)
aBin4 := BaInit(2)
BaStruct( aBin4, 200)
BaStruct( aBin4, 300)
aBin5 := BaInit(2)
BaStruct( aBin5, 0)
BaStruct( aBin5, 270)
cPoints := BaAccess( aBin) + BaAccess( aBin1) + BaAccess( aBin2) + BaAccess( aBin3) + BaAccess( aBin4) + BaAccess( aBin5)
hRgn := CreatePolygonRgn( cPoints , 3, WINDING)
SetWindowRgn( hHwnd, hRgn, .t. )
oDlg:show()
- brandelh
- Foren-Moderator
- Beiträge: 15688
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 65 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo,
Du hast in der Eile vergessen, den 2. Parameter zu erhöhen.
Zur Zeit 3 Elemente.
Code: Alles auswählen
gn := CreatePolygonRgn( cPoints , 3, WINDING)
Zur Zeit 3 Elemente.
Gruß
Hubert
Hubert
- andreas
- Der Entwickler von "Deep Thought"
- Beiträge: 1902
- Registriert: Mi, 28. Sep 2005 10:53
- Wohnort: Osnabrück
- Hat sich bedankt: 4 Mal
- Kontaktdaten:
Hallo Hubert,
Hier ein vollständiger Code:
du hast damit recht. Ich habe es gerade rausgefunden und wollte es hierein schreiben. Du warst schneller.Du hast in der Eile vergessen, den 2. Parameter zu erhöhen
Hier ein vollständiger Code:
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"
#include "Font.ch"
#include "dll.ch"
**Fenster-Polygon
// PolyFill-Modi - von Bedeutung erst bei komplizierteren Regions
#DEFINE ALTERNATE 1
#DEFINE WINDING 2
// Verknüpfungs-Modus für CombineRgn()
#DEFINE RGN_AND 1
// mögliche Rückgabewerte von CombineRgn()
#DEFINE ERRORAPI 0
#DEFINE NULLREGION 1
#DEFINE SIMPLEREGION 2
#DEFINE COMPLEXREGION 3
#DEFINE BLACKBRUSH 4
DLLFUNCTION DeleteObject( hObject ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CombineRgn( hDestRgn, hSrcRgn1, hSrcRgn2, nCombineMode ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CreatePolygonRgn( aPoints, nCount, nPolyFillMode ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION PaintRgn( hDc, hRgn ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CreateRectRgn( nX1, nY1, nX2, nY2 ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION OffsetRgn( hRgn, nX, nY ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION FillRgn( hDc, hRgn, hBr ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION SetWindowRgn( hHwnd, hRgn, bRedraw ) USING STDCALL FROM USER32.DLL
DLLFUNCTION CreateRoundRectRgn( nLeftRect, nTopRect, nRightRect, nBottomRect, nWidthEllipse, nHeightEllipse ) USING STDCALL FROM GDI32.DLL
DLLFUNCTION CreateEllipticRgn( nLeftRect, nTopRect, nRightRect, nBottomRect ) USING STDCALL FROM GDI32.DLL
proc main()
local oDlg
local oXbp
local hHWnd , hRgn, hDc
oDlg := XbpDialog():new( ,, {0,0}, {200,300} )
oDlg:title := "Test - Window"
oDlg:create()
hHwnd := oDlg:GetHwnd()
aBin := BaInit(2)
BaStruct( aBin, 0)
BaStruct( aBin, 30)
aBin1 := BaInit(2)
BaStruct( aBin1, 200)
BaStruct( aBin1, 0)
aBin2 := BaInit(2)
BaStruct( aBin2, 180)
BaStruct( aBin2, 40)
aBin3 := BaInit(2)
BaStruct( aBin3, 180)
BaStruct( aBin3, 260)
aBin4 := BaInit(2)
BaStruct( aBin4, 200)
BaStruct( aBin4, 300)
aBin5 := BaInit(2)
BaStruct( aBin5, 0)
BaStruct( aBin5, 270)
cPoints := BaAccess( aBin) + BaAccess( aBin1) + BaAccess( aBin2) + BaAccess( aBin3) + BaAccess( aBin4) + BaAccess( aBin5)
hRgn := CreatePolygonRgn( cPoints , 6, ALTERNATE)
SetWindowRgn( hHwnd, hRgn, .t. )
oDlg:show()
nEvent := xbe_None
WHILE nEvent != xbeP_Close
nEvent := AppEvent ( @mp1, @mp2, @oXbp )
oXbp:HandleEvent ( nEvent, mp1, mp2 )
IF nEvent == xbeP_Quit
QUIT // AppQuit()
ENDIF
ENDDO
return