Page 1 sur 1

menu à droite de la window

Publié : dim. 10/févr./2008 21:06
par africanos
Bonjour à tout le monde ,

j'ai essayé de purebasiquer le code suivant qui est d'origine Visual Basic ,mais je n'arrive pas à atteindre ce but .
le code à pour objectif l'emplacement des menus à droite de la fenetre .Vous remerciant à l'avance de votre aide je vous salue bien:

Code : Tout sélectionner

Private Sub Form_Load()
' Tout le code suivant doit être placé dans l'évènement
' Form_Load de la fenêtre concernée.

' Déclaration des variables utilisées
Dim mnuMenuItem As MENUITEMINFO
Dim lgMenu As Long
Dim stBuffer As String * 80
' Récupère le handle du menu
lgMenu = GetMenu(Me.hwnd)
stBuffer = Space$(80)
' Initialisation de la variable
With mnuMenuItem
    .cbSize = Len(mnuMenuItem)
    .dwTypeData = stBuffer & Chr$(0)
    .fType = MF_STRING
    .cch = Len(mnuMenuItem.dwTypeData)
    .fState = MFS_DEFAULT
    .fMask = MIIM_ID Or MIIM_DATA Or MIIM_TYPE Or MIIM_SUBMENU
End With
' Mettre l'indice correspondant au menu à placer à droite à la place 1.
' Les indices de menu commencent à partir de 0.
' Cela ne concerne que les menu de premier niveau.
If GetMenuItemInfo(lgMenu, 1, True, mnuMenuItem) = 0 Then
  MsgBox "Erreur GetMenuItemInfo. " & Err.LastDllError, vbExclamation, "Erreur"
Else
    mnuMenuItem.fType = mnuMenuItem.fType Or MF_HELP
    If SetMenuItemInfo(lgMenu, 1, True, mnuMenuItem) = 0 Then
        MsgBox "Erreur SetMenuItemInfo. " & Err.LastDllError, vbExclamation, "Erreur"
    End If
End If
' Rafraîchissement du menu
DrawMenuBar (Me.hwnd)
End Sub

Publié : lun. 11/févr./2008 6:23
par Kwai chang caine
Bonjour AFRICANOS et bienvenue chez nous.

J'ai un code de FALKO (Der komissar :lol: Souvenir souvenir) du forum allemand qui met le menu à droite de la fenetre, mais toujours sur la barre de menu.
Car je ne sais pas si c'est la barre de menu ou les menus que tu veux mettre à droite.

Si ça peux te dépanner :

Code : Tout sélectionner

; German forum: http://robsite.de/php/pureboard/viewtopic.php?p=24985#24985
; Author: Falko
; Date: 19. December 2003

; Set the last menu item to the top-right corner...

;Menü mit Help rechts per API-Funktion und Structure. 
;Für Redraw habe ich einfach Menü aus und dann wieder eingeschaltet 


#MIIM_TYPE = 16 
#MFT_RIGHTJUSTIFY = 16384

LPTSTR.s="Hilfe Rechts" 
Eintrag.MENUITEMINFO 
Eintrag\cbSize = SizeOf(MENUITEMINFO) 
Eintrag\fMask = #MIIM_TYPE 
Eintrag\fType = #MFT_RIGHTJUSTIFY 
Eintrag\dwTypeData = @LPTSTR 
    
If OpenWindow(0, 100, 150, 595, 260, "PureBasic - Menu", #PB_Window_SystemMenu) 
  

  hMenu.l=CreateMenu(0, WindowID(0)) 
  If hMenu 
    MenuTitle("File") 
      MenuItem( 1, "&Load...") 
      MenuItem( 2, "Save") 
      MenuItem( 3, "Save As...") 

    MenuTitle("Bearbeiten") 
      MenuItem(4, "Markieren") 
    MenuTitle("Neu") 
      MenuItem(5, "oh je, jetzt mehr") 

    MenuTitle(""); Dummyplatzhalter eingefügt, damit SetMenuItem darauf zugreifen kann 
      MenuItem(6,"jetzt hast du hilfe") 
  EndIf 

; MenuTitle ein Label geben und rechts ausrichten 
SetMenuItemInfo_(hMenu,3,1,@Eintrag) ; Menütitel ist von 0-1-2-3 gerechnet 
HideMenu(0, 1) 
HideMenu(0, 0) 
    

  ; 
  ; This is the 'event loop'. All the user actions are processed here. 
  ; It's very easy to understand: when an action occurs, the EventID 
  ; isn't 0 and we just have to see what have happened... 
  ; 
  
  Repeat 

    Select WaitWindowEvent() 

      Case #PB_Event_Menu 

        Select EventMenu()  ; To see which menu has been selected 

          Case 11 ; About 
            MessageRequester("About", "Cool Menu example", 0) 
            
          Default 
            MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0) 

        EndSelect 

      Case #WM_CLOSE ; #PB_EventCloseWindow 
        Quit = 1 

    EndSelect 

  Until Quit = 1 

