Change Notepad's menu title background color?

Windows specific forum
BarryG
Addict
Addict
Posts: 3322
Joined: Thu Apr 18, 2019 8:17 am

Change Notepad's menu title background color?

Post by BarryG »

I'm wondering if there's any way to change a third-party window's menu title background color? Like change Notepad's menu titles to have a red background? I can get the menu handle, but haven't been able to change the colors yet. Any tips?
Last edited by BarryG on Mon May 01, 2023 3:10 am, edited 2 times in total.
firace
Addict
Addict
Posts: 902
Joined: Wed Nov 09, 2011 8:58 am

Re: Change Notepad's menu background color?

Post by firace »

Have you tried tweaking this code (by luis):

Code: Select all

#MIM_BACKGROUND = 2
#MIM_APPLYTOSUBMENUS =  $80000000 ; added

Structure myMENUINFO Align #PB_Structure_AlignC ; added
  cbSize.l
  fMask.l
  dwStyle.l
  cyMax.l 
  hbrBack.i ; changed to HBRUSH, handle size -> pointer size
  dwContextHelpId.l
  *dwMenuData ; changed to ULONG_PTR -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa384255%28v=vs.85%29.aspx
EndStructure

Debug SizeOf(myMENUINFO)

hMenuBrushBG = CreateSolidBrush_(RGB(255,255,0))

With mi.myMENUINFO
  \cbSize = SizeOf(myMENUINFO)
  \fMask = #MIM_BACKGROUND | #MIM_APPLYTOSUBMENUS ; added
  \hbrBack = hMenuBrushBG
EndWith

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  If CreateMenu(0, WindowID(0))
    MenuTitle("Menü 1")
      MenuItem(1,"Item 1")
    MenuTitle("Menü 2")
      MenuItem(2,"Item 2")
  EndIf
  
  Debug SetMenuInfo_(MenuID(0), mi)
  DrawMenuBar_(WindowID(0))
Repeat
EventID=WaitWindowEvent()
If EventID=#PB_Event_CloseWindow
  DeleteObject_(hMenuBrushBG)
  Quit=1
EndIf
Until Quit=1
EndIf
BarryG
Addict
Addict
Posts: 3322
Joined: Thu Apr 18, 2019 8:17 am

Re: Change Notepad's menu title background color?

Post by BarryG »

Sorry, I actually meant the menu title background color of a third-party menu, not the drop-down menus itself. Edited my post to clarify.

I looked at luis' code but don't see how that would be applied to a third-party window like Notepad?
AZJIO
Addict
Addict
Posts: 1360
Joined: Sun May 14, 2017 1:48 am

Re: Change Notepad's menu title background color?

Post by AZJIO »

Code: Select all

EnableExplicit

#MIM_MAXHEIGHT = $1
#MIM_BACKGROUND = $2
#MIM_HELPID = $4
#MIM_MENUDATA = $8
#MIM_STYLE = $10
#MIM_APPLYTOSUBMENUS = $80000000

#MNS_NOCHECK = $80000000
; #MNS_CHECKORBMP = $4000000

Structure myMENUINFO Align #PB_Structure_AlignC ; added
	cbSize.l
	fMask.l
	dwStyle.l
	cyMax.l
	hbrBack.i ; changed to HBRUSH, handle size -> pointer size
	dwContextHelpId.l
	*dwMenuData ; changed to ULONG_PTR -> http://msdn.microsoft.com/en-us/library/windows/desktop/aa384255%28v=vs.85%29.aspx
EndStructure

Structure ResStr
	s.s
	r.s
	slen.i
	rlen.i
	hwnd.l
	match.l
	type.l
	instance.l
EndStructure

Enumeration
	#Title
	#Class
EndEnumeration

