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