La solution serait d'employer l'événement #WM_NCPAINT pour colorier nous-mêmes la zone :
Code : Tout sélectionner
Structure Position
x1.l
y1.l
x2.l
y2.l
EndStructure
Global OldWndProc,PosMenu.Position,hBrush,hBrushO
LoadFont(1, "Times New Roman", 12)
;/
Procedure GetPosition(hwnd)
GetWindowRect_(hwnd,rect.RECT)
PosMenu\x1 = GetSystemMetrics_(#SM_CXDLGFRAME) + GetSystemMetrics_(#SM_CXBORDER) + 50
PosMenu\y1 = GetSystemMetrics_(#SM_CYCAPTION) + GetSystemMetrics_(#SM_CYDLGFRAME) + GetSystemMetrics_(#SM_CYBORDER)
PosMenu\x2 = rect\right - rect\left - GetSystemMetrics_(#SM_CXDLGFRAME) - GetSystemMetrics_(#SM_CXBORDER)
PosMenu\y2 = PosMenu\y1 + GetSystemMetrics_(#SM_CYMENUSIZE)
EndProcedure
Procedure DessinMenu(hwnd)
GetPosition(hwnd)
hdc = GetWindowDC_(hwnd)
SetRect_(rect.RECT,PosMenu\x1,PosMenu\y1,PosMenu\x2,PosMenu\y2)
FillRect_(hdc,rect, hBrush)
ReleaseDC_(hwnd, hdc)
EndProcedure
Procedure WndProc(hwnd, uMsg, wParam, lParam)
Select uMsg
Case #WM_NCACTIVATE
Result = CallWindowProc_(OldWndProc, hwnd, uMsg, wParam, lParam)
DessinMenu(hwnd)
Case #WM_NCPAINT
DessinMenu(hwnd)
GetWindowRect_(hwnd,rect.RECT)
hRegion = CreateRectRgn_(rect\left+PosMenu\x1,rect\top+PosMenu\y1,rect\left+PosMenu\x2,rect\top+PosMenu\y2)
CombineRgn_(wParam, wParam, hRegion, #RGN_DIFF)
Result = CallWindowProc_(OldWndProc, hwnd, uMsg, wParam, lParam)
DeleteObject_(hRegion)
Case #WM_MEASUREITEM
*lpmis.MEASUREITEMSTRUCT = lParam
If *lpmis\CtlType= #ODT_MENU
*lpmis\itemWidth = 50
EndIf
ProcedureReturn #True
Case #WM_DRAWITEM
*lpdis.DRAWITEMSTRUCT = lParam
If *lpdis\CtlType= #ODT_MENU
Holdmode = SetBkMode_(*lpdis\hdc,#TRANSPARENT)
hOldFont = SelectObject_(*lpdis\hdc,FontID(1))
Holdcolor = SetTextColor_(*lpdis\hdc,0)
hpencadre=CreatePen_(#PS_SOLID,1,0)
holdpen = SelectObject_(*lpdis\hdc,hpencadre)
Constante = #DT_LEFT | #DT_VCENTER
If *lpdis\itemState & #ODS_SELECTED
If *lpdis\itemState & 4 = 0
;/ Menu ouvert
Rectangle_(*lpdis\hdc,*lpdis\rcItem\left,*lpdis\rcItem\top,*lpdis\rcItem\right,*lpdis\rcItem\bottom)
*lpdis\rcItem\left = *lpdis\rcItem\left + 6
DrawText_(*lpdis\hdc, "Projet", -1, *lpdis\rcItem ,Constante)
EndIf
ElseIf *lpdis\itemState & 64
;/ Over menubar
FillRect_(*lpdis\hdc,*lpdis\rcItem, hBrushO)
*lpdis\rcItem\left = *lpdis\rcItem\left + 6
DrawText_(*lpdis\hdc,"Projet",-1,*lpdis\rcItem,Constante)
Else
;/ Defaut
FillRect_(*lpdis\hdc,*lpdis\rcItem, hBrush)
*lpdis\rcItem\left = *lpdis\rcItem\left + 6
DrawText_(*lpdis\hdc, "Projet", -1, *lpdis\rcItem ,Constante)
EndIf
DeleteObject_(hpencadre)
SelectObject_(*lpdis\hdc, hOldFont)
SelectObject_(*lpdis\hdc, holdpen)
SetTextColor_(*lpdis\hdc, Holdcolor)
SetBkMode_(*lpdis\hdc, Holdmode)
ProcedureReturn #True
EndIf
Default
Result = CallWindowProc_(OldWndProc, hwnd, uMsg, wParam, lParam)
EndSelect
ProcedureReturn Result
EndProcedure
Procedure SetMenu(hwnd)
hMenu = CreateMenu(0,hwnd)
If hMenu
MenuTitle("Projet")
ItemCount.l = GetMenuItemCount_(hMenu)-1
mii.MENUITEMINFO
mii\cbSize = SizeOf(MENUITEMINFO)
mii\fMask = #MIIM_TYPE
mii\fType = #MFT_OWNERDRAW
SetMenuItemInfo_(hMenu, ItemCount, #True, @mii)
MenuItem(1, "Ouvrir" +Chr(9)+"Ctrl+O")
MenuItem(2, "Enregistrer" +Chr(9)+"Ctrl+E")
MenuItem(3, "Enregistrer sous"+Chr(9)+"Ctrl+R")
MenuItem(4, "Fermer" +Chr(9)+"Ctrl+F")
DessinMenu(hwnd)
EndIf
EndProcedure
If OpenWindow(0,0,0,400,300,"Menu",#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
OldWndProc = SetWindowLong_(WindowID(0) , #GWL_WNDPROC, @WndProc())
GetPosition(WindowID(0))
h = GetSystemMetrics_(#SM_CYMENUSIZE)
I = 120 / h
;/ Image 1
CreateImage(1, 10,PosMenu\y2)
If StartDrawing( ImageOutput(1))
For y=0 To h : Line(0,PosMenu\y1+y,10, 0,RGB(255-y*I,255-y*I,255-y*I)) : Next
StopDrawing()
EndIf
hBrush = CreatePatternBrush_(ImageID(1))
;/ Image 2
CreateImage(2, 10,PosMenu\y2)
If StartDrawing( ImageOutput(2))
For y=0 To h : Line(0,PosMenu\y1+y,10, 0,RGB(225-y*I,225-y*I,225-y*I)) : Next
StopDrawing()
EndIf
hBrushO = CreatePatternBrush_(ImageID(2))
;/
SetMenu(WindowID(0))
Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
DeleteObject_(hBrush)
DeleteObject_(hBrushO)
End