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

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é
C'est tellement rare, que j'arrive à aider quelqu'un
Sache que l'on est fier nous aussi, d'avoir un nouveau membre dans la famille
Et je te souhaite au nom de toute la famille qui parait pas nombreuse, car ils causent pas beaucoup comme moi

, mais ils lisent presque tout et on la générosité d'aider le plus possible.
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

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.
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
Y'a tellement peu de femme, que j'aurais été content de parler à une de plus, c'est tout.
Mais meme si tu es un homme, tu es toujours le bienvenu
Ce n'etais surtout pas pour te corriger ton français
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
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
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 ?