Zugriefstaste bei Menüs



  • tach,

    wie kann ich Zugriefstaste für ein Submenü erstellen???

    also z.B.: STRG+O == Öffnen ...

    HMENU hMenu, hSubMenu;
            HICON hIcon, hIconSm;
    
            hMenu = CreateMenu();
    
            hSubMenu = CreatePopupMenu();
            AppendMenu(hSubMenu, MF_STRING, 111, "E&xit");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File");
    
            hSubMenu = CreatePopupMenu();
            AppendMenu(hSubMenu, MF_STRING, 222, "&Go");
            AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Stuff");
    
            SetMenu(hwnd, hMenu);
    }
    


  • Via Accelerator.

    Das sind Resourcen.

    Grafisch stelltst du das dann so dar:

    [...]
    AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File\tStrg + O");
    [...]
    


  • AppendMenu(hSubMenu, MF_STRING, 111, "E&xit\tStrg + x");
    

    geht nicht 😞
    wenn ich STRG+X drücke, dann passiert nix, aber er soll die anwendung beenden



  • newbien schrieb:

    AppendMenu(hSubMenu, MF_STRING, 111, "E&xit\tStrg + x");
    

    geht nicht 😞
    wenn ich STRG+X drücke, dann passiert nix, aber er soll die anwendung beenden

    Das ist auch nur die grafische Darstellung, wie CodeFinder ja dazu geschrieben hat. Damit siehst du im Menü dann das Tastenkürzel angezeigt, dadurch funktioniert das Shortcut aber noch nicht. 😉



  • Du brauchst ne Accelerator-Table!

    Die musst du als Resource einbinden und dann in der WinMain laden.

    EDIT: zuzuu späähht^^



  • gehts auch ohne resourcen???

    habe so versucht, aber compiler spukt error aus:

    ACCEL strg_x;
    		HACCEL__ * acc;
    		strg_x.fVirt = FCONTROL|FNOINVERT|FVIRTKEY;
    		strg_x.key = 'o';
    		strg_x.cmd = 111;
    		acc = CreateAcceleratorTable(&strg_x, 0);
    		if(acc!=NULL)
    		LoadAccelerators(GetModuleHandle(NULL), &acc);
    
    error: cannot convert `HACCEL__**' to `const CHAR*' for argument `2' to `HACCEL__* LoadAcceleratorsA(HINSTANCE__*, const CHAR*)'
    


  • kommt schon, nutzen den alle hier resourcen?



  • Öhm guck dir einfach mal an was LoadAccelerators macht ... du brauchst die func. garnet mehr ... nur musst du die accel. table auch benutzen 😃

    d.h.

    ACCEL  accelStrgX;
    HACCEL hAccelTable = NULL;
    accelStrgX.fVirt = FCONTROL|FNOINVERT|FVIRTKEY;
    accelStrgX.key = 'o';
    accelStrgX.cmd = 111;
    
    hAccelTable = CreateAcceleratorTable(&accelStrgX, 0);
    if (!hAccelTable)
    	return 1;
    
    // Dein Messageloop dann in etwa so...
    while (GetMessage(&msg, NULL, 0, 0)) 
    {
    	if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    }
    


  • hmm, geht auch anders, ohne die message loop zu verändern?



  • irrgend wie will das nicht ...

    ACCEL  accelStrgX;
    HACCEL hAccelTable = NULL;
    accelStrgX.fVirt = FCONTROL|FNOINVERT;
    accelStrgX.key = 'x';
    accelStrgX.cmd = 111;
    
    hAccelTable = CreateAcceleratorTable(&accelStrgX, 1);
    if (hAccelTable == NULL)
    {
    	MessageBox(NULL, "fff", "ffff", MB_OK);
        return 1;
    }
        while (GetMessage (&this->messages, NULL, 0, 0))
        {
        	if (!TranslateAccelerator(this->messages.hwnd, hAccelTable, &this->messages))
        	{
            	TranslateMessage(&this->messages);
            	DispatchMessage(&this->messages);
        	}
        }
    
        return this->messages.wParam;
    }
    


  • newbien schrieb:

    hmm, geht auch anders, ohne die message loop zu verändern?

    LOL, nein!

    Was dein letzter Post soll weiß ich nicht...(D)Evil hat dir doch n gutes Beispiel gepostet 🙄 .


Anmelden zum Antworten