Requester's font

Just starting out? Need help? Post your questions and find answers here.
SkyManager
Enthusiast
Enthusiast
Posts: 339
Joined: Tue Jan 30, 2007 5:47 am
Location: Hong Kong

Requester's font

Post by SkyManager »

Does anybody know how to change the font of the requesters, such as MessageRequester, FontRequester, etc?
ebs
Enthusiast
Enthusiast
Posts: 530
Joined: Fri Apr 25, 2003 11:08 pm

Re: Requester's font

Post 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")
User avatar
Olliv
Enthusiast
Enthusiast
Posts: 542
Joined: Tue Sep 22, 2009 10:41 pm

Re: Requester's font

Post 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.
User avatar
RSBasic
Moderator
Moderator
Posts: 1218
Joined: Thu Dec 31, 2009 11:05 pm
Location: Gernsbach (Germany)
Contact:

Re: Requester's font

Post by RSBasic »

@ebs
Nice code!
Image
Image
User avatar
skywalk
Addict
Addict
Posts: 3972
Joined: Wed Dec 23, 2009 10:14 pm
Location: Boston, MA

Re: Requester's font

Post 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.
The nice thing about standards is there are so many to choose from. ~ Andrew Tanenbaum
Little_man
Enthusiast
Enthusiast
Posts: 143
Joined: Fri Mar 29, 2013 4:55 pm
Location: The Netherland

Re: Requester's font

Post by Little_man »

How to "center" the above code on a existing window ?.

Kind regards,

Little-man
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4747
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Re: Requester's font

Post 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.
Amateur Radio, D-STAR/VK3HAF
ebs
Enthusiast
Enthusiast
Posts: 530
Joined: Fri Apr 25, 2003 11:08 pm

Re: Requester's font

Post 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)
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4747
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Re: Requester's font

Post 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:):)
Amateur Radio, D-STAR/VK3HAF
Post Reply