EndIf 
FreeMenu(0) 
End 
Bonne journée

Publié : mar. 12/févr./2008 11:47
par africanos
Bonjour à tout le monde ,
Merci bien Kwai chang caine et je suis fière d'être parmi vous.
le code que vous m'avez proposé m'a dépanné ,parceque ce que mon but c'est d'avoir la barre des menus toute entière à droite.
Aprés avoir modifié votre code ,j'ai le résultat ci- après,qui m'a bien aidé.
Merci une autre fois et je vous souhaite une bonne journée.

Code : Tout sélectionner

; German forum: http://robsite.de/php/pureboard/viewtopic.php?p=24985#24985
; Author: Falko
; Date: 19. December 2003

; Set the last menu item to the top-right corner...

;Menü mit Help rechts per API-Funktion und Structure.
;Für Redraw habe ich einfach Menü aus und dann wieder eingeschaltet


#MIIM_TYPE = 16
#MFT_RIGHTJUSTIFY = 16384

LPTSTR.s="Nouveau"

Eintrag.MENUITEMINFO
Eintrag\cbSize = SizeOf(MENUITEMINFO)
Eintrag\fMask = #MIIM_TYPE
Eintrag\fType = #MFT_RIGHTJUSTIFY
Eintrag\dwTypeData = @LPTSTR
   
If OpenWindow(0, 100, 150, 595, 260, "PureBasic - Menu", #PB_Window_SystemMenu)
 

  hMenu.l=CreateMenu(0, WindowID(0))
  If hMenu


    MenuTitle(""); Dummyplatzhalter eingefügt, damit SetMenuItem darauf zugreifen kann
      MenuItem(1,"Original")
    MenuTitle(""); Dummyplatzhalter eingefügt, damit SetMenuItem darauf zugreifen kann
      MenuItem(2,"Africanos") 
      MenuItem(3,"PureBasicos") 
     MenuTitle(""); Dummyplatzhalter eingefügt, damit SetMenuItem darauf zugreifen kann
      MenuItem(4,"Forum") 
      MenuItem(5,"Réponses")  
  EndIf

; MenuTitle ein Label geben und rechts ausrichten

SetMenuItemInfo_(hMenu,0,1,@Eintrag) ; Menütitel ist von 0-1-2-3 gerechnet
LPTSTR.s="autre"
SetMenuItemInfo_(hMenu,1,1,@Eintrag)
LPTSTR.s="Contribution"
SetMenuItemInfo_(hMenu,2,1,@Eintrag)
HideMenu(0, 1)
HideMenu(0, 0)
   

  ;
  ; This is the 'event loop'. All the user actions are processed here.
  ; It's very easy to understand: when an action occurs, the EventID
  ; isn't 0 and we just have to see what have happened...
  ;
 
  Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Menu

        Select EventMenu()  ; To see which menu has been selected

          Case 11 ; About
            MessageRequester("About", "Cool Menu example", 0)
           
          Default
            MessageRequester("Info", "MenuItem: "+Str(EventMenu()), 0)

        EndSelect

      Case #WM_CLOSE ; #PB_EventCloseWindow
        Quit = 1

    EndSelect

  Until Quit = 1

EndIf
FreeMenu(0)
End 

Publié : mar. 12/févr./2008 12:02
par Kwai chang caine
Merci bien Kwai chang caine et je suis fière d'être parmi vous.
Content de t'avoir aidé :wink:
C'est tellement rare, que j'arrive à aider quelqu'un :cry:
Sache que l'on est fier nous aussi, d'avoir un nouveau membre dans la famille :D
Et je te souhaite au nom de toute la famille qui parait pas nombreuse, car ils causent pas beaucoup comme moi :oops:, mais ils lisent presque tout et on la générosité d'aider le plus possible. 8)

Au fait, excuse moi cette question intrusive, mais en écrivant "Fiere" t'as fais une faute de frappe et tu voulais dire "Fier" ou bien le "e" à la fin, a toute sa raison d'etre :D

Publié : mar. 12/févr./2008 12:52
par africanos
Merci Kwai chang caine ,de votre remarque sur la faute de frappe peut être à cause de mon faible français parceque je suis Amazigh ,c'est ma langue parlée de tous les jours ,j'enseigne en arabe(je ne suis pas arabe) mais de temps en temps je lis et j'écris en français et anglais.
Revenons à nous moutons ,
Si vous essayez le dernier code vous remarquez que les textes des sous menus ne sont pas bien placés à droite ,donc il me faut encore plus d'effort pour avoir une sorte d'image miroir de la barre des menus.
d'autre part ,j'ai le même problème pour les onglets dans un PanelGadget.
Grâce à votre aide mon code et mon francçais :) seront améliorés
Bonne journée .