; https://www.purebasic.fr/english/viewtopic.php?t=80897
; Finding Window
Procedure.l enumChildren(hwnd.l, *s.ResStr)
	Static n.l = 0
	If hwnd
		Select *s\type
			Case 0
				GetWindowText_(hwnd, @*s\r, *s\rlen)
			Case 1
				GetClassName_(hwnd, @*s\r, *s\rlen)
		EndSelect
		Select *s\match
			Case 0
				If *s\r = *s\s
					n + 1
					If n = *s\instance
						n = 0
						Debug *s\r
						*s\hwnd = hwnd
						ProcedureReturn 0
					EndIf
				EndIf
			Case 1
				If Left(*s\r, *s\slen) = *s\s
					n + 1
					If n = *s\instance
						n = 0
						Debug *s\r
						*s\hwnd = hwnd
						ProcedureReturn 0
					EndIf
				EndIf
			Case 2
				If FindString(*s\r, *s\s, 1, #PB_String_NoCase)
					n + 1
					If n = *s\instance
						n = 0
						Debug *s\r
						*s\hwnd = hwnd
						ProcedureReturn 0
					EndIf
				EndIf
		EndSelect
		ProcedureReturn 1
	EndIf
	n = 0
	ProcedureReturn 0
EndProcedure

; type
; 	0 - Title
; 	1 - Class
; match
; 	0 - exact match
; 	1 - match from start
; 	2 - the word occurs in the title
Procedure.l WinGetHandle(hwnd, text.s, instance = 1, type = 0, match = 0)
	Protected s.ResStr
	s\rlen = 256
	s\r = Space(s\rlen)
	s\s = text
	s\slen = Len(text)
	s\match = match
	s\type = type
	s\instance = instance
	EnumChildWindows_(hwnd, @enumChildren(), @s)
	ProcedureReturn s\hwnd
EndProcedure

Define hwnd, hMenu, hSubMenu, Count

Define hMenuBrushBG
Define mi.myMENUINFO
Define i


RunProgram("Notepad")
Delay(1000)
; End

hwnd = WinGetHandle(0, "Notepad", 1, #Class, 1) ; Properties
Debug Hex(hwnd)
If hwnd
	hMenu = GetMenu_(hwnd)
	Debug Hex(hMenu)
	Count = GetMenuItemCount_(hMenu)
; 	hSubMenu = GetSubMenu_(hMenu, 0)
; 	Debug Hex(hSubMenu)
Else
	End
EndIf
; https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getsyscolor
; only For cached brushes, i.e. system ones
hMenuBrushBG = GetSysColorBrush_(#COLOR_INFOBK)

; With mi
; 	\cbSize = SizeOf(myMENUINFO)
; 	\fMask = #MIM_BACKGROUND | #MIM_HELPID | #MIM_MAXHEIGHT | #MIM_MENUDATA | #MIM_STYLE
; EndWith
; 
; GetMenuInfo_(hMenu, mi)

With mi
	\cbSize = SizeOf(myMENUINFO)
; 	\fMask = #MIM_BACKGROUND ; hSubMenu
	\fMask = #MIM_BACKGROUND | #MIM_APPLYTOSUBMENUS | #MIM_STYLE ; hwnd
	\hbrBack = hMenuBrushBG
	\dwStyle = #MNS_NOCHECK ; Remove if not needed (removes the field for the icon)
EndWith

; For i = 0 To Count - 1
; 	hSubMenu = GetSubMenu_(hMenu, i)
; 	SetMenuInfo_(hSubMenu, mi)
; Next

SetMenuInfo_(hMenu, mi)
; DrawMenuBar_(hwnd)
BarryG
Addict
Addict
Posts: 3322
Joined: Thu Apr 18, 2019 8:17 am

Re: Change Notepad's menu title background color?

Post by BarryG »

Thanks, getting close! I will see if I can work out the menu titles themselves now (unless you know a quick way?).
AZJIO
Addict
Addict
Posts: 1360
Joined: Sun May 14, 2017 1:48 am

Re: Change Notepad's menu title background color?

Post by AZJIO »

There is a GetMenuBarInfo function and a MENUBARINFO structure, but there are no elements in it that could change the background color.
If you try to access it as a menu item, then in the MENUITEMINFO structure there is also no way to set a color.
I usually look at AutoIt3 help and then look in the "Include" folder for the function files to understand how they are made and remake them in PureBasic. But also looking in "CodeArchiv".
BarryG
Addict
Addict
Posts: 3322
Joined: Thu Apr 18, 2019 8:17 am

Re: Change Notepad's menu title background color?

Post by BarryG »

Checking AutoIt sources is a good tip! Thanks; will have to start doing that. I often look at AutoHotkey scripts as well when I need help, or search StackOverflow.
Post Reply