In den Prozeduren gibt es keine normalen Variablen mehr. Nur noch eine einzige Struktur. Zugegeben teilweise etwas übertrieben, aber es ist möglich wie man sieht.
Dieses Beispiel zeigt, wie man mit einer Struktur arbeiten kann. Werte austauschen, Übergabe und Gebrauch von With EndWith.
Besonders einfach ist es dadurch, Prozeduren in Include Dateien zu schieben.
Code: Alles auswählen
;Imagegadget als Buttonleiste, gesteuert über eine Struktur
;16.03.2008 hjbremer Windows XP mit oder ohne XP-SKIN PB 4.1
Declare myImageButton(*i)
Declare myImageButtonSection(*i)
Declare myImageButtonState(*i)
Declare myImageButtonFarbverlaufV(*i)
Structure myimgbuttondata
window.l ;wenn OpenWindow <> 0 dann muß definiert werden !!!
pbnr.l ;ButtonNr des Imagegadget
anz.l ;Anzahl Button pro Imagegadget
sp.l ;Startspalte der Buttonleiste
ze.l ;Startzeile
br.l ;Gesamtbreite der Buttonleiste
hh.l ;Höhe
text.s[11] ;die Buttonleiste mit den meisten Buttons/Sectionen, deren Anzahl muß hier stehen + 1
;also z.B. 2 Leisten, eine mit 3, eine mit 5 Buttons, dann muß hier mindestens eine 6 stehen
;optional
start.l ;welcher Button/Section am Anfang gedrückt
icon1.l ;Icon normal
icon2.l ;Icon gedrückt
fontid.l ;TextFont = FontID()
frame1.l ;EDGE_BUMP EDGE_ETCHED EDGE_RAISED EDGE_SUNKEN
frame2.l ;EDGE_BUMP EDGE_ETCHED EDGE_RAISED EDGE_SUNKEN
farbeN1.l ;HintergrundFarbe normal
farbeN2.l ;HintergrundFarbe normal
farbeNT.l ;Textfarbe normal
farbeH1.l ;HintergrundFarbe gedrückt
farbeH2.l ;HintergrundFarbe gedrückt
farbeHT.l ;Textfarbe gedrückt
noframe.l ;1 für keine Rahmen
noverlauf.l ;1 für keinen Farbverlauf
;interne Variablen
dc.l
id.l
iconsize.l ;intern auf 16 festgelegt
iconzeile.l
iconspalte.l
iconpixel.l
section_sp.l
section_br.l
section_hh.l
section_nr.l
section_alt.l
section_icon.l
section_frame.l
section_farbe1.l
section_farbe2.l
section_farbeT.l
rect.rect
vertex0.TRIVERTEX ;Reihenfolge nicht ändern !
vertex1.TRIVERTEX
gradient.GRADIENT_RECT
EndStructure
Procedure myImageButton(*i.myimgbuttondata)
With *i
;Vorgaben
If \fontid = 0
\fontid = GetStockObject_(#ANSI_VAR_FONT)
EndIf
If \farbeN1 = 0: \farbeN1 = #White : EndIf
If \farbeN2 = 0: \farbeN2 = #Gray : EndIf
If \farbeNT = 0: \farbeNT = #Black : EndIf
If \farbeH1 = 0: \farbeH1 = #Yellow: EndIf
If \farbeH2 = 0: \farbeH2 = #Black : EndIf
If \farbeHT = 0: \farbeHT = #White : EndIf
If \frame1 = 0: \frame1 = #EDGE_RAISED: EndIf
If \frame2 = 0: \frame2 = #EDGE_SUNKEN: EndIf
;Breite anpassen per Modulo Operator
If \br % \anz
\br - (\br % \anz)
EndIf
;interne Variablen Werte
\section_br = \br / \anz
\section_hh = \hh
If \icon1
\iconsize = 16 ;Icongröße
\iconspalte = 4 ;Abstand Icon links
\iconzeile = (\hh - \iconsize) / 2 ;
\iconpixel = \iconspalte + \iconsize + 5 ;um diesen Wert verringert sich der Platz für den Text
If \icon2 = 0: \icon2 = \icon1: EndIf
EndIf
;Definition
\id = CreateImage(\pbnr,\br,\hh)
\dc = StartDrawing(ImageOutput(\pbnr))
\section_icon = \icon1
\section_frame = \frame1
\section_farbe1 = \farbeN1
\section_farbe2 = \farbeN2
\section_farbeT = \farbeNT
\section_nr = 0 ;section beginnt bei null
Repeat
myImageButtonSection(*i)
\section_nr + 1
Until \section_nr = \anz
If \start
\section_nr = \start-1 ;section beginnt bei null; StartVorgabe ab 1, darum 1 abziehen
\section_alt = \start-1
\section_icon = \icon2
\section_frame = \frame2
\section_farbe1 = \farbeH1
\section_farbe2 = \farbeH2
\section_farbeT = \farbeHT
myImageButtonSection(*i)
EndIf
StopDrawing()
ImageGadget(\pbnr,\sp,\ze,0,0,\id,#PB_Image_Border)
EndWith
EndProcedure
Procedure myImageButtonSection(*i.myimgbuttondata)
;Hinweis: 1.Section hat hier die Nummer 0
;
;Hinweis: das DC kommt von myImageButton, wie auch fast alle anderen Werte
With *i
;jeweilige Startspalte einer Section ist
\section_sp = \section_nr * \section_br
;Hintergrund
If \noverlauf
Box(\section_sp, 0, \section_br, \section_hh, \section_farbe1)
Else
myImageButtonFarbverlaufV(*i)
EndIf
;Rahmen
If \noframe
Else
;sp,ze,br,hh
SetRect_(\rect, \section_sp, 0, \section_sp + \section_br, \section_hh)
DrawEdge_(\dc, \rect, \section_frame, #BF_RECT)
EndIf
;Icon
If \section_icon
DrawImage(\section_icon, \section_sp + \iconspalte, \iconzeile, \iconsize, \iconsize)
EndIf
;Textfont
SelectObject_(\dc,\fontid)
;Textmode + Farbe
SetBkMode_(\dc, #TRANSPARENT)
SetTextColor_(\dc, \section_farbeT)
;Vorgaben für gedachten TextRahmen r.rect
SetTextAlign_(\dc, #TA_TOP) ;ohne geht es nicht
SetRect_(\rect, 0, 0, \section_br-\iconpixel, \hh) ;left,top,right,bottom = sp,ze,br,hh
;berechne via Api die Größe von r.rect für den Text !!!
DrawText_(\dc, \text[\section_nr], -1, \rect, #DT_CALCRECT|#DT_WORDBREAK)
;zeichne Text
OffsetRect_(\rect, \section_sp + ((\section_br - \rect\right)/2), (\hh - \rect\bottom)/2)
DrawText_(\dc, \text[\section_nr], -1, \rect, #DT_CENTER|#DT_WORDBREAK)
EndWith
EndProcedure
Procedure myImageButtonState(*i.myimgbuttondata)
With *i
;es folgt Farbe wechseln
\dc = StartDrawing(ImageOutput(\pbnr))
;1. vorherige Section zurücksetzen
\section_nr = \section_alt
\section_icon = \icon1
\section_frame = \frame1
\section_farbe1 = \farbeN1
\section_farbe2 = \farbeN2
\section_farbeT = \farbeNT
myImageButtonSection(*i)
;2. wo wurde im ImageGadget gedrückt
\section_nr = 0
Repeat
If WindowMouseX(\window) < (\section_br * \section_nr) + \sp
Break
EndIf
\section_nr + 1
Until \section_nr = \anz
;3. Section hervorheben
\section_nr - 1 ;section in myImageButtonSection(*i) beginnt bei null
\section_icon = \icon2
\section_frame = \frame2
\section_farbe1 = \farbeH1
\section_farbe2 = \farbeH2
\section_farbeT = \farbeHT
myImageButtonSection(*i)
\section_alt = \section_nr
StopDrawing()
SetGadgetState(\pbnr,\id)
ProcedureReturn \section_nr + 1 ;oben abgezogene 1 wieder addieren,
;damit man ein Ergebnis zwischen 1 und Anzahl Buttons erhält
EndWith
EndProcedure
Procedure myImageButtonFarbverlaufV(*i.myimgbuttondata)
;http://msdn2.microsoft.com/en-us/library/ms532338(VS.85).aspx
;vertex0 + vertex1 = 2 Blöcke hintereinander und diese 2 steht bei Gradientfill_
With *i
;UpperLeft = oben links vom Viereck
\vertex0\x = \section_sp
\vertex0\y = 0
\vertex0\Red = Red(\section_farbe1) <<8
\vertex0\Green = Green(\section_farbe1)<<8
\vertex0\Blue = Blue(\section_farbe1) <<8
;LowerRight = unten rechts
\vertex1\x = \section_sp + \section_br
\vertex1\y = \section_hh
\vertex1\Red = Red(\section_farbe2) <<8
\vertex1\Green = Green(\section_farbe2)<<8
\vertex1\Blue = Blue(\section_farbe2) <<8
\gradient\UpperLeft = 0 ;an diesen Werten nicht rumspielen
\gradient\LowerRight = 1 ;sonst Memory Fehler
Gradientfill_(\dc, \vertex0, 2, \gradient, 1, #GRADIENT_FILL_RECT_V)
EndWith
EndProcedure
;DEMO==========================================================
Enumeration
#button1
#button2
EndEnumeration
#winbreite = 700
#winhoehe = 300
flag = #PB_Window_SystemMenu|1|#PB_Window_Invisible
hwnd = OpenWindow(0,0,0,#winbreite,#winhoehe,"Test",flag)
CreateGadgetList(hwnd)
With mybuttondata1.myimgbuttondata
\pbnr=#button1
\anz=5
\sp=10
\ze=10
\br=#winbreite-20
\hh=40
\start=2
\text[0]="Hallo Basic Programmierer"
\text[1]="Hallo2"
\text[2]="Hallo3"
\text[3]="Hallo4"
\text[4]="Hallo5"
EndWith
myImageButton(mybuttondata1)
With mybuttondata2.myimgbuttondata
\pbnr=#button2
\anz=3
\sp=40
\ze=90
\br=300
\hh=32
\farbeN1=#White
\farbeN2=#Green
\farbeH1=#White
\farbeH2=#Yellow
\farbeNT=$BB1122
\farbeHT=$105DF6
\icon1=ExtractIcon_(0,"shell32.dll",140)
\icon2=ExtractIcon_(0,"shell32.dll",141)
\text[0]="Hallo du Progger du"
\text[1]="mehr Hallo"
\text[2]="nur Hallo"
EndWith
myImageButton(mybuttondata2)
HideWindow(0,0)
Repeat: event = WaitWindowEvent()
If Event = #PB_Event_Gadget Or Event = #PB_Event_Menu
welcherButton=EventGadget()
Select welcherButton
Case #button1
Select myImageButtonState(mybuttondata1)
Case 1: Debug 1
Case 2: Debug 2
Case 3: Debug 3
Case 4: Debug 4
Case 5: Debug 5
EndSelect
Case #button2
wb = myImageButtonState(mybuttondata2)
Select wb
Case 1: Debug wb
Case 2: Debug wb
Case 3: Debug wb
EndSelect
EndSelect
EndIf
Until event = #PB_Event_CloseWindow
End