Design des Dialoges

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
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

Beitrag von andreas »

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.).
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
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

Beitrag von AUGE_OHR »

andreas 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.
wüsste ich auch gerne. ich denke mal man müsste irgendwie
"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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

man müsste ein unsichtbares Fenster erstellen, in das man dann eine bmp grafik als Hintergrundbild holt, mit transparenten Farbteilen ...

aber wie das geht :?:
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

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:

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 )
Hat ein kleines bißchen Overhead, arbeitet aber.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

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.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
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:

Beitrag von Tom »

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. 8)
Herzlich,
Tom
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Leute,

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
Das Programm kommt zum Fehler in der Zeile

Code: Alles auswählen

hRgn = CreatePolygonRgn({{50,30},{300,60},{300,140},{50,200}}, 4, ALTERNATE)
mit der Meldung:

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
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Martin,

wie kann ich den so ein Zeiger unter XBase erstellen?
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

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
:grommit:
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.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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.
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Leute,

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. )
Leider funktioniert die Farneinstellung dafür nicht mehr.
bei einfachen Variablen (z.b. VAR) reicht es, diese mit @VAR zu übergeben, denn eine Übergabe per Referenz übergibt den Pointer (Zeiger).
Funktioniert leider nicht.
Wahrscheinlich wirst Du sogar BAP nutzen müssen, da dieser Zeiger auf ein STRUCT zeigt und dieses so unter Xbase++ nicht existiert.
Entweder bin ich zu blöd oder es funktioniert nicht. Ich bekomme die gleiche Fehlermeldung.
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Mit BAP habe ich erstmal so weit gekriegt, dass keine Fehlermeldung kommt.
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. )
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Mit dem richtigen Einbinden von BAP funktioniert es.
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()
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

Code: Alles auswählen

gn := CreatePolygonRgn( cPoints , 3, WINDING)
Du hast in der Eile vergessen, den 2. Parameter zu erhöhen.
Zur Zeit 3 Elemente.
Gruß
Hubert
Benutzeravatar
andreas
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Hat sich bedankt: 4 Mal
Kontaktdaten:

Beitrag von andreas »

Hallo Hubert,
Du hast in der Eile vergessen, den 2. Parameter zu erhöhen
du hast damit recht. Ich habe es gerade rausgefunden und wollte es hierein schreiben. Du warst schneller.

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
Gruß,

Andreas
VIP der XUG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Andreas,

danke für die Einweisung in BAP, DLL und die zerhackten Fenster. :thumbleft:

Die API werde ich sicher bald brauchen und die zerhackten Fenster sind ein super GAG für den 1. April :joker:
Gruß
Hubert
Antworten