Seite 1 von 1

Messagebox mit anderem Font, Buttontext und Icon

Verfasst: 16.04.2020 18:10
von hjbremer
Messagerequester ist schön einfach, aber uncool

Leider ist der Aufwand ihn zu verbessern nicht unerheblich

Hier eine Version Windows only ( gibts noch was anderes ? :mrgreen: ) incl Beispiele

Code: Alles auswählen

;MessageBox, V.1.3, ab PB 5.41 x86 Windows - Mrz.2020 by HJBremer

;da PB viele Konstanten nicht unterstützt, empfehle ich nur die Windows Konstanten zu benutzen.

;folgende ButtonIds gibt es, diese sind auch die Rückgabewerte

;1    IDOK	      Button OK      #PB_MessageRequester_Ok=0, es wird aber 1 zurückgegeben
;2    IDCANCEL	   Abbrechen      #PB_MessageRequester_Cancel
;3    IDABORT	   Abbrechen  
;4    IDRETRY	   Wiederholen  
;5    IDIGNORE	   Ignorieren  
;6    IDYES	      Ja             #PB_MessageRequester_Yes
;7    IDNO	      Nein           #PB_MessageRequester_No
;8    -                          unbekannt
;9    -           Hilfe          es gibt keine ID-Konstante !! keinen Rückgabewert nur #WM_HELP
;10   IDTRYAGAIN  Wiederholen
;11   IDCONTINUE  Weiter

;20               ?? Icon ??
;$FFFF            Textbox ID

;ButtonFlags
;#MB_OK                    buttons: OK                      = #PB_MessageRequester_Ok
;#MB_OKCANCEL              buttons: OK + Abbrechen.
;#MB_YESNO                 buttons: Ja + Nein.              = #PB_MessageRequester_YesNo
;#MB_YESNOCANCEL           buttons: Ja + Nein + Abbrechen   = #PB_MessageRequester_YesNoCancel
;#MB_RETRYCANCEL           buttons: Wiederholen + Abbrechen.
;#MB_ABORTRETRYIGNORE      buttons: Abbrechen + Wiederholen + Ignorieren.
;#MB_CANCELTRYCONTINUE = 6 buttons: Abbrechen + Wiederholen + Weiter. in PB nicht definiert
;#MB_HELP = $00004000      buttons: Help button siehe MSDN.           in PB nicht definiert 

;Icon | Button | DEFBUTTON
;#MB_ICONEXCLAMATION #MB_ICONWARNING      ;gelbes Dreieck mit Ausrufezeichen
;#MB_ICONINFORMATION #MB_ICONASTERISK     ;blauer Kreis mit einem i
;#MB_ICONQUESTION                         ;blauer Kreis mit einem ?
;#MB_ICONSTOP #MB_ICONERROR #MB_ICONHAND  ;roter  Kreis mit einem x

;Vorgabe aktiv
;#MB_DEFBUTTON1, #MB_DEFBUTTON2, #MB_DEFBUTTON3 

;siehe auch https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-messagebox

DeclareModule MessageBox   
   
   Declare.i MessageBox(title$, text$, flags=#MB_OK, width=5, lf=1)
   Declare.i MessageBoxFont(fontid)
   Declare.i MessageBoxText(id, text$, width=70, align=0)   
   Declare.i MessageBoxIcon(file$, resnr, kill=0)
   
EndDeclareModule

Module MessageBox   
   EnableExplicit
   
   Structure text
      text.s
      width.i
      align.i
   EndStructure
   
   #buttonanz = 11
   Global Dim button.text(#buttonanz)
   Global fontid_text = FontID(LoadFont(#PB_Any, "Consolas", 11))
   Global fontid_button = FontID(LoadFont(#PB_Any, "Tahoma", 10))
   
   Global hookid, iconfile$, iconresnr, iconflag
   
   Procedure.i MessageBoxIcon(file$, resnr, kill=0)
      ;file$ = Datei welche IconResourcen enthält. z.B. "shell32.dll"
      ;resnr = eine ResourcenNummer (kein Iconhandle bzw. Nummer)
      ;kill  = 1 file$+resnr werden in MessageBox() gelöscht, Standard ist nix löschen    
      ;#MB_USERICON muß bei Messagebox flags gesetzt sein, sonst kein anderes Icon
      
      iconfile$ = file$
      iconresnr = resnr
      iconflag  = kill
      
      ; wenn file$ = "" sind folgende Konstanten möglich, #MB_USERICON muß gesetzt sein
      ; diese Icons sehen unter Win10 besser aus
      ; #IDI_APPLICATION   32512 Standardanwendungssymbol. (Blatt Papier oder so)
      ; #IDI_ERROR         32513 roter Kreis mit X
      ; #IDI_HAND          32513    ""
      ; #IDI_QUESTION      32514 blauer Kreis mit ?
      ; #IDI_WARNING       32515 gelbes Dreieck mit !
      ; #IDI_EXCLAMATION   32515    ""
      ; #IDI_ASTERISK      32516 blauer Kreis mit i
      ; #IDI_INFORMATION   32516    ""
      ; IDI_WINLOGO        32517 Standardanwendungssymbol.
      ; #IDI_SHIELD        32518 Sicherheitsschild-Symbol.
      
   EndProcedure   
   
   Procedure.i MessageBoxFont(fontid)      
      Protected old = fontid_text   ;Text nur teilweise sichtbar dann bei Aufruf von
      fontid_text = fontid          ;MessageBox(title$, text$, flags=#MB_OK, width=5, lf=1)
      ProcedureReturn old           ; width und/oder lf vergrößern (width max 200, lf bis sichtbar)
   EndProcedure   
   
   Procedure.i MessageBoxText(id, text$, width=70, align=0)      
      If id And id <= #buttonanz
         button(id)\text = text$    ;nur wenn es Text gibt wird auch Font, Breite + Align geändert
         button(id)\width = width   ;neue Buttonbreite
         button(id)\align = align   ;#BS_LEFT #BS_RIGHT #BS_CENTER möglich, sonst Originalposition
      EndIf      
   EndProcedure
   
   Procedure.i MessageBoxProc(nCode, wParam, lParam)      
      ;wparam ist das Messagebox Window Handle !!!
      ;lparam ist ein Zeiger auf die Structur CBTACTIVATESTRUCT = dort gleicher Wert wie wparam
      
      Protected hwnd, id, rb.rect, rc.rect, rw.rect, x, y
      
      If nCode = #HCBT_ACTIVATE       
         hwnd = GetDlgItem_(wparam, $FFFF)                  ;Textbox handle
         SendMessage_(hwnd, #WM_SETFONT, fontid_text, 1)    ;Textboxfont ändern  
         
         ;Buttons
         For id = 1 To #buttonanz   ; id entspricht #IDOK, #IDNO, #IDYES = interne ButtonNr            
            hwnd = GetDlgItem_(wparam, id)                     ;Button handle            
            GetWindowRect_(wparam, rw)                         ;Rectangle Window Screen Coordinate  
            GetWindowRect_(hwnd, rb)                           ;Rectangle Button Screen Coordinate            
            GetClientRect_(hwnd, rc)                           ;Rectangle Button rc\right ist Breite            
            SendMessage_(hwnd, #WM_SETFONT, fontid_button, 1)  ;neuer Font            
            SetWindowPos_(hwnd,0, 0, 0, rc\right, 25, #SWP_NOMOVE|#SWP_NOZORDER) ;Buttonhöhe ändern            
            If button(id)\text
               SetDlgItemText_(wParam, id, button(id)\text)    ;neuer Buttontext            
               MapWindowPoints_(0, wparam, rb, 2)              ;ButtonScreenCoordinaten umwandeln in WindowWerte            
               y = rb\top - 0                                  ;button y Posi 
               Select button(id)\align                         ;button x Posi 
                  Case #BS_LEFT :  x = 10
                  Case #BS_RIGHT:  x = rw\right - rw\left - button(id)\width - 16
                  Case #BS_CENTER: x = (rw\right - rw\left - button(id)\width) / 2 - 3
                  Default:         x = rb\left     ;Original Posi
               EndSelect               
               SetWindowPos_(hwnd,0, x, y, button(id)\width, 25, #SWP_NOZORDER)  ;ButtonPosi+Breite               
            EndIf            
         Next         
         UnhookWindowsHookEx_ (hookid)         
      EndIf
      
   EndProcedure   
   
   Procedure.i MessageBox(title$, text$, flags=#MB_OK, width=5, lf=1)      
      ;width: zusätzliche Zeichen um Fensterbreite zu vergrößern z.B. 100 (intern begrenzt)
      ;lf:    zusätzliche Linefeeds um Fensterhöhe zu vergrößern z.B. 5          
      
      Protected result, msg.MSGBOXPARAMS
      Protected handle = LoadLibraryEx_(@iconfile$, 0, #LOAD_LIBRARY_AS_DATAFILE) ;file$="" = handle=0
      
      text$ + Space(width) + LSet("", lf, #LF$)   ;Space + LF ändert Fenstergröße      
      
      With msg
         \cbSize = SizeOf(msg)
         \hwndOwner = 0             ;oder GetForegroundWindow_()
         \hInstance = handle        ;wenn 0 kein Icon, ausser #IDI_xxx als iconresnr
         \lpszText = @text$
         \lpszCaption = @title$
         \dwStyle = flags           ;alle Messagebox Flags
         \lpszIcon = iconresnr      ;ResourcenNr. #MB_USERICON muß bei flags gesetzt sein
      EndWith
      
      hookid = SetWindowsHookEx_(#WH_CBT, @MessageBoxProc(), #Null, GetCurrentThreadId_())      
      result = MessageBoxIndirect_(@msg)      
      
      FreeLibrary_(handle)      
      If iconflag: iconfile$="": iconresnr=0: EndIf   ;iconflag global, siehe MessageBoxIcon()
      
      ProcedureReturn result
   EndProcedure
   
EndModule

UseModule MessageBox

fonttextid = FontID(LoadFont(#PB_Any, "Consolas", 18))

For j = 1 To 12
   txt$ + RSet(Str(j),2) + #TAB$
   txt$ + RSet(Str(Random(999)),4) + #TAB$
   txt$ + RSet(Str(Random(999)),5) + #TAB$
   txt$ + RSet(Str(Random(999)),5) + #TAB$
   txt$ + RSet(Str(Random(999)),5) + #LF$   
Next

MessageBoxIcon("shell32.dll", 16771)   ;oder
MessageBoxIcon("ieframe.dll", 30788)

MessageBoxIcon("pifmgr.dll", 39)
MessageBoxText(#IDOK, "Save", 80, #BS_LEFT)
MessageBoxText(#IDCANCEL, "nein", 80, #BS_RIGHT)
result = MessageBox("Change Font + Pos", txt$, #MB_OKCANCEL|#MB_DEFBUTTON2|#MB_USERICON, 100, 5)

oldfont = MessageBoxFont(fonttextid)
MessageBoxText(#IDOK, "ja ja", 60, #BS_LEFT)
MessageBoxIcon("", #IDI_WARNING)
MessageBoxIcon("pifmgr.dll", 3)
result = MessageBox("Change Font + Pos", "Sortieren ?", #MB_OKCANCEL|#MB_USERICON, 40,2)

MessageBoxFont(oldfont)
MessageBoxText(#IDYES, "rot", 60, #BS_LEFT)
MessageBoxText(#IDNO, "gelb", 60, #BS_CENTER)
MessageBoxText(#IDCANCEL, "grün", 60, #BS_RIGHT)
MessageBoxIcon("pifmgr.dll", 33)
result = MessageBox("Change Font + Pos", "Farbe ?", #MB_YESNOCANCEL|#MB_USERICON, 50)

MessageRequester("Original", "das Original", #PB_MessageRequester_YesNoCancel|#MB_ICONWARNING)
PS: Tool um Resourcennummern aus DLL zu holen folgt

Re: Messagebox mit anderem Font, Buttontext und Icon

Verfasst: 16.04.2020 23:38
von Kurzer
Hey klasse, danke für das Beispiel, hjbremer. :allright:

Da fiel mir beim Ansehen ein, dass ich mir vor langer Zeit auch mal einen Messagerequester nachgebaut habe, da ich einen mit mehr als 3 Buttons benötigte.

Nicht sehr elegant, auch weil er einen eigene Eventloop benötigt und eigene KeyboardsShortcuts anlegt und wieder entfernt, aber komplett ohne API und er tat seinerzeit seinen bescheidenen Dienst. :)

EDIT 18.04.20: ich sehe gerade, dass doch API Aufrufe drin sind. also doch Windows only. :-/

Code: Alles auswählen

Procedure.i MessageRequesterCustom(sTitle.s, sText.s, sAllButtonsText.s, iButtonMinsize.i, iDefaultButton.i, iIcon.i, iParentWindow.i)
  ; +-----------------------------------------------------------------
  ; |Description  : Darstellen eines benutzerdefinierten, modalen Requesters mit bis zu 10 verschiedenen Antwort-Buttons
  ; |Arguments    : sTitle         : Titel des Requesters
  ; |             : sText          : Text des Requesters (TABs werden nicht unterstützt!)
  ; |             : sAllButtonsText: Text der in den Buttons erscheint (mehrere Texte werden mit "|" getrennt)
  ; |             : iButttonMinsize: Minimale Breite eines Buttons in Pixeln (Standard = 75)
  ; |             : iDefaultButtton: Nr. des Defaultbuttons, der optisch hervorgehoben wird und mit Return auswählbar ist
  ; |             : iIcon          : Konstante für die Darstellung des RequesterIcons (IDI_APPLICATION, IDI_ASTERISK, IDI_EXCLAMATION, IDI_HAND, IDI_QUESTION, IDI_WINLOGO)
  ; |             : iParentWindow  : Handle des übergeordneten Fensters, dessen Eingaben blockiert werden
  ; |Result       : Nr. des Knopfes, der gedrückt wurde (beginnend bei 0) bzw. -1, wenn der Requester mit [X] oder ESC geschlossen wurde
  ; +-----------------------------------------------------------------
	Protected iRequester.i, iTextGadget.i, iImageGadget.i
	Protected iParentWindowDC.i
	Protected iEvent.i, iEventMenu.i, iEventWindow.i, iEventGadget.i, iEventType.i, iCount.i, iPosition.i, iLastPosition.i, iLongestLinePosition1.i, iLongestLinePosition2.i, iQuit.i = -1
	Protected iAllButtonsWidth.i, iButtonPositionX.i, iMaxButtons.i = -1, iTextLen.i, iTextPositionX.i, iWindowWidth.i, iWindowHeight.i
	Protected sButtonText.s, sLongestLineText.s
	Protected stTextsize.SIZE
	Protected Dim iButton.i(9), Dim iButtonWidth.i(9), Dim sButtonText.s(9)

	#MRC_ESC = 1
	#MRC_Return = 2
	#MRC_CursorLeft = 3
	#MRC_CursorRight = 4
	
	; Evtl. vorhandenen #CR$ löschen, so daß nur noch #LF$ als Zeilenumnbruchzeichen bleibt
	ReplaceString(sText, #CR$, "")

	; Icon Konstante umwandeln und Textoffset ermitteln
	iTextPositionX = 60
	Select iIcon 
	Case #MB_ICONASTERISK, #MB_ICONINFORMATION
		iIcon = #IDI_ASTERISK
	Case #MB_ICONEXCLAMATION
		iIcon = #IDI_EXCLAMATION	
		Case #MB_ICONERROR, #MB_ICONHAND, #MB_ICONSTOP
			iIcon = #IDI_HAND
	Case #MB_ICONQUESTION, #MB_ICONWARNING
		iIcon = #IDI_QUESTION
	Case #IDI_WINLOGO
		;Bleibt so
	Case #IDI_APPLICATION
		;Bleibt so
	Default
		iTextPositionX = 10
	EndSelect

	; Die längste Zeile aus sText ermitteln
	iTextLen = Len(sText)
	Repeat
		iPosition = FindString(sText, #LF$, iPosition + 1)
		If iPosition = 0
			iPosition = iTextLen
		EndIf
		If (iPosition - iLastPosition) > (iLongestLinePosition2 - iLongestLinePosition1)
			iLongestLinePosition1 = iLastPosition
			iLongestLinePosition2 = iPosition
		EndIf
		iLastPosition = iPosition
	Until iPosition = iTextLen
	sLongestLineText = Mid(sText, iLongestLinePosition1, (iLongestLinePosition2 - iLongestLinePosition1))

	iParentWindowDC = GetDC_(WindowID(iParentWindow))

	; Maximal benötigte Breite des Fensters ermitteln
	iTextLen = Len(sLongestLineText)
	GetTextExtentPoint32_(iParentWindowDC, sLongestLineText, iTextLen, @stTextSize.SIZE)
	iWindowWidth = stTextsize\cx + iTextPositionX - iTextLen * 1.6

	; Breite der Buttons in Pixeln ermitteln (auf Basis des DCs des übergeordneten Fensters) und Buttontexte extrahieren
	For iCount = 0 To 9
		sButtonText = StringField(sAllButtonsText, iCount + 1, "|")
		If sButtonText <> ""
			iTextLen = Len(sButtonText)
			GetTextExtentPoint32_(iParentWindowDC, @sButtonText, iTextLen, @stTextSize.SIZE)
			iButtonWidth(iCount) = stTextsize\cx + 10 - iTextLen * 1.6
			If iButtonWidth(iCount) < iButtonMinsize : iButtonWidth(iCount) = iButtonMinsize : EndIf
			iAllButtonsWidth + iButtonWidth(iCount) + 10
			sButtonText(iCount) = sButtonText
			iMaxButtons + 1
		EndIf
	Next iCount

	; Falls die Buttons breiter sind als die errechnete Fensterbreite, dann muß diese angepaßt werden
	If iAllButtonsWidth > iWindowWidth
		iWindowWidth = iAllButtonsWidth + 10
		iButtonPositionX = 10
	Else
		iButtonPositionX = (iWindowWidth - iAllButtonsWidth) / 2
	EndIf
	
	; Maximal benötigte Höhe des Fensters ermitteln (Zählen der Zeilenumbrüche und multiplizieren mit Texthöhe mal Faktor)
	iWindowHeight = CountString(sText, #LF$)
	If iWindowHeight > 2
		iWindowHeight = 105 + (iWindowHeight - 2) * (stTextsize\cy * 0.8)
	Else
		iWindowHeight = 105
	EndIf

	ReleaseDC_(iParentWindow, iParentWindowDC)
	
	iRequester = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, iWindowWidth, iWindowHeight, sTitle, #PB_Window_SystemMenu | #PB_Window_WindowCentered | #PB_Window_Invisible, WindowID(iParentWindow))
	If iRequester
		DisableWindow(iParentWindow, 1)
		
		AddKeyboardShortcut(iRequester, #PB_Shortcut_Escape, #MRC_ESC)
		AddKeyboardShortcut(iRequester, #PB_Shortcut_Return, #MRC_Return)
		AddKeyboardShortcut(iRequester, #PB_Shortcut_Left, #MRC_CursorLeft)
		AddKeyboardShortcut(iRequester, #PB_Shortcut_Right, #MRC_CursorRight)
		AddKeyboardShortcut(iRequester, #PB_Shortcut_Tab|#PB_Shortcut_Shift, #MRC_CursorLeft)
		AddKeyboardShortcut(iRequester, #PB_Shortcut_Tab, #MRC_CursorRight)
		
		; Buttons platzieren
		For iCount = 0 To iMaxButtons
			iButton(iCount) = ButtonGadget(#PB_Any, iButtonPositionX, iWindowHeight - 35, iButtonWidth(iCount), stTextsize\cy + 7, sButtonText(iCount))
			iButtonPositionX + iButtonWidth(iCount) + 10
		Next iCount
		If iDefaultButton <= iMaxButtons
			SendMessage_(GadgetID(iButton(iDefaultButton)), #BM_SETSTYLE, #BS_DEFPUSHBUTTON|#BS_TEXT|#BS_PUSHBUTTON, #False)
			SetActiveGadget(iButton(iDefaultButton))
		EndIf

		; Messagebeep erzeugen
		MessageBeep_(iIcon)

		; Icon und Text platzieren
		If iTextPositionX > 10
			iImageGadget = ImageGadget(#PB_Any, 10, 10, 32, 32, LoadIcon_(#Null, iIcon))
		EndIf
		iTextGadget = TextGadget(#PB_Any, iTextPositionX, 20, iWindowWidth - iTextPositionX , iWindowHeight - 55, sText)

		; Fenster darstellen
		HideWindow(iRequester, 0)
		
		Repeat
		  iEvent       = WaitWindowEvent(25)
		  iEventType   = EventType()
		  iEventWindow = EventWindow()
		  iEventGadget = EventGadget()
		  iEventMenu   = EventMenu()
		    
		  If iEventWindow = iRequester 

 				If iEvent = #PB_Event_Menu 
 					Select iEventMenu 
 					Case #MRC_ESC															; Taste ESC wurde gedrückt
 		  			iEvent = #PB_Event_CloseWindow

 					Case #MRC_Return															; Taste Return wurde gedrückt
 		  			iQuit = iButton(iDefaultButton)
 		  			
 					Case #MRC_CursorLeft													; Cursor Links wurde gedrückt
						If iDefaultButton = 0
 		  				iDefaultButton = iMaxButtons
 		  			Else
 		  				iDefaultButton - 1
						EndIf
 					Case #MRC_CursorRight													; Cursor Rechts wurde gedrückt
						If iDefaultButton = iMaxButtons
 		  				iDefaultButton = 0
 		  			Else
 		  				iDefaultButton + 1
						EndIf
					EndSelect

					; Buttons refreshen
					For iCount = 0 To iMaxButtons
		  				SendMessage_(GadgetID(iButton(iCount)), #BM_SETSTYLE, #BS_TEXT|#BS_PUSHBUTTON|#BS_PUSHLIKE, #True)
				  Next iCount
  				SendMessage_(GadgetID(iButton(iDefaultButton)), #BM_SETSTYLE, #BS_DEFPUSHBUTTON|#BS_TEXT|#BS_PUSHBUTTON|#BS_PUSHLIKE, #True)
  				SetActiveGadget(iButton(iDefaultButton))
	  		EndIf
	  		
		  	If iEvent = #PB_Event_Gadget And iEventType = #PB_EventType_LeftClick And iEventGadget <> iImageGadget
					iQuit = iEventGadget
				EndIf
			EndIf
		  
		Until iQuit > -1 Or iEvent = #PB_Event_CloseWindow
 
		; Ermitteln des gedrückten Buttons
		If iEvent <> #PB_Event_CloseWindow
			For iCount = 0 To iMaxButtons
				If iButton(iCount) = iQuit
					iQuit = iCount
				EndIf
		  Next iCount
	  EndIf

		RemoveKeyboardShortcut(iRequester, #PB_Shortcut_Tab)
		RemoveKeyboardShortcut(iRequester, #PB_Shortcut_Tab|#PB_Shortcut_Shift)
		RemoveKeyboardShortcut(iRequester, #PB_Shortcut_Right)
		RemoveKeyboardShortcut(iRequester, #PB_Shortcut_Left)
		RemoveKeyboardShortcut(iRequester, #PB_Shortcut_Return)
		RemoveKeyboardShortcut(iRequester, #PB_Shortcut_Escape)

		DisableWindow(iParentWindow, 0)
		CloseWindow(iRequester)

	EndIf
 	
	ProcedureReturn iQuit
	
EndProcedure

;*************************************************************************
;* Testcode
;*************************************************************************

EnableExplicit

Define iMainWindow.i, sMoreText.s

iMainWindow = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 600, 600, "Ich bin das übergeordnete Fenster", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
sMoreText + "Darts ist zuletzt auch außerhalb Großbritanniens immer beliebter geworden." + #LF$ + #CR$
sMoreText + sMoreText + sMoreText + sMoreText + sMoreText + sMoreText + sMoreText

MessageRequesterCustom("CUSTOM-REQUESTER", "Erste Zeile." + #LF$ + sMoreText, "Mach dies!|Mach jenes|Ach nee, mach doch lieber das", 75, 0, #MB_ICONERROR, iMainWindow)
MessageRequesterCustom("CUSTOM-REQUESTER", "Erste Zeile.", "OK|Noch einmal versuchen|Abbrechen", 75, 0, #MB_ICONASTERISK, iMainWindow)
MessageRequesterCustom("CUSTOM-REQUESTER", "Erste Zeile." + #LF$ + "3" + #LF$ + "3", "Knopf 1|Knopf 2", 75, 0, #MB_ICONEXCLAMATION, iMainWindow)
MessageRequesterCustom("CUSTOM-REQUESTER", "Erste Zeile." + #LF$ + "4" + #LF$ + "4" + #LF$ + "4", "Mach dies!|Mach jenes|Ach nee, mach doch lieber das", 75, 0, #MB_ICONMASK, iMainWindow)
MessageRequesterCustom("CUSTOM-REQUESTER", "Erste Zeile." + #LF$ + "5" + #LF$ + "5" + #LF$ + "5" + #LF$ + "5" + #LF$ + "5", "1|2|3|4|5|6|7|8|9|Abbrechen", 20, 0, #IDI_APPLICATION, iMainWindow)
End
Gruß Kurzer

Re: Messagebox mit anderem Font, Buttontext und Icon

Verfasst: 17.04.2020 20:28
von Thorsten1867
hjbremer hat geschrieben:Hier eine Version Windows only ( gibts noch was anderes ? :mrgreen: )
Denke schon, z.B. eine all OS Version ..... 8)

Bild

Aber ich denke, vielleicht muss ich noch die Idee mit den benutzerdefinierten Symbolen ergänzen. :wink:

Re: Messagebox mit anderem Font, Buttontext und Icon

Verfasst: 18.04.2020 12:46
von Thorsten1867
Danke für die guten Ideen. :allright:

Habe sozusagen das "Best of" beider Requester übernommen:
  • benutzerdefinierte Symbole (hjbremer)
  • benutzerdefinierte Buttons (Kurzer)