Eigene Daten bei OWNERDRAW in Menüs



  • Folgendes Problem,

    ich möchte einem Menüitem einen Zeiger mitgeben, für bestimmte (eigene) Daten. Diese Daten sollen bei der Callback WM_MEASUREITEM zur Verfügung stehen:

    MENUITEMINFO mii;
    	LPdefItemData myitemdataptr;
    
    	mii.cbSize=sizeof(MENUITEMINFO); 
    	mii.fMask=MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU | MIIM_STATE;
    
    	mii.fType=MFT_STRING | MFT_OWNERDRAW;
    	myitemdataptr=new defItemData;
    	myitemdataptr->menuhandle=(HMENU)menuhandle;
    	mii.dwTypeData=(LPTSTR)myitemdataptr;
    	mii.cch=0;
    
    	mii.fState=MFS_ENABLED; 
    	mii.wID=ref;
    	mii.hSubMenu=(HMENU)submenu;
    	mii.hbmpChecked=0;
    	mii.hbmpUnchecked=0;
    	mii.dwItemData=0;
    	mii.hbmpItem=0;
    
    	InsertMenuItem((HMENU)menuhandle,pos-1,true,&mii);
    

    In der Callback mache ich dann nur

    lpmis=(LPMEASUREITEMSTRUCT)lParam;
    myitemdataptr=(LPdefItemData)lpmis->itemData;
    

    Nur leider ist der Zeiger in myitemdataptr ein anderer. Beim Zugriff auf meine Daten in myitemdataptr macht es bums!

    Irgendwelche Ideen?



  • Du must den Pointer in der MENUITEMINFO Struktur nicht an dwTypeData, sondern an dwItemData 'übergeben'. Und bei fMask MIIM_DATA nicht vergessen.



  • Mein Code sieht jetzt folgendermaßen aus:

    MENUITEMINFO mii;
    	LPdefItemData myitemdataptr;
    
    	mii.cbSize=sizeof(MENUITEMINFO); 
    	mii.fMask=MIIM_FTYPE | MIIM_STRING | MIIM_ID | MIIM_SUBMENU | MIIM_STATE | MIIM_DATA;
    
    	mii.fType=MFT_STRING | MFT_OWNERDRAW;
    	myitemdataptr=new defItemData;
    	myitemdataptr->menuhandle=(HMENU)menuhandle;
    	mii.dwTypeData=string;
    	mii.cch=strlen(string);
    	mii.dwItemData=(ULONG_PTR)myitemdataptr;
    	mii.fState=MFS_ENABLED; 
    	mii.wID=ref;
    	mii.hSubMenu=(HMENU)submenu;
    	mii.hbmpChecked=0;
    	mii.hbmpUnchecked=0;
    	mii.hbmpItem=0;
    
    	InsertMenuItem((HMENU)menuhandle,pos-1,true,&mii);
    

    Jedoch rumst es in der Callback immer noch an der gleichen Stelle! Ich weiß nicht was das für ein Zeiger ist und auf was der zeigt.



  • Wirf mal einen Blick in die MSDN zum Thema Example of Owner-Drawn Menu Items. Das Beispiel bei der Funktion BOOL WINAPI OnCreate(HWND hwnd) sollte dir weiterhelfen.



  • Das kenne ich, habs genauso implementiert. Geht nicht, der Zeiger ist ein anderer in der Callback.

    Was komisch ist, dass wenn ich im Item ein NULL Zeiger hinterlege, bekomme ich in der Callback trotzdem einen gültigen Zeiger. Auf was zeigt er denn bloß?



  • Analog Bit schrieb:

    Du must den Pointer in der MENUITEMINFO Struktur nicht an dwTypeData, sondern an dwItemData 'übergeben'. Und bei fMask MIIM_DATA nicht vergessen.

    Dann ist in der MSDN aber ein Fehler?

    MFT_OWNERDRAW:
    Assigns responsibility for drawing the menu item to the window that owns the menu. The window receives a WM_MEASUREITEM message before the menu is displayed for the first time, and a WM_DRAWITEM message whenever the appearance of the menu item must be updated. If this value is specified, the dwTypeData member contains an application-defined value.

    http://msdn2.microsoft.com/en-us/library/ms647578.aspx

    Was denn nu?


Anmelden zum Antworten