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
|
|