Deutsch
SDK-Helfer/ Tools

ActionBox (bessere MessageBox)

 

Jens-Arne
Reumschüssel
Hallo zusammen,

Hier gibt es jetzt Code für eine sehr deutlich verbesserte MessageBox, die ich ActionBox genannt habe. Alles ist in reinem XProfan geschrieben.

ActionBoxen unterscheiden sich von MessageBoxen dadurch, dass
- beliebig viele Buttons mit frei gewählter Aufschrift möglich sind
- Text ab einer bestimmten Größe scrollbar ist
- Text- und Hintergrundfarbe frei bestimmt werden können
- die Schriftart frei gewählt werden kann
- zwei weitere Icons zur Verfügung stehen
- frei wählbare Buttons erst nach dem Scrollen ganz nach unten aktiviert werden können
- eine frei gewählte WAV-Datei als Sound benutzt werden kann
- eine selbst geschriebene PROC für den Hilfe-Button benutzt werden kann
- das alles, meine ich, sehr einfach zu handhaben ist

Hier der Code. Wenn man ihn ausführt, bekommt man eine Reihe von Beispielen angezeigt, die die Möglichkeiten verdeutlichen.

STRUCT S_ACTIONBOX=Caption$(256),Text$(10001),pText&,TextXSize&,TextMaxYSize&,TextColor&,BkColor&,AnzButtons&,ButtonTexts$(10000),DefButton&,ButtonXSize&,DeactivateButtonsTillLastLineSeen%,Icon&,Sound&,hFont&,HelpButton&,pHelpProc&,HelpProcParam&
STRUCT S_HELPINFO=cbSize&,iContextType&,iCtrlId&,hItemHandle&,dwContextId&,MousePosX&,MousePosY&
declare _XMessageBox_TextColor&,_XMessageBox_BkColor&,_XMessageBox_hFont&,_XMessageBox_pHelpProc&,_XMessageBox_HelpProcParam&
_XMessageBox_TextColor&=@rgb(0,0,0)
_XMessageBox_BkColor&=@rgb(255,255,255)
_XMessageBox_hFont&=0
_XMessageBox_pHelpProc&=0
_XMessageBox_HelpProcParam&=0

declare ab#,fn$,s$,i%

