Besoin de testeurs pour un nouveau menu

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Besoin de testeurs pour un nouveau menu

Message par nico »

Cela fait un petit moment déjà que j'ai commencé ce prog pour Erix14 (il doit vraiment se demander ce que je fout pour mettre autant de temps :lol: ), je reprend petit à petit la prog. Je met à disposition un exe pour que vous puissiez tester que l'affichage se déroule bien. Normalement il est prévu une lib, mais elle sortira pas dans l'immédiat.

Au delà de l'aspect, toutes les fonctions d'insertions de nouveaux items, de supression, de déplacement, de sauvegarde et chargement du menu sont codés mais pas disponible dans ce test.

Il se peut que les icones ne s'affichent pas correctement sur certains OS, tester sur Win98 et XP.

Il reste toujours le problème avec le Gadget MDI qui met la zone dans l'affichage.

Téléchargement ici: http://home.tele2.fr/purebasic/Menu_Erix14.zip


Un aperçu pour vous donner l'envie de l'essayer!

Image
AWEAR
Messages : 264
Inscription : ven. 28/oct./2005 8:20
Localisation : Mayotte ( 976 ), Océan Indien, France

Message par AWEAR »

C'est vraiment pas mal !! Je dirai même mieux c'est génial !

Alors 2-3 petites remarques :

-Quand je fais deux ou trois fois de suite Nouveau, le dernier puis les deux derniers menu (fenêtre et check) se mettent en surbrillance.
(pas en plein écran)

-Je ne sais pas si c'est voulu mais le "Check 1" ne fonctionne visiblement pas comme un check

-C'est tout simplement génial, j'adopte, beau travail. J'adore le tooltip qui s'affiche, mais par contre je trouve que le passage d'un menu avec la souris dessus à un menu sélectionné pourrais être un peu mieux (je fignole là) surtout pour le menu avec l'icone (?), mais bon ce n'est surement qu'un caprice personnel...
La vie est une rose dont il faut accepter les épines, mais la mienne est fannée, arrosée par le goût de mes larmes. (Soprano)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

Pas mal du tout !

Voici quelques résultats suspects sour Xp

- L’icône de Check1 n’apparaît pas
- Je ne sais pas si on doit s’attendre à un effet quand on clique sur "Ouvrir une nouvelle fenetre" dans le menu Fenetre?
- "Nouveau" dans le menu "Fichier" affiche un nouvel element "Nouveau Fichier" dans le menu principal
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Bon bolot Nico :!: :D

Même remarque que ci-dessus, surtout lorsque l'on fait plusieurs fois fichier/nouveau

Tu as essayé DrawMenuBar_()) ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Merci pour vos remarques! :)
...mais par contre je trouve que le passage d'un menu avec la souris dessus à un menu sélectionné pourrais être un peu mieux (je fignole là) surtout pour le menu avec l'icone (?)...
Tu parles du chois des couleurs, elles sont toutes personnalisables; je n'ai pas cherché c'est vrai à obtenir les meilleurs effets!

Lorsqu'on choisit une couleur pour la barre de titre, celle-ci ne fait pas tout l'écran, je l'ai voulu ainsi car l'API qui permet de faire ceci n'est pas compatible NT, alors j'ai opté pour un item de fin de menu avec un bord arrondi qui a la particularité d'afficher une icone au lieu d'un item et ne dispose que d'un élément de menu.

- Le check 1 ne fonctionne pas sur l'exe alors que dans mon source oui!
- et le problème de surbrillance, faut je regarde de plus près!

@Denis,
Avec DrawmenuBar cela ne change rien, ce serait alors plutôt du coté du traitement des messages dans ce cas!

Vous avez du remarquer que le shape (l'ombre d'un item de titre) n'est pas aussi bien fait que lorque la couleur de la barre de titre est uni; cela vient du dégradé de couleur lorsqu'on choisi cette option, je ne peux mieux faire.
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

Comment tu fait pour mettre en couleur le menu
trop fort le Nico
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bernard13 a écrit :Comment tu fait pour mettre en couleur le menu
trop fort le Nico
il l'a fait sous Paint !! :lol: :lol:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Ben oui, c'est bien sous Paint! :lol:
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Nico, tu penses pouvoir ajouter la possiblité d'avoir des textures perso ?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Des textures perso, comme des images perso?

C'est possible , mais je m'arrête là pour l'instant, j'ai perdu un temps fou à vouloir sans arrêt rajouter des trucs alors qu'il reste des bugs; mais je suis content d'avoir régler la sauvegarde, chargement du menu depuis un fichier ce qui me semble essentiel.

Pour faire bien, il faudrait que je réécrire une partie de mon code comme les options facultatives que permet la V4 entre autre!

-Pour le check1, j'avais laisser un debug
-Pour la surbrillance, ça le fait quand le curseur se retrouve sur la barre de titre après un click sur l'item, pas encore réussi à régler le problème.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Comme le problème de la surbrillance se déclenche uniquement à partir d'une commande d'un item, je le laisse de coté car l'ajout d'un menu de titre dans la pratique ne se fait jamais à partir d'un item de menu!
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

Bon bolot Nico :D
Lorsqu'on choisit une couleur pour la barre de titre, celle-ci ne fait pas tout l'écran, je l'ai voulu ainsi car l'API qui permet de faire ceci n'est pas compatible NT, alors j'ai opté pour un item de fin de menu avec un bord arrondi qui a la particularité d'afficher une icone au lieu d'un item et ne dispose que d'un élément de menu.
Personnellement, je trouve ça dommage :( surtout que l'on avait résolu le problème du décalage de la texture.
Ne pourrais-tu pas faire un truc comme ça :

Code : Tout sélectionner

si GetOSystem()=#WINNT : la barre de titre ne fait pas tout l'écran
sinon : la barre de titre fait tout l'écran
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Malheureusement, non, car NT repere l'API déclaré dans l'IAT et qui n'existe pas pour lui, à moins, à ce moment là de créé spécialement une dll pour cet appel.
erix14
Messages : 480
Inscription : sam. 27/mars/2004 16:44
Contact :

Message par erix14 »

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 
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Ok, j'ai repris ton principe :) et je l'ai adapté au code que j'ai remis en ligne.

Vous pouvez donc le re-tester.
Répondre