Publié : mar. 12/févr./2008 13:50
par Kwai chang caine
Pas de probleme, je trouve que tu parle tres bien le français.
J'ai meme cru que tu etait français de souche. 8)

Je vais t'expliquer pourquoi, j'ai fait cette remarque.
Je t'ai demandé si c'etait normal d'avoir un "e" à la fin du mot fier, car je croyais que tu était une femme :D

Y'a tellement peu de femme, que j'aurais été content de parler à une de plus, c'est tout. :wink:
Mais meme si tu es un homme, tu es toujours le bienvenu :lol:

Ce n'etais surtout pas pour te corriger ton français :oops:
Tu sais ici, on en fait tous des fautes, en plus le français est tres dur meme pour les français :?

Donc voila pour le quiproquo (on s'est mal compris)
Grâce à votre aide mon code et mon francçais seront améliorés
Bah si on peut, on le fera :wink:

Bonne journée à toi aussi

Publié : mar. 12/févr./2008 14:07
par gnozal
Kwai chang caine a écrit :J'ai meme cru que tu etait français de souche
C'est quoi çà ?
Comme les champignons ...?!

Publié : mar. 12/févr./2008 19:16
par Kwai chang caine
Tu m'a fait rire :lol:
Si meme les cerveaux se mettent à faire de l'humour et qu'il me prennent mon fond de commerce, il va me rester quoi à moi :? :lol: :lol: :lol:

Publié : mer. 13/févr./2008 0:40
par africanos
Salut ;
en fin la barre des menus toute entière à droite .
essayez SVP le code suivant ,je ressens quel a besoin de quelques retouches.

Code : Tout sélectionner

;******************************************************
;*          Auteur: Africanos                         *
;*    Le 13-02-2008                                   *
;*    Mettre la barre des menus à droite de la Window *
;*    En utilisant les appels aux API windows         *
;******************************************************



;------------------------------------------------------
#MF_STRING        = $0
#MFS_DEFAULT      = $1000
#MIIM_ID          = $2
#MIIM_SUBMENU     = $4
#MIIM_TYPE        = $10
#MIIM_DATA        = $20
#MFT_RIGHTJUSTIFY = $4000
;------------------------------------------------------

LPTSTR.s="Aide"
mnuMenuItem.MENUITEMINFO
mnuMenuItem\cbSize = SizeOf(mnuMenuItem)
mnuMenuItem\fMask = #MIIM_TYPE
mnuMenuItem\fType =  #MFT_RIGHTJUSTIFY | #MF_STRING
mnuMenuItem\dwTypeData = @LPTSTR
mnuMenuItem\fState = #MFS_DEFAULT 
mnuMenuItem\cch = SizeOf(mnuMenuItem\dwTypeData ) 

;------------------------------------------------------
If OpenWindow(0, 100, 150, 300, 260, "PureBasic - Menu à droit", #PB_Window_SystemMenu)
   hMenu.l=CreateMenu(0, WindowID(0))
        If hMenu
          MenuTitle("Aide")
            MenuItem(1,"A propos de...")
          MenuTitle("Edition")
            MenuItem(2,"Copier") 
            MenuItem(3,"Coller") 
          MenuTitle("Fichier")
            MenuItem(4,"Nouveau") 
            MenuItem(5,"Ouvrir") 
            MenuBar()
            MenuItem(6,"Quitter") 
        EndIf


     mnuMenuItem\fType = mnuMenuItem\fType | #MFT_RIGHTJUSTIFY 
    If SetMenuItemInfo_(hMenu, 0, 1, @mnuMenuItem) = 0 
       Debug "erreur2"
    EndIf

; Rafraîchissement du menu
DrawMenuBar_(WindowID(0))
;------------------------------------
Repeat

    Select WaitWindowEvent()

      Case #PB_Event_Menu

        Select EventMenu()  ; Pour savoir le menu sélectionné
          Case 1
                MessageRequester("Apropos de ...", "I'm Africanos... Amazigh boy", 0)
          Case 2
                MessageRequester("Copier", "Coupier quoi?", 0)
          Case 3
                MessageRequester("Coller", "Coller quoi?", 0)
          Case 4
                MessageRequester("Fichier", "new ...", 0)
          Case 5
                MessageRequester("Fichier", "Open ...", 0)
          Case 6
                MessageRequester("Bye", "Quitter ce labyrinthe ", 0)
                Quit = 1  ;
          EndSelect

         Case  #PB_Event_CloseWindow
                Quit = 1

    EndSelect

  Until Quit = 1

EndIf

End 
 

Publié : mer. 13/févr./2008 11:51
par gnozal
africanos a écrit :Salut ;
en fin la barre des menus toute entière à droite .
essayez SVP le code suivant ,je ressens quel a besoin de quelques retouches.
Je te propose les modifications suivantes :

Code : Tout sélectionner

;****************************************************** 
;*          Auteur: Africanos                         * 
;*    Le 13-02-2008                                   * 
;*    Mettre la barre des menus à droite de la Window * 
;*    En utilisant les appels aux API windows         * 
;****************************************************** 



;------------------------------------------------------ 
#MF_STRING        = $0 
#MFS_DEFAULT      = $1000 
#MIIM_ID          = $2 
#MIIM_SUBMENU     = $4 
#MIIM_TYPE        = $10 
#MIIM_DATA        = $20 
#MFT_RIGHTJUSTIFY = $4000 
;------------------------------------------------------ 

LPTSTR.s="Aide" 
mnuMenuItem.MENUITEMINFO 
mnuMenuItem\cbSize = SizeOf(MENUITEMINFO);<---------- taille de la structure MENUITEMINFO [Size of structure, in bytes]
mnuMenuItem\fMask = #MIIM_TYPE 
mnuMenuItem\fType = #MFT_RIGHTJUSTIFY | #MF_STRING 
mnuMenuItem\dwTypeData = @LPTSTR 
mnuMenuItem\fState = #MFS_DEFAULT 
mnuMenuItem\cch = Len(LPTSTR);<---------- longueur du texte du menu [Length of the menu item text, when information is received about a menu item of the MFT_STRING type]

;------------------------------------------------------ 
If OpenWindow(0, 100, 150, 300, 260, "PureBasic - Menu à droit", #PB_Window_SystemMenu) 
  hMenu.l=CreateMenu(0, WindowID(0)) 
  If hMenu 
    MenuTitle("Aide") 
    MenuItem(1,"A propos de...") 
    MenuTitle("Edition") 
    MenuItem(2,"Copier") 
    MenuItem(3,"Coller") 
    MenuTitle("Fichier") 
    MenuItem(4,"Nouveau") 
    MenuItem(5,"Ouvrir") 
    MenuBar() 
    MenuItem(6,"Quitter") 
  EndIf 
  
  
  ;mnuMenuItem\fType = mnuMenuItem\fType | #MFT_RIGHTJUSTIFY ;<---------- inutile, déjà fait plus haut : mnuMenuItem\fType = #MFT_RIGHTJUSTIFY | #MF_STRING 
  If SetMenuItemInfo_(hMenu, 0, 1, @mnuMenuItem) = 0 
    Debug "erreur2" 
  EndIf 
  
  ; Rafraîchissement du menu 
  DrawMenuBar_(WindowID(0)) 
  ;------------------------------------ 
  Repeat 
    
    Select WaitWindowEvent() 
        
      Case #PB_Event_Menu 
        
        Select EventMenu()  ; Pour savoir le menu sélectionné 
          Case 1 
            MessageRequester("Apropos de ...", "I'm Africanos... Amazigh boy", 0) 
          Case 2 
            MessageRequester("Copier", "Coupier quoi?", 0) 
          Case 3 
            MessageRequester("Coller", "Coller quoi?", 0) 
          Case 4 
            MessageRequester("Fichier", "new ...", 0) 
          Case 5 
            MessageRequester("Fichier", "Open ...", 0) 
          Case 6 
            MessageRequester("Bye", "Quitter ce labyrinthe ", 0) 
            Quit = 1  ; 
        EndSelect 
        
      Case  #PB_Event_CloseWindow 
        Quit = 1 
        
    EndSelect 
    
  Until Quit = 1 
  
EndIf 

End

Publié : mer. 13/févr./2008 13:10
par africanos
Merci gnozal pour les commentaires et pour la purification du code.
j'espère que tu a une idée sur l'alignement à droite des textes des sous-menus (Nouveau,copier,coupier ...etc).
bonne recherche et bonne journée pour toute la communauté PUREBASIC :)

Publié : mer. 13/févr./2008 16:49
par gnozal
africanos a écrit :j'espère que tu a une idée sur l'alignement à droite des textes des sous-menus (Nouveau,copier,coupier ...etc).
A ma connaissance #MFT_RIGHTJUSTIFY n'est valable que pour les titres.
Peut-être faut-il passer en owner-draw c'est à dire dessiner le menu soi-même, comme ici : http://www.purebasic.fr/english/viewtopic.php?t=21294
On peut alors choisir l'option #DT_RIGHT avec DrawText_() pour aligner le texte à droite.

D'une façon générale, c'est pour écrire des langues qui se lisent de droite à gauche comme l'arabe ou l'hébreu ?
Il y a des styles windows comme #WS_EX_LAYOUTRTL pour çà :
http://www.purebasic.fr/english/viewtopic.php?t=21840
http://www.purebasic.fr/english/viewtopic.php?t=21820
http://www.purebasic.fr/english/viewtopic.php?t=22258
Dans ce cas, c'est facile :

Code : Tout sélectionner

If OpenWindow(0, 100, 150, 300, 260, "PureBasic - Menu à droite", #PB_Window_SystemMenu) 
  ; *************************
  SetWindowLong_(WindowID(0), #GWL_EXSTYLE, GetWindowLong_(WindowID(0), #GWL_EXSTYLE) | #WS_EX_LAYOUTRTL) 
  SetWindowPos_(WindowID(0), 0, -1 , -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE | #SWP_NOZORDER  | #SWP_FRAMECHANGED | #SWP_SHOWWINDOW)
  ; *************************
  CreateMenu(0, WindowID(0)) 
  MenuTitle("Aide") 
  MenuItem(1,"A propos de...") 
  MenuTitle("Edition") 
  MenuItem(2,"Copier") 
  MenuItem(3,"Coller") 
  MenuTitle("Fichier") 
  MenuItem(4,"Nouveau") 
  MenuItem(5,"Ouvrir") 
  MenuBar() 
  MenuItem(6,"Quitter") 
  
  ;------------------------------------ 
  Repeat 
    
    Select WaitWindowEvent() 
        
      Case #PB_Event_Menu 
        
        Select EventMenu()
          Case 1 
            MessageRequester("Apropos de ...", "I'm Africanos... Amazigh boy", 0) 
          Case 2 
            MessageRequester("Copier", "Coupier quoi?", 0) 
          Case 3 
            MessageRequester("Coller", "Coller quoi?", 0) 
          Case 4 
            MessageRequester("Fichier", "new ...", 0) 
          Case 5 
            MessageRequester("Fichier", "Open ...", 0) 
          Case 6 
            MessageRequester("Bye", "Quitter ce labyrinthe ", 0) 
            Quit = 1  ; 
        EndSelect 
        
      Case  #PB_Event_CloseWindow 
        Quit = 1 
        
    EndSelect 
    
  Until Quit = 1 
  
EndIf 
End

Publié : mer. 13/févr./2008 22:03
par africanos
Un grand merci pour vous gnozal;
votre code est génial,il a résolu mon problème totalement, et d'une manière très simple.
voici une toute petite remarque ,si vous le permettez,dans mon cas au moins,
Lorsque le support des thèmes XP est activé ,quelques Gadgets ont un comportement bizarre ,par exemple le CheckBoxGadget et le TrackBarGadget en ne Citons que quelqu’uns.
Si vous voulez essayez avec l'exemple Gadget.pb intégré au package PureBasic ; ..\PureBasic10\Examples\Sources\Gadget.pb en mettons les 2 lignes suivantes après OpenWindow(......)

Code : Tout sélectionner

SetWindowLong_(WindowID(0),#GWL_EXSTYLE,#WS_EX_LAYOUTRTL | 0)
 SetWindowPos_(WindowID(0), 0, -1 , -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE | #SWP_NOZORDER  | #SWP_FRAMECHANGED | #SWP_SHOWWINDOW)
Merci une seconde fois pour votre aide.

Publié : jeu. 14/févr./2008 8:31
par gnozal
africanos a écrit :Lorsque le support des thèmes XP est activé ,quelques Gadgets ont un comportement bizarre ,par exemple le CheckBoxGadget et le TrackBarGadget en ne Citons que quelqu’uns.
Le style étendu WS_EX_LAYOUTRTL est de Micro$oft, donc à mon avis le problème avec les thèmes (que personellement je n'utilise jamais, comme les skins etc...) est aussi un problème Micro$oft.
A moins qu'il ne faille une version spéciale 'Moyen orient' (Middle east) de Windows ou que certains gadgets PB ne puissent être modifiés comme des contrôles natifs ?