PROC ActionBox 'eigene MessageBox mit beliebigen Buttons, gescrolltem Text, beliebigen Farben und einem beliebigen Sound
'dim ab#,S_ACTIONBOX
'ab#.Caption$: Fensterüberschrift (kann weggelassen werden, dann ="Hinweis")
'ab#.Text$: Meldungstext mit maximal 10000 Zeichen (wird umgebrochen; Wörter, die länger als eine Zeile sind, werden aufgeteilt)
'ab#.pText&: Pointer zu einem String mit einem beliebig langen Meldungstext (wird genommen, wenn ab#.Text$="" und ab#.pText&<>0)
'ab#.TextXSize&: Breite des Textfeldes in Pixeln (kann weggelassen werden, dann =400)
'ab#.TextMaxYSize&: maximale Höhe des Textfeldes in Pixeln (kann weggelassen werden, dann =500), nach Erreichen der maximalen vertikalen Ausdehnung wird eine Scrollbar benutzt
'ab#.TextColor&: Textfarbe (kann weggelassen werden, dann schwarz)
'ab#.BkColor&: Hintergrundfarbe (kann weggelassen werden, dann weiß)
'ab#.AnzButtons&: Anzahl der Buttons (kann weggelassen werden, dann ein Ok-Button; wenn es gar keine Buttons geben soll, auf -1 setzen) - Ein Hilfe-Button (siehe weiter unten ab#.HelpButton&) wird nicht dazugezählt!
'ab#.ButtonTexts$: Buttonbeschriftungen, durch "|" getrennt - Den Text für einen eventuellen Hilfe-Button kann man als letzten Text optional mit angeben (sonst wird "Hilfe" benutzt)
'ab#.DefButton&: Nummer des Default-Buttons (kann weggelassen werden, dann der erste Button; wenn es keinen Default-Button geben soll, auf -1 setzen)
'ab#.ButtonXSize&: Breite der Buttons in Pixeln (kann weggelassen werden, dann =100 bzw. =75 bei Default-Ok-Button)
'ab#.DeactivateButtonsTillLastLineSeen%: hier können bitweise Buttons angegeben werden, die erst aktiviert werden, wenn der Text bis zur letzten Zeile gescrollt wurde (Button 1: 1, Button 2: 2, Button 3: 4, Button 4: 8 etc.)
'ab#.HelpButton&: 1=fügt einen Hilfe-Button hinzu (wenn dieser geklickt wird, wird eine ~WM_HELP-Message ans Hauptfenster gesendet, wobei mir unklar ist, wie man die auswerten kann, während die MessageBox das Programm blockiert - Abhilfe: siehe direkt hier drunter)
'ab#.pHelpProc: eine mit @ProcAddr(...) ermittelte Einsprungadresse zu einer Prozedur, die aufgerufen wird, wenn der Hilfebutton geklickt wird (diese PROC muss genau einen 4-Byte-Parameter haben)
'ab#.HelpProcParam&: ein benutzerdefinierter Parameter, der an die HelpProc übergeben wird
'ab#.Icon&: -1=kein Icon, 1=i, 2=?, 3=!, 4=X, 5=Security Shield, 6=Application Icon (kann weggelassen werden, dann =1 ohne Sound)
'ab#.Sound&: 1=Windows-Sound passend zum Icon, -1=kein Sound, 11-14=Sound wie bei Icon 1X, 15=Beep, >15=Pointer zu einem String mit einem Sound-Dateinamen (kann weggelassen werden, dann =1)
'case ActionBox(ab#)=1: print "Button 1 geklickt"
'dispose ab#
'----------------------------------------------
'Es reicht also, nur ab#.Text$ zu setzen, um ein minimalistisches Hinweisfenster mit einem "i"-Icon und einem Ok-Button ohne Sound zu erhalten.
'----------------------------------------------
'Rückgabewert: Nummer des angeklickten Buttons bzw. 0 bei Esc. und bei Fenster schließen ("X"-Button rechts oben)
parameters ab#
declare a%,b%,c%,d%,i%,o%,b#,hD%,hB%[],meldungstext$,s$,s2$,s3$,lines$[],anzlines%,aktline%,workline$,ende%,aktword%,anzwords%,savedfont%,saveddialogfont%,yofs%,xsize%,ysize%,ret%,hF%
declare xtextsize%,textrandsize%,xiconsize%,xbuttonsize%,ybuttonsize%,IconX1%,IconY1%,IconX2%,IconY2%,hVertScrollbar%,usevertscrollbar%,maxvscrollpos%,oldvscrollpos%,aktzeile%,oldfastmode%,hIcon%
declare HelpInfo#,oldusermess16%,oldusermess522%
oldfastmode%=@Set("FastMode",0)
'{ 'UserMessages anlegen
oldusermess16%=@IsUserMessage($10)
if oldusermess16%=0
usermessages $10
endif
oldusermess522%=@IsUserMessage(522)
if oldusermess522%=0
usermessages 522
endif
'}
'{ 'Variablen füllen
meldungstext$=""
if ab#.Text$<>""
meldungstext$=ab#.Text$
elseif ab#.pText&<>0
meldungstext$=@string$(ab#.pText&,0)
endif
dim HelpInfo#,S_HELPINFO
ret%=0
textrandsize%=10
hVertScrollbar%=0
usevertscrollbar%=0
oldvscrollpos%=0
anzlines%=0
hF%=@create("FONT","Segoe UI",-12,0,0,0,0)
'}
'{ 'Default-Werte setzen, wenn nicht angegeben
if ab#.TextXSize&=0
ab#.TextXSize&=400
endif
if ab#.TextMaxYSize&=0
ab#.TextMaxYSize&=500
endif
if ab#.BkColor&=0
ab#.BkColor&=@rgb(255,255,255)
endif
if ab#.Icon&=0
ab#.Icon&=1
if ab#.Sound&=0
ab#.Sound&=-1
endif
endif
if ab#.Icon&>0
xiconsize%=50
else
xiconsize%=0
endif
if ab#.Caption$=""
ab#.Caption$="Hinweis"
if ab#.Icon&=2
ab#.Caption$="Frage"
elseif ab#.Icon&=3
ab#.Caption$="Achtung"
elseif ab#.Icon&=4
ab#.Caption$="Fehler"
endif
endif
if ab#.Sound&=0
ab#.Sound&=1
endif
if ab#.ButtonXSize&=0
if ab#.AnzButtons&>0
ab#.ButtonXSize&=100
else
ab#.ButtonXSize&=75
endif
endif
if ab#.AnzButtons&=0
ab#.AnzButtons&=1
ab#.ButtonTexts$="Ok"
endif
if ab#.HelpButton&
ab#.AnzButtons&=ab#.AnzButtons&+1
if @substr$(ab#.ButtonTexts$,ab#.AnzButtons&,"|")=0
if ab#.ButtonTexts$<>""
ab#.ButtonTexts$=ab#.ButtonTexts$+"|"
endif
ab#.ButtonTexts$=ab#.ButtonTexts$+"Hilfe"
endif
endif
if ab#.AnzButtons&>0
if ab#.DefButton&=0
ab#.DefButton&=1 'wenn es keinen Default-Button geben soll, auf -1 setzen
elseif ab#.DefButton&>ab#.AnzButtons& 'es wurde offenbar vergessen, nach einer vorherigen ActionBox mit mehr Buttons als dieser den DefButton so zu setzen, dass er zu dieser ActionBox passt --> Button 1 nehmen
ab#.DefButton&=1 'wenn es keinen Default-Button geben soll, auf -1 setzen
endif
endif
if ab#.hFont&=0
usefont "Segoe UI",-12,0,0,0,0
else
SetGrafikFont ab#.hFont&
endif
'}
xtextsize%=ab#.TextXSize&
if ab#.Icon&<1
xtextsize%=xtextsize%+50 'xiconsize%
endif
xsize%=xiconsize%+textrandsize%+xtextsize%+textrandsize%
xbuttonsize%=ab#.ButtonXSize&
ybuttonsize%=25
savedfont%=@GetGrafikFont()
'{ '"\t" in sechs Spaces verwandeln
meldungstext$=@translate$(meldungstext$,"\t"," ")
'}
if meldungstext$<>""
'{ 'Zeilenumbrüche ("\n") durchführen
anzlines%=1
lines$[1]=meldungstext$
i%=1
while i%<=anzlines%
if @instr("\n",lines$[i%])
inc anzlines%
for o%,anzlines%-1,i%+1,-1
lines$[o%+1]=lines$[o%]
endfor 'o%
s$=lines$[i%]
lines$[i%]=@left$(s$,@instr("\n",s$)-1)
lines$[i%+1]=@right$(s$,@len(s$)-@instr("\n",s$)-1)
endif
inc i%
endwhile
'}
'{ 'text$ in einzelne Zeilen aufteilen
ende%=0
aktword%=0
aktline%=1
workline$=lines$[aktline%]
anzwords%=@len(workline$," ")
s$=""
whilenot ende%
if anzwords%=0
else
inc aktword%
if @GetDrawStringLenX(s$+" "+@substr$(workline$,aktword%," "))<=xtextsize%
case s$<>"": s$=s$+" "
s$=s$+@substr$(workline$,aktword%," ")
else
if @GetDrawStringLenX(@substr$(workline$,aktword%," "))<=xtextsize%
dec aktword%
lines$[aktline%]=s$
inc anzlines%
for i%,anzlines%-1,aktline%+1,-1
lines$[i%+1]=lines$[i%]
endfor 'i%
inc aktline%
s$=""
else 'das einzelne Wort ist länger als eine Zeile: Buchstabe für Buchstabe verkürzen und Wort teilen
s2$=@substr$(workline$,aktword%," ")
for i%,@len(s2$)-1,1,-1
if @GetDrawStringLenX(@left$(s2$,i%)+" ")<=xtextsize%
s2$=@left$(s2$,i%)+" "+@right$(s2$,@len(s2$)-i%)
break
endif
endfor 'i%
s3$=""
for i%,1,anzwords%
case s3$<>"": s3$=s3$+" "
if i%<>aktword%
s3$=s3$+@substr$(workline$,i%," ")
else
s3$=s3$+s2$
endif
endfor 'i%
workline$=s3$
dec aktword%
inc anzwords%
endif
endif
endif
if aktword%=anzwords%
if s$<>""
lines$[aktline%]=s$
endif
if aktline%=anzlines%
ende%=1
else
inc aktline%
workline$=lines$[aktline%]
anzwords%=@len(workline$," ")
aktword%=0
s$=""
endif
endif
endwhile
'}
endif
'{ 'ggf. eine zweite Zeile hinzufügen (mit Icon sieht nur eine Zeile doof aus)
if ab#.Icon&>0
while anzlines%<2
inc anzlines%
lines$[anzlines%]=""
endwhile
endif
'}
'{ 'xsize% anpassen
a%=0
for i%,1,anzlines%
if lines$[i%]<>""
b%=@GetDrawStringLenX(lines$[i%])
if b%>a%
a%=b%
endif
endif
endfor 'i%
xtextsize%=a%+textrandsize%
xsize%=xiconsize%+textrandsize%+xtextsize%+textrandsize%
if xsize%<(textrandsize%*(ab#.AnzButtons&+1))+(xbuttonsize%*ab#.AnzButtons&)+(2*@GetWindowThinBorderWidth())
xsize%=(textrandsize%*(ab#.AnzButtons&+1))+(xbuttonsize%*ab#.AnzButtons&)+(2*@GetWindowThinBorderWidth())
endif
'}
'{ 'yofs% & ysize& ermitteln
yofs%=GetDrawStringLenY("X")
if (anzlines%*yofs%)<=ab#.TextMaxYSize&
ysize%=textrandsize%+(anzlines%*yofs%)+(textrandsize%*2)+ybuttonsize%+textrandsize%+(2*@GetWindowThinBorderWidth())
else
usevertscrollbar%=1
ysize%=textrandsize%+(ab#.TextMaxYSize&)+(textrandsize%*2)+ybuttonsize%+textrandsize%+(2*@GetWindowThinBorderWidth())
endif
'}
'{ 'xsize% an mögliche Scrollbar anpassen
if usevertscrollbar%
xsize%=xsize%+15
endif
'}
'{ 'Dialog aufbauen
hD%=@create("DIALOG",%HWnd,ab#.Caption$,((%maxx\2)-(xsize%\2)),((%maxy\2)-(ysize%\2)),xsize%,ysize%)
a%=@GetAbsWindowPosX1(hD%)
b%=@GetAbsWindowPosY1(hD%)
c%=@GetAbsWindowPosX2(hD%)
d%=@GetAbsWindowPosY2(hD%)
SetWindowPos hD%=a%,(b%-((ysize%-@height(hD%))\2))-(c%-a%),((d%-b%)+(ysize%-@height(hD%)));-1
saveddialogfont%=@GetDialogFont()
SetDialogFont hF%
StartPaint hD%
'{ 'Hintergrund malen
'cls @rgb(255,255,255)
UseBrush 1,ab#.BkColor& '@rgb(255,255,255)
UsePen 0,0,ab#.BkColor& '@rgb(255,255,255)
rectangle 0,0-@width(hD%),(@height(hD%)-textrandsize%-ybuttonsize%-textrandsize%)
'}
'{ 'Scrollbar erstellen
if usevertscrollbar%
hVertScrollbar%=@Create("VScroll",hD%,"",@width(hD%)-15,0,15,textrandsize%+ab#.TextMaxYSize&+textrandsize%)
maxvscrollpos%=anzlines%-(ab#.TextMaxYSize&\yofs%)+1
SetScrollRange hVertScrollbar%,1,maxvscrollpos%
oldvscrollpos%=@GetScrollPos(hVertScrollbar%)
endif
'}
'{ 'Icon zeichnen
if ab#.Icon&>0
IconX1%=10
IconY1%=10
IconX2%=IconX1%+35
IconY2%=IconY1%+35
'{ 'JR-Icons (selbst gezeichnet) - auskommentiert
/*
'{ '1=i
if ab#.Icon&=1
UseBrush 1,@rgb(0,100,255)
UsePen 0,0,@rgb(0,0,0)
ellipse IconX1%,IconY1%-IconX2%,IconY2%
usefont "Times New Roman",30,0,1,0,0
textcolor @rgb(255,255,255),-1
drawtext IconX1%+((IconX2%-IconX1%)\2),IconY1%+1,"i",6
'}
'{ '2=?
elseif ab#.Icon&=2
UseBrush 1,@rgb(0,100,255)
UsePen 0,0,@rgb(0,0,0)
ellipse IconX1%,IconY1%-IconX2%,IconY2%
usefont "Times New Roman",30,0,1,0,0
textcolor @rgb(255,255,255),-1
drawtext IconX1%+((IconX2%-IconX1%)\2)+1,IconY1%+2,"?",6
'}
'{ '3=!
elseif ab#.Icon&=3
UseBrush 1,@rgb(255,220,0)
UsePen 0,2,@rgb(255,180,0)
line IconX1%,IconY2%-(IconX1%+((IconX2%-IconX1%)\2)),IconY1%
line (IconX1%+((IconX2%-IconX1%)\2)),IconY1%-IconX2%,IconY2%
line IconX1%,IconY2%-IconX2%,IconY2%
fill IconX1%+10,IconY2%-10,@rgb(255,180,0)
usefont "Arial",30,0,1,0,0
textcolor @rgb(0,0,0),-1
drawtext IconX1%+((IconX2%-IconX1%)\2)+1,IconY1%+5,"!",6
'}
'{ '4=X
elseif ab#.Icon&=4
UseBrush 1,@rgb(255,0,0)
UsePen 0,0,@rgb(0,0,0)
ellipse IconX1%,IconY1%-IconX2%,IconY2%
usefont "Arial",30,0,1,0,0
textcolor @rgb(255,255,255),-1
drawtext IconX1%+((IconX2%-IconX1%)\2)+1,IconY1%+2,"X",6
'}
*/
'}
'{ 'Windows-Icons
'{ '1=i
if ab#.Icon&=1
hIcon%=@external("USER32.DLL","LoadIconA",0,32516) '32516=~IDI_INFORMATION
drawicon hIcon%,IconX1%,IconY1%
'}
'{ '2=?
elseif ab#.Icon&=2
hIcon%=@external("USER32.DLL","LoadIconA",0,32514) '32514=~IDI_QUESTION
drawicon hIcon%,IconX1%,IconY1%
'}
'{ '3=!
elseif ab#.Icon&=3
hIcon%=@external("USER32.DLL","LoadIconA",0,32515) '32515=~IDI_WARNING
drawicon hIcon%,IconX1%,IconY1%
'}
'{ '4=X
elseif ab#.Icon&=4
hIcon%=@external("USER32.DLL","LoadIconA",0,32513) '32513=~IDI_ERROR
drawicon hIcon%,IconX1%,IconY1%
'}
'{ '5=Security Shield
elseif ab#.Icon&=5
hIcon%=@external("USER32.DLL","LoadIconA",0,32518) '32518=~IDI_SHIELD
drawicon hIcon%,IconX1%,IconY1%
'}
'{ '6=Application Icon
elseif ab#.Icon&=6
'hIcon%=@external("USER32.DLL","LoadIconA",0,~IDI_APPLICATION) '~IDI_WINLOGO 'funktioniert beides nicht richtig
dim b#,10001
@external("KERNEL32.DLL","GetModuleFileNameA",0,b#,10000)
hIcon%=@create("HICON",@string$(b#,0),0)
dispose b#
drawicon hIcon%,IconX1%,IconY1%
DeleteObject hIcon%
'}
'}
endif
textcolor @rgb(0,0,0),-1
endif
'}
'{ 'Text schreiben
if ab#.hFont&=0
usefont "Segoe UI",-12,0,0,0,0
else
SetGrafikFont ab#.hFont&
endif
textcolor ab#.TextColor&,-1
aktzeile%=1
a%=aktzeile%
if usevertscrollbar%
b%=aktzeile%+((ab#.TextMaxYSize&\yofs%)-1)
else
b%=anzlines%
endif
for i%,a%,b%
drawtext xiconsize%+textrandsize%,textrandsize%+(yofs%*(i%-a%)),lines$[i%],0
endfor 'i%
'}
EndPaint
'{ 'Buttons erstellen
for i%,1,ab#.AnzButtons&
if i%<>ab#.DefButton&
hB%[i%]=@create("BUTTON",hD%,@substr$(ab#.ButtonTexts$,i%,"|"),@width(hD%)-(textrandsize%*(ab#.AnzButtons&-(i%-1)))-(xbuttonsize%*(ab#.AnzButtons&-(i%-1))),@height(hD%)-(ybuttonsize%+textrandsize%),xbuttonsize%,ybuttonsize%)
else
hB%[i%]=@create("DEFBUTTON",hD%,@substr$(ab#.ButtonTexts$,i%,"|"),@width(hD%)-(textrandsize%*(ab#.AnzButtons&-(i%-1)))-(xbuttonsize%*(ab#.AnzButtons&-(i%-1))),@height(hD%)-(ybuttonsize%+textrandsize%),xbuttonsize%,ybuttonsize%)
endif
endfor 'i%
if ab#.DefButton&>0
@setfocus(hB%[ab#.DefButton&])
endif
if usevertscrollbar%
for i%,1,ab#.AnzButtons&
if (ab#.DeactivateButtonsTillLastLineSeen% & (2 ^ (i%-1)))=(2 ^ (i%-1))
enablewindow hB%[i%],0
endif
endfor 'i%
endif
'}
'{ 'Ton abspielen
if ab#.Sound&=1
if ab#.Icon&=1
MessageBeep($40) '~MB_ICONASTERISK
elseif ab#.Icon&=2
MessageBeep($20) '~MB_ICONQUESTION
elseif ab#.Icon&=3
MessageBeep($30) '~MB_ICONEXCLAMATION
elseif ab#.Icon&=4
MessageBeep($10) '~MB_ICONERROR
elseif ab#.Icon&=5
MessageBeep($30) '~MB_ICONEXLAMATION
endif
elseif ab#.Sound&=11
MessageBeep($40) '~MB_ICONASTERISK
elseif ab#.Sound&=12
MessageBeep($20) '~MB_ICONQUESTION
elseif ab#.Sound&=13
MessageBeep($30) '~MB_ICONEXCLAMATION
elseif ab#.Sound&=14
MessageBeep($10) '~MB_ICONERROR
elseif ab#.Sound&=15
MessageBeep(0) '~MB_OK (Standard-Beep)
elseif ab#.Sound&>15
PlaySound @string$(ab#.Sound&,0),1
endif
'}
'}
'{ 'Eingabehandling
ende%=0
whilenot ende%
waitinput
'{ 'Esc. bzw. Fenster schließen
if (((@iskey(27)=1) or (%umessage=$10)) and (@external("USER32.DLL","GetForegroundWindow")=hD%))
ende%=1
ret%=0
while @iskey(27)
sleep 25
endwhile
ClearKeyboardBuffer
'}
'{ 'Scrollbar
elseif (usevertscrollbar%=1) and (@GetScrollPos(hVertScrollbar%)<>oldvscrollpos%)
oldvscrollpos%=@GetScrollPos(hVertScrollbar%)
StartPaint hD%
UseBrush 1,ab#.BkColor& '@rgb(255,255,255)
UsePen 0,0,ab#.BkColor& '@rgb(255,255,255)
rectangle xiconsize%,textrandsize%-(xiconsize%+xtextsize%+textrandsize%),(textrandsize%+ab#.TextMaxYSize&)
if ab#.hFont&=0
usefont "Segoe UI",-12,0,0,0,0
else
SetGrafikFont ab#.hFont&
endif
textcolor ab#.TextColor&,-1
aktzeile%=oldvscrollpos%
a%=aktzeile%
b%=aktzeile%+((ab#.TextMaxYSize&\yofs%)-1)
for i%,a%,b%
drawtext xiconsize%+textrandsize%,textrandsize%+(yofs%*(i%-a%)),lines$[i% ],0
endfor 'i%
EndPaint
if usevertscrollbar%
if oldvscrollpos%=maxvscrollpos%
for i%,1,ab#.AnzButtons&
if (ab#.DeactivateButtonsTillLastLineSeen% & (2 ^ (i%-1)))=(2 ^ (i%-1))
enablewindow hB%[i%],1
endif
endfor 'i%
endif
endif
'}
'{ 'Mausrad
elseif %uMessage=522
if &uwParam<0 'nach unten gedreht
a%=@GetScrollPos(hVertScrollbar%)
inc a%
if a%>maxvscrollpos%
a%=maxvscrollpos%
endif
if a%<>oldvscrollpos%
oldvscrollpos%=a%
SetScrollPos hVertScrollbar%,oldvscrollpos%
StartPaint hD%
UseBrush 1,ab#.BkColor& '@rgb(255,255,255)
UsePen 0,0,ab#.BkColor& '@rgb(255,255,255)
rectangle xiconsize%,textrandsize%-(xiconsize%+xtextsize%+textrandsize%),(textrandsize%+ab#.TextMaxYSize&)
if ab#.hFont&=0
usefont "Segoe UI",-12,0,0,0,0
else
SetGrafikFont ab#.hFont&
endif
textcolor ab#.TextColor&,-1
aktzeile%=oldvscrollpos%
a%=aktzeile%
b%=aktzeile%+((ab#.TextMaxYSize&\yofs%)-1)
for i%,a%,b%
drawtext xiconsize%+textrandsize%,textrandsize%+(yofs%*(i%-a%)),lines$[i% ],0
endfor 'i%
EndPaint
if oldvscrollpos%=maxvscrollpos%
for i%,1,ab#.AnzButtons&
if (ab#.DeactivateButtonsTillLastLineSeen% & (2 ^ (i%-1)))=(2 ^ (i%-1))
enablewindow hB%[i%],1
endif
endfor 'i%
endif
endif
elseif &uwParam>0 'nach oben gedreht
a%=@GetScrollPos(hVertScrollbar%)
dec a%
if a%<1
a%=1
endif
if a%<>oldvscrollpos%
oldvscrollpos%=a%
SetScrollPos hVertScrollbar%,oldvscrollpos%
StartPaint hD%
UseBrush 1,ab#.BkColor& '@rgb(255,255,255)
UsePen 0,0,ab#.BkColor& '@rgb(255,255,255)
rectangle xiconsize%,textrandsize%-(xiconsize%+xtextsize%+textrandsize%),(textrandsize%+ab#.TextMaxYSize&)
if ab#.hFont&=0
usefont "Segoe UI",-12,0,0,0,0
else
SetGrafikFont ab#.hFont&
endif
textcolor ab#.TextColor&,-1
aktzeile%=oldvscrollpos%
a%=aktzeile%
b%=aktzeile%+((ab#.TextMaxYSize&\yofs%)-1)
for i%,a%,b%
drawtext xiconsize%+textrandsize%,textrandsize%+(yofs%*(i%-a%)),lines$[i% ],0
endfor 'i%
EndPaint
endif
endif
'}
'{ 'Buttons
else
'{ 'normale Buttons
if ab#.HelpButton&=0
a%=ab#.AnzButtons&
else
a%=ab#.AnzButtons&-1
endif
for i%,1,a%
if @clicked(hB%[i%])
ende%=1
ret%=i%
break
endif
endfor 'i%
'}
'{ 'Help-Button
if ende%=0
if ab#.HelpButton&
if @clicked(hB%[ab#.AnzButtons&])
HelpInfo#.cbsize&=@sizeof(HelpInfo#)
HelpInfo#.iContextType&=1 '1=~HELPINFO_WINDOW
HelpInfo#.iCtrlId&=0
HelpInfo#.hitemhandle&=hD%
HelpInfo#.dwContextId&=0
HelpInfo#.MousePosX&=@MouseAbsX()
HelpInfo#.MousePosY&=@MouseAbsY()
@sendmessage(%HWnd,83,0,HelpInfo#) '83=~WM_HELP
if ab#.pHelpProc&
SetWindowPos hD%=@GetAbsWindowPosX1(hD%),@GetAbsWindowPosY1(hD%)-(@GetAbsWindowPosX2(hD%)-@GetAbsWindowPosX1(hD%)),(@GetAbsWindowPosY2(hD%)-@GetAbsWindowPosY1(hD%));1 'ActionBox in den Hintergrund befördern, da sie eigentlich topmost ist und ein ggf. von der HelpProc benutztes Fenster überdecken würde
@call(ab#.pHelpProc&,ab#.HelpProcParam&)
SetWindowPos hD%=@GetAbsWindowPosX1(hD%),@GetAbsWindowPosY1(hD%)-(@GetAbsWindowPosX2(hD%)-@GetAbsWindowPosX1(hD%)),(@GetAbsWindowPosY2(hD%)-@GetAbsWindowPosY1(hD%));-1 'ActionBox wieder topmost machen
if @iskey(27)
while @iskey(27)
sleep 25
endwhile
ClearKeyboardBuffer
endif
endif
endif
endif
endif
'}
'}
endif
endwhile
'}
'{ 'aufräumen
@setfocus(%HWnd)
@destroywindow(hD%)
DeleteObject hF%
SetGrafikFont savedfont%
SetDialogFont saveddialogfont%
dispose HelpInfo#
'{ 'UserMessages wiederherstellen
if oldusermess16%=0
usermessages -$10
endif
if oldusermess522%=0
usermessages -522
endif
'}
@set("FastMode",oldfastmode%)
'}
return ret%
ENDPROC 'ActionBox

PROC ActionBoxReset 'setzt alle Werte einer ActionBox-Bereichsvariablen auf Standard zurück (praktisch, wenn man die Bereichsvariable weiterbenutzen möchte und vorher viele individuelle Einstellungen vorgenommen hat)
parameters ab#
@external("KERNEL32.DLL","RtlFillMemory",ab#,@sizeof(ab#),0)
ENDPROC 'ActionBoxReset

PROC XMessageBox 'simuliert eine Standard-MessageBox (gleiche Parameter und Ausgabewerte) mit den Vorteilen der ActionBox; einfach "MessageBox" im Code durch "XMessageBox" ersetzen (und diese Prozeduren sowie die globalen Struktur- und Variablendefinitionen übernehmen natürlich)
'es gibt fünf globale Variablen, um die Standard-Messageboxen doch ein bisschen individuell gestalten zu können:
'_XMessageBox_TextColor&: Textfarbe (mit @RGB(...) zu erzeugen)
'_XMessageBox_BkColor&: Hintergrundfarbe (mit @RGB(...) zu erzeugen)
'_XMessageBox_hFont&: Schriftart (mit @Create("FONT",...) zu erzeugen)
'_XMessageBox_pHelpProc&: Einsprungadresse zu einer Help-Prozedur, die aufgerufen wird, wenn man den Hilfe-Button aktiviert und ihn geklickt hat (ist mit @procaddr(...) zu ermitteln; die PROC muss genau einen 4-Byte-Parameter haben)
'_XMessageBox_HelpProcParam&: ein benutzerdefinierter Parameter, der der Help-Prozedur übergeben wird
parameters text$,caption$,flags&
declare ab#,ret&
ret&=0
dim ab#,S_ACTIONBOX
ab#.Caption$=caption$
ab#.pText&=@addr(text$)
ab#.TextXSize&=325
ab#.TextColor&=_XMessageBox_TextColor&
ab#.BkColor&=_XMessageBox_BkColor&
if _XMessageBox_hFont&
ab#.hFont&=_XMessageBox_hFont&
endif
'{ 'Flags auswerten
'{ 'Buttons
if (flags& & 5)=5
ab#.AnzButtons&=2
ab#.ButtonTexts$="Wiederholen|Abbrechen"
elseif (flags& & 4)=4
ab#.AnzButtons&=2
ab#.ButtonTexts$="Ja|Nein"
elseif (flags& & 3)=3
ab#.AnzButtons&=3
ab#.ButtonTexts$="Ja|Nein|Abbrechen"
elseif (flags& & 1)=1
ab#.AnzButtons&=2
ab#.ButtonTexts$="OK|Abbrechen"
elseif (flags& & 2)=2
ab#.AnzButtons&=3
ab#.ButtonTexts$="Abbrechen|Wiederholen|Ignorieren"
endif
if (flags& & 768)=768
ab#.DefButton&=4
elseif (flags& & 256)=256
ab#.DefButton&=2
elseif (flags& & 512)=512
ab#.DefButton&=3
else
ab#.DefButton&=1
endif
'}
'{ 'Icon
if (flags& & 96)=96
ab#.Icon&=-1
ab#.Sound&=15
elseif (flags& & 64)=64
ab#.Icon&=1
elseif (flags& & 48)=48
ab#.Icon&=3
elseif (flags& & 16)=16
ab#.Icon&=4
elseif (flags& & 32)=32
ab#.Icon&=2
else
ab#.Icon&=-1
endif
'}
'{ 'Hilfe-Button
if (flags& & 16384)=16384
ab#.HelpButton&=1
if _XMessageBox_pHelpProc&
ab#.pHelpProc&=_XMessageBox_pHelpProc&
ab#.HelpProcParam&=_XMessageBox_HelpProcParam&
endif
endif
'}
'}
ret&=@ActionBox(ab#)
'{ 'Ergebnis mappen
if (flags& & 5)=5
'ab#.ButtonTexts$="Wiederholen|Abbrechen"
if ret&=1
ret&=4
elseif ret&=2
ret&=2
endif
elseif (flags& & 4)=4
'ab#.ButtonTexts$="Ja|Nein"
if ret&=1
ret&=6
elseif ret&=2
ret&=7
endif
elseif (flags& & 3)=3
'ab#.ButtonTexts$="Ja|Nein|Abbrechen"
if ret&=1
ret&=6
elseif ret&=2
ret&=7
elseif ret&=3
ret&=2
endif
elseif (flags& & 1)=1
'ab#.ButtonTexts$="OK|Abbrechen"
if ret&=1
ret&=1
elseif ret&=2
ret&=2
endif
elseif (flags& & 2)=2
'ab#.ButtonTexts$="Abbrechen|Wiederholen|Ignorieren"
if ret&=1
ret&=3
elseif ret&=2
ret&=4
elseif ret&=3
ret&=5
endif
endif
'}
dispose ab#
return ret&
ENDPROC 'XMessageBox

PROC pHelpProc 'wird vom Hilfe-Button einer ActionBox aufgerufen
'Hier kann leider keine weitere ActionBox benutzt werden! Das gäbe Variablenkonflikte. Wenn man das unbedingt möchte, muss man die ActionBox-Proc hierfür duplizieren (z.B. als PROC ActionBox2).
parameters hActionBox& 'benutzerdefinierter Parameter (ab#.HelpProcParam& im Hauptprogramm), wird hier nicht weiter benutzt - hilfreich z.B., wenn man auf verschiedene ActionBoxes mit unterschiedlicher Hilfe reagieren möchte (ginge natürlich auch mit separaten Procs)
@MessageBox("Hilfe-Prozedur aufgerufen. Vermutlich ist eine DLL defekt.\n\nKeine Panik, dies ist nur eine Simulation.","Hilfe-Prozedur",64)
ENDPROC 'pHelpProc

'{ 'Hilfsfunktionen:
PROC MessageBeep
'{ 'mögliche Werte für flag
' Value Meaning
'
' 0xFFFFFFFF A simple beep. If the sound card is not available, the sound is generated using the speaker.
'
' MB_ICONASTERISK
' 0x00000040L
' See MB_ICONINFORMATION.
'
' MB_ICONEXCLAMATION
' 0x00000030L
' See MB_ICONWARNING.
'
' MB_ICONERROR
' 0x00000010L
' The sound specified as the Windows Critical Stop sound.
'
' MB_ICONHAND
' 0x00000010L
' See MB_ICONERROR.
'
' MB_ICONINFORMATION
' 0x00000040L
' The sound specified as the Windows Asterisk sound.
'
' MB_ICONQUESTION
' 0x00000020L
' The sound specified as the Windows Question sound.
'
' MB_ICONSTOP
' 0x00000010L
' See MB_ICONERROR.
'
' MB_ICONWARNING
' 0x00000030L
' The sound specified as the Windows Exclamation sound.
'
' MB_OK
' 0x00000000L
' The sound specified as the Windows Default Beep sound.
'}
parameters flag&
declare pc&
pc&=%pcount
if pc&=0
flag&=$FFFFFFFF
endif
@external("USER32.DLL","MessageBeep",flag&)
ENDPROC 'MessageBeep
PROC GetGrafikFont 'gibt auch bei der Systemschriftart ein gültiges Handle zurück (und nicht 0); das kann später auch wieder zum Setzen benutzt werden
parameters HDC&
declare a&,pc&
pc&=%PCount
if pc&=0
HDC&=%HDC
endif
a&=@external("GDI32.DLL","GetCurrentObject",HDC&,6) '6=~obj_font
return a&
ENDPROC 'GetGrafikFont
PROC SetGrafikFont
parameters hF%,HDC& 'hF% kann nicht 0 für Systemfont sein, aber natürlich ein mit GetSystemFont ermitteltes Handle. Mit dieser Funktion kann man »usefont hF%« realisieren, was Profan nicht kann (bei usefont muss immer hart die Schriftartspezifikation angegeben werden).
declare a&,pc&
pc&=%PCount
if pc&=1
HDC&=%HDC
endif
a&=@external("GDI32.DLL","SelectObject",HDC&,hF%)
return a&
ENDPROC 'SetGrafikFont
PROC GetDrawStringLenX 'ermittelt die horizontale Ausdehnung von TrueType-Text
parameters s$
declare b#,ret&
dim b#,8
if @external("GDI32.DLL","GetTextExtentPoint32A",%HDC,@addr(s$),@len(s$),b#)=1
ret&=@long(b#,0)
else
ret&=0
endif
dispose b#
return ret&
ENDPROC 'GetDrawStringLen
PROC GetDrawStringLenY 'ermittelt die vertikale Ausdehnung von TrueType-Text
parameters s$
declare b#,ret&
dim b#,8
if @external("GDI32.DLL","GetTextExtentPoint32A",%HDC,@addr(s$),@len(s$),b#)=1
ret&=@long(b#,4)
else
ret&=0
endif
dispose b#
return ret&
ENDPROC 'GetDrawStringLen
PROC GetAbsWindowPosX1 'ermittelt die linke obere absolute Fensterposition
parameters hW&
declare b#,ret&
dim b#,4*4
@external("user32.dll","GetWindowRect",hW&,b#)
ret&=@long(b#,0)
dispose b#
return ret&
ENDPROC 'GetAbsWindowPosX1
PROC GetAbsWindowPosY1
parameters hW&
declare b#,ret&
dim b#,4*4
@external("user32.dll","GetWindowRect",hW&,b#)
ret&=@long(b#,4)
dispose b#
return ret&
ENDPROC 'GetAbsWindowPosY1
PROC GetAbsWindowPosX2
'Es wird die absolute Position ermittelt! Für Breite/Höhe GetWindowSpan verwenden!
parameters hW&
declare b#,ret&
dim b#,4*4
@external("user32.dll","GetWindowRect",hW&,b#)
ret&=@long(b#,8)
dispose b#
return ret&
ENDPROC 'GetAbsWindowPosX2
PROC GetAbsWindowPosY2
'Es wird die absolute Position ermittelt! Für Breite/Höhe GetWindowSpan verwenden!
parameters hW&
declare b#,ret&
dim b#,4*4
@external("user32.dll","GetWindowRect",hW&,b#)
ret&=@long(b#,12)
dispose b#
return ret&
ENDPROC 'GetAbsWindowPosY2
PROC GetWindowThinBorderWidth
declare erg&
erg&=@external("user32.dll","GetSystemMetrics",7) '~SM_CXFIXEDFRAME=7
return erg&
ENDPROC 'GetWindowThinBorderWidth
PROC GetDialogFont 'gibt ein Handle zur aktuell gesetzten DialogFont zurück (0, wenn die Systemschriftart eingestellt ist)
declare dummycontrol%,hF%
dummycontrol%=@create("TEXT",%HWnd,"",0,0,0,0)
hF%=@sendmessage(dummycontrol%,49,0,0) '49=~wm_getfont
@destroywindow(dummycontrol%)
return hF%
ENDPROC 'GetDialogFont
PROC ClearKeyboardBuffer
while @inkey$()<>""
endwhile
ENDPROC 'ClearKeyboardBuffer
PROC MouseAbsX 'absolute x-Mausposition
Declare Point#,XX&
Dim Point#,8
@external("user32.dll","GetCursorPos",Point#)
XX&=@long(Point#,0)
Dispose Point#
Return XX&
EndProc 'MouseX
PROC MouseAbsY 'absolute y-Mausposition
Declare Point#,YY&
Dim Point#,8
@external("user32.dll","GetCursorPos",Point#)
YY&=@long(Point#,4)
Dispose Point#
Return YY&
EndProc 'MouseY
'}


'Hauptprogramm:
cls
dim ab#,S_ACTIONBOX
'{ 'einfache ActionBox mit ganz wenig Programmieraufwand
ab#.text$="Dies ist eine ganz einfache Actionbox mit nur einem Button.\n\nSie benötigt nur eine Definition, nämlich den anzuzeigenden Text."
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'Actionbox mit drei benutzerdefinierten Buttons
ActionBoxReset(ab#) 'setzt alle Werte auf Standard zurück
ab#.text$="Diese ActionBox hat drei Buttons, deren Text frei gewählt werden kann.\n\nDer Rückgabewert ist der geklickte Button oder 0 im Falle von Esc. oder Fenster schließen (\qX\q rechts oben)."
ab#.AnzButtons&=3
ab#.ButtonTexts$="Button 1|Button 2|Button 3"
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'Actionbox mit drei benutzerdefinierten Buttons, einer definierten Titelzeile und einem definierten Icon
ActionBoxReset(ab#)
ab#.Caption$="eigene Überschrift"
ab#.text$="Diese ActionBox hat erneut drei Buttons, diesmal eine definierte Titelzeile und ein definiertes Icon, welches vom Standard-Windowston begleitet wird.\n\nDies ist bewusst dasselbe Icon, das bei den bisherigen ActionBoxes verwendet wurde. Allerdings wird diesmal der passende Sound dazu gespielt, weil das Icon explizit gesetzt wurde."
ab#.AnzButtons&=3
ab#.ButtonTexts$="Button 1|Button 2|Button 3"
ab#.Icon&=1
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'nochmal mit anderem Icon
ActionBoxReset(ab#)
ab#.Caption$="eigene Überschrift"
ab#.text$="Dasselbe nochmal, nur mit anderem Icon.\n\nEs gibt sechs davon (statt der aus Profan bekannten vier):\n- .Icon&=1: \qi\q\n- .Icon&=2: \q?\q (ohne Ton, Windows hat dafür keinen (mehr))\n- .Icon&=3: \q!\q\n- .Icon&=4: \qX\q\n- .Icon&=5: Security Shield\n- .Icon&=6: Programm-Icon\n\n\
Es gibt in dieser ActionBox jetzt außerdem einen vom ersten abweichenden Default-Button.\n\n\
Man ist übrigens nicht an die Windows-Sounds gebunden, sondern kann, wenn man möchte, einen völlig frei wählbaren Sound beim Öffnen der ActionBox abspielen (aus einer beliebigen WAV-Datei)."
ab#.AnzButtons&=3
ab#.ButtonTexts$="Button 1|Button 2|Button 3"
ab#.DefButton&=2
ab#.Icon&=3
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'mit sehr langem Text, der gescrollt wird
ActionBoxReset(ab#)
ab#.Caption$="ActionBox mit scrollbarem Text"
ab#.text$="Hier gibt es sehr viel Text. Anstatt die Box immer größer zu machen, wie Windows es tun würde, gibt es hier eine Maximalgröße, ab der der Text scrollbar gemacht wird. Das Textfeld ist standardmäßig maximal 500 Pixel hoch, das ist aber natürlich einstellbar.\n\nHier wird \
diesmal das neue Security Shield-Icon von Windows verwendet. Sehr brauchbar z.B. für die Meldung, dass eine Passwort-Abfrage fehlgeschlagen ist.\n\n\
Es war zu merken, dass die Berechnung der Zeilenumbrüche eine fühlbare Zeit gedauert hat (bis die ActionBox angezeigt wurde). Ich könnte natürlich eine DLL schreiben, die das schneller erledigt, aber heute dachte ich, dass reines XProfan ohne Schnickschnack und weitere \
Dateien auch mal wieder ganz entspannend für alle wäre. ;-)\n\n\
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text.\n\nUngefähr zur Hälfte da.\n\n \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text.\n\nUnten angekommen!"
ab#.AnzButtons&=3
ab#.ButtonTexts$="Button 1|Button 2|Button 3"
ab#.DefButton&=2
ab#.Icon&=5
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'ausgewählte Buttons werden erst anklickbar, wenn man den Text bis nach unten gescrollt hat
ActionBoxReset(ab#)
ab#.Caption$="ActionBox mit scrollbarem Text und zunächst deaktivierten Buttons"
ab#.text$="Diesmal ist der 3. Button zunächst deaktiviert. Erst dann, wenn der Benutzer den Text ganz nach unten gescrollt (und hoffentlich gelesen) hat, wird dieser Button aktiviert. So ist z.B. eine Lizenzvereinbarung vor Aktivierung des Installationsbuttons ganz leicht zu realisieren.\n\n\
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text.\n\nUngefähr zur Hälfte da.\n\n \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. \
Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text. Ganz viel Text.\n\nUnten angekommen. Die Installation kann nun gestartet werden."
ab#.AnzButtons&=3
ab#.ButtonTexts$="Zurück|Abbruch|Installieren"
ab#.DefButton&=2
ab#.DeactivateButtonsTillLastLineSeen%=4 'die zunächst deaktivierten Buttons werden bitweise übergeben (Button 1=1, Button 2=2, Button 3=4, Button 4=8 usw.)
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'Fehlermeldungs-ActionBox mit rotem Hintergrund und großer Schrift
ActionBoxReset(ab#)
ab#.Caption$="Fehlermeldungs-ActionBox mit rotem Hintergrund und großer Schrift"
ab#.text$="FEHLER!\n\nDie Datei Blablub.dll wurde nicht gefunden. Ihre Auswahl:"
ab#.AnzButtons&=3
ab#.ButtonTexts$="Wiederholen|Übergehen|Abbrechen"
ab#.DefButton&=3
ab#.hFont&=@create("Font","Arial",20,0,1,0,0)
ab#.TextColor&=@rgb(255,255,255)
ab#.BkColor&=@rgb(200,0,0)
ab#.Icon&=4
print "Button: "+@str$(@actionbox(ab#))
DeleteObject ab#.hFont&
'}
'{ 'Fehlermeldungs-ActionBox mit Hilfe-Button
ActionBoxReset(ab#)
ab#.Caption$="Fehlermeldungs-ActionBox mit rotem Hintergrund und Hilfe-Button"
ab#.text$="Nun gibt es einen zusätzlichen Hilfe-Button. Dies ist ein spezieller Button, der eine benutzerdefinierte Funktion aufruft, in der man alles anstellen kann, was man möchte, um weitere Hilfestellung zu einer Meldung zu leisten.\n\nBei der Standard-MessageBox wird demgegenüber lediglich \
eine ~WM_HELP-Message gesendet, die man leider nicht bearbeiten kann, während die MessageBox das System blockiert.\n\n\nFEHLER!\n\nDie Datei Blablub.dll wurde nicht gefunden. Ihre Auswahl:"
ab#.AnzButtons&=3 'Es bleibt bei 3 selbst definierten Buttons! Der Hilfe-Button wird automatisch hinzugefügt.
ab#.HelpButton&=1 'Der Hilfe-Button wird aktiviert.
ab#.pHelpProc&=@ProcAddr("pHelpProc",1) 'Die Einsprung-Adresse für die benutzerdefinierte Hilfe-Prozedur wird definiert.
ab#.HelpProcParam&=0 'Kann irgendein selbst gewählter Parameter sein.
ab#.ButtonTexts$="Wiederholen|Übergehen|Abbrechen|HILF MIR!!!" 'Der Text für den Hilfe-Button kann jedoch als letzter Text hinzugefügt werden. Anderenfalls wird "Hilfe" benutzt.
ab#.DefButton&=3
ab#.TextColor&=@rgb(255,255,255)
ab#.BkColor&=@rgb(200,0,0)
ab#.Icon&=4
print "Button: "+@str$(@actionbox(ab#))
@ProcAddr("pHelpProc",-1) 'die ProcAddr wieder freigeben, weil man vielleicht noch andere im Programm verwenden möchte (je Parameterzahl gibt es nur 5 freie Plätze)
'}
'{ 'XMessageBoxen
ActionBoxReset(ab#)
ab#.Caption$="XMessageBoxen"
ab#.text$="Um bisher bestehenden Code leicht an ActionBoxen anpassen zu können, gibt es die Prozedur »XMessageBox«. Diese ruft intern eine ActionBox auf, aber so, dass man dieselben drei Parameter wie bei der Standard-XProfan-MessageBox verwenden kann und außerdem dieselben Rückgabewerte erhält. \
Man muss nur »MessageBox« im Code durch »XMessageBox« ersetzen. Mit dem Füllen von Werten in der Struktur der ActionBox-Bereichsvariable muss man sich dabei also nicht beschäftigen.\n\n\
Diese Funktion ist natürlich auf die Standard-Buttontexte und -Rückgabewerte beschränkt. Aber man kann mit fünf globalen Variablen immerhin die Text- und Hintergrundfarbe sowie die Schriftart frei wählen. Auch die frei programmierbare Hilfeprozedur wird unterstützt.\n\n\
Wenn man alle MessageBoxen in einem Programm z.B. mit einem sanften lindgrün wie in dieser Box unterlegt, hebt man sich schon einmal gewaltig von fast allen anderen Programmen ab.\n\n\
Hilfe findet sich zu Beginn der Prozedur als Kommentare.\n\n\
Bei dieser ActionBox wurde übrigens der normale Windows-Standard-Beep als Sound gewählt. Dieser Klang ist ein anderer als der Standardton für das aktuell gewählte Icon."
ab#.BkColor&=@rgb(200,220,100)
ab#.Icon&=1
ab#.Sound&=15
print "Button: "+@str$(@actionbox(ab#))
'}
'{ 'zum Schluss noch eine Warnung (nur eine ActionBox zur Zeit)
ActionBoxReset(ab#)
ab#.Caption$="Warnung und Ende des Tutorials"
ab#.text$="Zum Schluss noch eine Warnung:\n\nEs darf immer nur eine ActionBox zur Zeit geben, sonst gibt es Variablenkonflikte. Das ist im Normalfall überhaupt kein Problem. Aber in der Subclassproc sollte man die ActionBox vorsichtshalber wohl lieber nicht benutzen.\n\n\
Nun aber viel Spaß mit den neuen Möglichkeiten! Wer die ActionBox benutzen möchte, packt sich die Struktur- und Variablendeklarationen sowie die Prozeduren am besten in eine INC-Datei. Hier habe ich alles hintereinander weg geschrieben, damit ein einziger \
Sourcecode für die Veröffentlichung reicht.\n\nBeste Grüße, Jens-Arne\n\nAnregungen und Hinweise: jreumsc@web.de"
ab#.BkColor&=@rgb(255,255,0)
ab#.Icon&=3
print "Button: "+@str$(@actionbox(ab#))
'}
print:print "Zum Beenden Taste drücken oder Mausklick."
dispose ab#
waitinput
end
 
XProfan X4 * Prf2Cpp * XPSE * JRPC3 * Win11 Pro 64bit * PC i7-7700K@4,2GHz, 32 GB RAM
PM: jreumsc@web.de
26.02.2023  
 




Manfred
Barei
Super!!
 
XProfan X2
Zu wenig Wissen ist gefärlich, zu viel auch.(XProfan X4) | Win 10 Pro 64 | Win7 Ultimate 32/64 | AMD FX-8320, 16GB, GeForce GT 630 |
08.03.2023  
 




Georg
Teles
 
Alle Sprachen
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

16.03.2023  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.215 Betrachtungen

Unbenanntvor 0 min.
RudiB.vor 99 min.
Gast.081524.07.2024
Matzbub03.02.2024
Jens-Arne Reumschüssel30.01.2024
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie