Messagebox mit anderem Font, Buttontext und Icon

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Messagebox mit anderem Font, Buttontext und Icon

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Messagebox mit anderem Font, Buttontext und Icon

Beitrag 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
Zuletzt geändert von Kurzer am 18.04.2020 13:55, insgesamt 1-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Messagebox mit anderem Font, Buttontext und Icon

Beitrag 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:
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1359
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Re: Messagebox mit anderem Font, Buttontext und Icon

Beitrag von Thorsten1867 »

Danke für die guten Ideen. :allright:

Habe sozusagen das "Best of" beider Requester übernommen:
  • benutzerdefinierte Symbole (hjbremer)
  • benutzerdefinierte Buttons (Kurzer)
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten