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