SubClassing : utiliser le lParam (sensé ête un pointeur)

Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 - 21 oct. 2010 à 00:10
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 - 21 oct. 2010 à 19:24
Bonjour,

Je souhaiterais refaire moi-même le disign du menu de ma fenêtre (MenuItem)
Le moyen que j'ai trouvé pour ce faire est le subclassing
1) dire au menu que c'est la fenetre qui va redessiner
http://msdn.microsoft.com/en-us/library/ms647578%28v=VS.85%29.aspx
cette partie la ca va tres bien, je fait la chose suivante :
    'demander que l'affichage des menus se fasse par la procédure de la fenetre
    Dim H As Long:      H = GetMenu(Me.hWnd)
    Dim Hm As Long:     Hm = GetSubMenu(H, 0)
    Dim MI As MENUITEMINFO
    With MI
        .fMask = MIIM_BITMAP
        .hbmpItem = -1
        .cbSize = Len(MI)
    End With
    Me.Caption = SetMenuItemInfo(Hm, 0, True, MI)
    '--------------------------------------------------------------------------

dans ma fenetre j'ai un menu (créé avec l'éditeur de menu) contenant un menu primaire contenant lui-même deux menus

2) gérer les méthodes interceptées par le subclassing
avec la manière classique j'intercepte les évènements. je renvoie sur la procédure par défaut les evenements qui ne m'interessent pas et je souhaite traiter les deux relatifs a l'affichage de mon menu soit :
Private Const WM_MEASUREITEM = &H2C
Private Const WM_DRAWITEM = &H2B
dans mon projet de test, j'arrive bien a intercepter ces deux evenements.
la ou je commence a me tirer les cheveux est sur le parametre lParam de MEASUREITEM

d'apres la doc http://msdn.microsoft.com/en-us/library/bb775925%28v=VS.85%29.aspx
le lParam est un pointeur sur une structure MEASUREITEMSTRUCT

alors on arrive a ma question : comment je fait pour récupérer la structure avec le pointeur (en sachant que dans l'event je dois renseigner des données dans la structure)

je n'arrive pas a comprendre si lParam qui est de type Long contient l'adresse ou si VarPtr(lParam) = adresse de ma structure

merci pour votre aide :)
VB6, quand yen a plus yen a encore
Il y a tant a apprendre et seulement 24 heures dans une journée

2 réponses

Flocreate Messages postés 300 Date d'inscription lundi 17 juillet 2006 Statut Membre Dernière intervention 27 mai 2012 3
21 oct. 2010 à 00:54
il semblerait que avec ceci ca marche ... j'ai du mal avec les pointeurs en VB6

'se produit au momment de la création du menu
Private Function MEASUREITEM(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    'récupérer ce qu'il y a dans la structure
    Dim M As MEASUREITEMSTRUCT
    CopyMemory ByVal VarPtr(M), ByVal lParam, LenB(M)
    
    '    MEASUREITEM = CallWindowProc(lngOldProc, hWnd, Msg, wParam, lParam)
    
         M.itemWidth = 100
         M.itemHeight = 50
    
    'renvoyer la structure
    CopyMemory ByVal lParam, ByVal VarPtr(M), LenB(M)    
    
    'indiquer que la procédure a été faite avec succes
    MEASUREITEM = 1 'must return True
End Function
0
cs_ghuysmans99 Messages postés 3982 Date d'inscription jeudi 14 juillet 2005 Statut Membre Dernière intervention 30 juin 2013 16
21 oct. 2010 à 19:24
VarPtr(lParam) te donnera un pointeur vers la pile ... Donc c'est logique que ton code fonctionne

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
0
Rejoignez-nous