MenuHelp -> Was soll LPUINT sein ??



  • hi,

    ich möchte, dass in der statuszeile ein bestimmter text erscheint, wenn man mit der maus auf einem bestimmten menü-eintrag steht.

    dies ist sehr user-freundlich und wird deshalb auch von ms unterstützt. es gibt sogar eine hilfsfunktion dafür, das alles zu managen: [msdn]MenuHelp[/msdn]
    (gleich mal neue syntax getest)

    ich komm aber mit dem letzten Parameter nicht klar. kann mir das jemand mal erklären. ein besipiel würde es auch schon tun.

    thx,
    lw

    ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

    ich teste mal die neue sytax: (gehört nicht zum beitrag)
    x2 ↔ √2
    α+β+γ=180°
    1/∞=0
    spaß mit google:
    Google: the answer to life, the universe and everything
    Google: 98.6 degrees Fahrenheit in Celsius?
    Google: kilometers in a light year
    Google: 30 gigabytes / 160 kbps



  • der letzte Parameter muss auf einen int Array zeigen, der Resource String IDs und HMENU Paaren enthält. 😉



  • na ach. 🙄

    nu is aber HMENU kein int. 😞

    und wie soll ich das angeben? 😕
    ich habs so probiert, und so gehts nicht:
    [code]UINT MenuHelpArray[] = {IDMH_ABOUT, GetSubMenu(hMenu_Spiel, 0),
    IDMH_NEWGAME, GetSubMenu(hMenu_Spiel, 2),
    ...
    };

    oder erst Handel und dann ResID ? ich checks net.

    lw



  • du musst casten und außerdem muss es ein Toplevel Menü Handle sein 🙄



  • @Lawilog: Mach dir doch ne Struktur:

    struct MenuHelpStruct
    {
       UINT   uiID;
       HANDLE hSubMenu;
    };
    

    Dann kannste das so schreiben:

    MenuHelpStruct MenuHelpArray[] = {{IDMH_ABOUT, GetSubMenu(hMenu_Spiel, 0)},
                                      {IDMH_NEWGAME, GetSubMenu(hMenu_Spiel, 2)},
                                      ...,
                                      {IDMH_ABOUT, GetSubMenu(hMenu_Spiel, 12)}};
    

    Jetzt musste nur noch casten:

    MenuHelp(..., (LPUINT)MenuHelpArray);
    


  • ha. danke. es geht jetzt fast.

    der struct ist ist nicht unbedingt notwendig.
    bringt nur 4 codezeilen und jeweils 2 klammern mehr mit sich. 😉

    nur hab ich jetzt noch ein seltsasames phenomen:
    die menüeinträge zeigen keinen text an, sondern nur die hauptmenüs zeigen den text der menüeinträge des ersten menüs.

    worauf muss sich das handel besziehen ? bestimmt doch auf den menüeintrag.
    aber weder: GetSubMenu(GetSubMenu(GetMenu(hWnd), 0), 0)
    noch: GetSubMenu(GetMenu(hWnd), 0)
    noch: GetMenu(hWnd)
    funktioniert.

    gibt es vorschriften für die resource-ids oder so ?

    lw



  • wie komm ich an das richtige menü-handel ran ?

    weiß das denn niemand ?

    lw



  • Welches Handle willst du denn haben? Und wie ist dein Menü aufgebaut



  • {
    	POPUP "&Spiel"
    	{
    		MENUITEM "&Über LawilogSkat",			IDM_ABOUT
    		MENUITEM SEPARATOR
    		MENUITEM "&Neues Spiel",				IDM_NEWGAME
    		MENUITEM "&Dieses Spiel beenden",		IDM_CANCELGAME
    		MENUITEM SEPARATOR
    		MENUITEM "&Optionen"					IDM_OPTIONS
    		MENUITEM SEPARATOR
    		MENUITEM "&Beenden",					IDM_QUIT
    	}
    
    	POPUP "&Netzwerkspiel"
    	{
    		MENUITEM "&Netzwerlspiel starten"		IDM_NETSTART
    		MENUITEM "&An Netzwerkspiel teilnehmen"	IDM_NETJOIN
    	}
    
    	POPUP "&Hilfe"
    	{
    		MENUITEM "&SchnellHilfe",				IDM_FASTHELP
    		MENUITEM "&Hilfe zum SkatSpiel",		IDM_SKATHELP
    	}
    }
    

    ich brauch jetzt das handel von z.b. "Neues Spiel".
    aber das hab ich schon probiert:
    GetSubMenu(GetSubMenu(GetMenu(hWnd), 0), 2)

    ich bin mit meinen latein echt am ende. bis hin zu GetSubMenu(GetMenu(hWnd), 0) gibt IsMenu() noch true zurück, aber dann hörts auf. ich steh kurz vor der verzweiflung.

    lw



  • Das Problem ist eben, dass diese Menu-Items keine Sub-Menus haben, deswegen schlägt GetSubMenu dann fehl.

    If the menu item does not activate a drop-down menu or submenu, the return value is NULL.

    Aber wirklich weiterhelfen kann ich dir leider auch nicht 🙄



  • es hat mir gereicht.
    ich scheiß auf diese verfuckte ms-funktion!! (sorry, das musste raus...)

    hab mir meine eigene funktion geschrieben:

    #include <windows>
    
    using namespace std;
    
    /*Info:
    MyMenuHelp ist eine Hilfsfunktion, die die WM_MENUSELECT Nachricht verarbeitet.
    
    Parameter:
    	WPARAM wParam - wParam von WM_MENUSELECT
    	HWND hStausBar - gültiges Handel der Statuszeile
    	UINT* MenuID_Array - Array der MenüIDs
    	UINT* ResID_Array - Array der StringtableResourceIDs (in gleicher Reinfolge wie MenuID_Array)
    	int iCount - Anzahl der Elemente im Array
    
    Anhand von wParam wird das entsprechende MenuItem aus dem MenuID_Array herausgesucht
    und dann aus der dazugehörigen ResourceID in ResID_Array ein String mittels LoadString() geladen,
    der dann in der Statuszeile (hStausBar) angezeigt wird.
    
    (Gibt bei Erfolg true zurück, im Fehlerfall false.)
    */
    
    #define HELPSTRING_BUFFER_SIZE 1024
    
    bool MyMenuHelp(WPARAM wParam, HWND hStausBar, HINSTANCE hInstance,
    				UINT* MenuID_Array, UINT* ResID_Array, int iCount)
    {
    	static char * AlterStatustext;
    	static bool bFirstCall = true;
    	if(bFirstCall)
    	{
    		bFirstCall = false;
    		int len = GetWindowTextLength(hStausBar)+1;
    		AlterStatustext = new char[len];
    		GetWindowText(hStausBar, AlterStatustext, len);
    	}
    	if(HIWORD(wParam) == 0xFFFF)//Menü wird geschlossen
    	{
    		bFirstCall = true;
    		SetWindowText(hStausBar, AlterStatustext);
    		delete [] AlterStatustext;
    	}
    	UINT MenuID = LOWORD(wParam);
    	int iPos = 0;
    	bool bNotFound = true;
    	while(iPos < iCount)
    	{
    		if(MenuID_Array[iPos] == MenuID)
    		{
    			bNotFound = false;
    			break;
    		}
    		iPos++;
    	}
    	if(bNotFound) return false;
    	else
    	{
    		char* HelpString = new char[HELPSTRING_BUFFER_SIZE];
    		LoadString(hInstance, ResID_Array[iPos], HelpString, HELPSTRING_BUFFER_SIZE-1);
    		SetWindowText(hStausBar, HelpString);
    		delete [] HelpString;
    	}
    	return true;
    }
    

    implementiert sieht das ganze dann so aus:

    case WM_MENUSELECT:
    {
    	static UINT MenuID_Array[] = {IDM_ABOUT,
    		IDM_NEWGAME,
    		IDM_CANCELGAME,
    		IDM_OPTIONS,
    		IDM_QUIT,
    		IDM_NETSTART,
    		IDM_NETJOIN,
    		IDM_FASTHELP,
    		IDM_SKATHELP};
    	static UINT ResID_Array[] = {IDMH_ABOUT,
    		IDMH_NEWGAME,
    		IDMH_CANCELGAME,
    		IDMH_OPTIONS,
    		IDMH_QUIT,
    		IDMH_NETSTART,
    		IDMH_NETJOIN,
    		IDMH_FASTHELP,
    		IDMH_SKATHELP};
    	MyMenuHelp(wParam, hStausBar, hInstance, MenuID_Array, ResID_Array, 9);
    	return 0;
    }
    

    so. jetzt hab ich mir meinen schlaf aber rätlich verdient.

    lw


Log in to reply