Page 1 of 1

Requester's font

Posted: Fri Dec 07, 2018 2:56 am
by SkyManager
Does anybody know how to change the font of the requesters, such as MessageRequester, FontRequester, etc?

Re: Requester's font

Posted: Fri Dec 07, 2018 3:29 pm
by ebs
Here's my solution for MessageRequesters (Windows only), cobbled together from various tips found here.
It's not elegant, but it works! :D

The code Text + Space(1.0 * Len(Text)) + #LF$ + #LF$ + " " is my attempt to allow more space for the bigger font.
It requires some trial and error to make sure the text fits, especially because it varies depending on the font you use, as well as the Windows version.
If anyone knows how to have Windows automatically adjust the MessageRequester size based on the font, I would love to know.

Code: Select all

;- dialog hook to set font in MessageRequester
Global Hook.L
Global IDYesText.S, IDNoText.S, IDCancelText.S

Global FontID_12Regular.L, FontID_12Bold.L

Procedure ChangeTextFont(hwnd, lParam)
  ; find messagebox text control and buttons
  CN.S = Space(#MAX_PATH)
  GetClassName_(hwnd, @CN, #MAX_PATH)
  Select UCase(CN)
    Case "STATIC"
      If GetWindowLong_(hwnd, #GWL_STYLE) & #SS_BITMAP = 0
        ; change font
        SendMessage_(hwnd, #WM_SETFONT, FontID_12Regular, 1)
        UnhookWindowsHookEx_(Hook)
        ProcedureReturn #False
      EndIf
    Case "BUTTON"
      If GetWindowLong_(hwnd, #GWL_STYLE) & #SS_BITMAP = 0
        ; change font
        SendMessage_(hwnd, #WM_SETFONT, FontID_12Bold, 1)
        ProcedureReturn #True
      EndIf
  EndSelect
  
  ProcedureReturn #True
EndProcedure

Procedure.L HookProc(nCode, wParam, lParam)
  If nCode = #HCBT_ACTIVATE
    ; find text control and change font
    EnumChildWindows_(wParam, @ChangeTextFont(), 0)
    ; change button(s) text
    If IDYesText
      SetDlgItemText_ (wParam, #IDYES, IDYesText)
      SetDlgItemText_ (wParam, #IDNO, IDNoText)
      SetDlgItemText_ (wParam, #IDCANCEL, IDCancelText)
    EndIf
    UnhookWindowsHookEx_ (Hook)
  EndIf
  
  ;ProcedureReturn CallNextHookEx_(Hook, nCode, wParam, lParam)
EndProcedure

;- message requester with customized font/button captions
Procedure.L MessageRequesterEBS(Title.S, Text.S, flags.L = #PB_MessageRequester_Ok, YesText.S = #Null$, NoText.S = #Null$, CancelText.S = #Null$)
  ; set button(s) text
  ; NB: "Yes" text controls all buttons:
  ; if set, ALL buttons are changed
  ; if empty, NO buttons are changed
  IDYesText = YesText
  IDNoText = NoText
  IDCancelText = CancelText
  
  Hook = SetWindowsHookEx_(#WH_CBT, @HookProc(), #Null, GetCurrentThreadId_())
  
  ; add more space for bigger font
  ; NB: specific changes for Windows 10!!!
  MaxLength.L = Len(Text) 
  result.L = MessageRequester(Title, Text + Space(1.0 * Len(Text)) + #LF$ + #LF$ + " ", flags) 
  
  ProcedureReturn result
EndProcedure

FontID_12Regular = LoadFont(0, "Tahoma", 12, #PB_Font_HighQuality)
FontID_12Bold = LoadFont(1, "Tahoma", 12, #PB_Font_Bold|#PB_Font_HighQuality)

MessageRequesterEBS("Change Font in Message Requester", "This is a bigger font (12 pt)" + #LF$ + "in a Message Requester", #MB_ICONINFORMATION|#PB_MessageRequester_YesNoCancel, "One", "Two", "Three")

Re: Requester's font

Posted: Fri Dec 07, 2018 7:10 pm
by Olliv
It seems a second internal effect can disturb gurj :

Code: Select all

Eax.L = $80000000
Define Rax.Q
Rax = Eax
Here, it seems that the higher 32 bits are set to the same status of Bit #31, what it seems to disturb some tests...

$FFFFFFFF80000000

"Normally" we could expect to this value :

$0000000080000000.

But the hardware is producing differently.

Re: Requester's font

Posted: Fri Dec 07, 2018 8:51 pm
by RSBasic
@ebs
Nice code!

Re: Requester's font

Posted: Sat Dec 08, 2018 8:57 pm
by skywalk
You need more code to change the MessageBox window contents. It is not cross platform and easier to create your own PB sticky window for such effects.

Re: Requester's font

Posted: Sat Dec 08, 2018 10:19 pm
by Little_man
How to "center" the above code on a existing window ?.

Kind regards,

Little-man

Re: Requester's font

Posted: Tue Dec 11, 2018 6:38 am
by Fangbeast
EBS, this is useful stuff. I am running my widescreen in 2560x1080 at 125% upscaling and requesters were still tiny so your code is very, very useful.

Just had to change "hook" to "chookie" and another third party code was using it already.

Re: Requester's font

Posted: Tue Dec 11, 2018 3:55 pm
by ebs
fangbeast,

Thanks!

A minor improvement to make the buttons slightly larger, so the text fits better.
Just add this line to the ChangeTextFont procedure, under the "Button" case:

Code: Select all

        ; adjust size
        SetWindowPos_(hwnd, 0, 0, 0, 70, 25, #SWP_NOMOVE|#SWP_NOZORDER)

Re: Requester's font

Posted: Tue Dec 11, 2018 8:40 pm
by Fangbeast
ebs wrote:fangbeast,

Thanks!

A minor improvement to make the buttons slightly larger, so the text fits better.
Just add this line to the ChangeTextFont procedure, under the "Button" case:

Code: Select all

        ; adjust size
        SetWindowPos_(hwnd, 0, 0, 0, 70, 25, #SWP_NOMOVE|#SWP_NOZORDER)
Will do that today. I used a few requesters in my Keeper code and will 'massage' them today:):)