Menü Problem



  • wie komme ich an die Positions zahl eines Menüs heran

    int  iItems = GetMenuItemCount(hmenu);
    

    mit dem snipe kann ich die anzahl der eigeträge ermitteln

    wenn ich jetzt auf bsp. den dritten eintrag im menü klicke müste es die zahl 2 sein da es ja 0,1,2 usw zählt nun wie bekomme ich durch klick die zahl heraus



  • Naja du8 has mir ein bissl vom prob erzählt, naja da ich noch win32 API neuling bin würde ichs mal aus dem Kopf heraus so machen

    case WM_MENUSELECT:
        if(wParam & MK_LBUTTONDOWN)  {
            switch(LOWORD(wParam)  {  /* Wenn du über das Menü gehst bekommt WM_MENUSELECT ja immer die ID 
    geliefert, dann prüfst du ob der User die Linke Maustatse gedrückt hast, wenn ja machst du was aus der ID */
                case 1 :
                       MessageBox(...,....,....,...);
                break;
                default:
                break;
             }
         }
    return 0;  // bzw. break ?
    

    lg sigint

    ps. dad Prob is dass es nicht mit WM_COMMAND geht !!!!!!!! sagte er mir



  • Joar genau, LOWORD von wParam, siehe: http://msdn2.microsoft.com/en-us/library/ms646352.aspx
    Aber das:

    // ...
    if(wParam & MK_LBUTTONDOWN)  { 
    // ...
    

    ist murks 😉 .



  • wenn die frage vieleicht blöd glingt hast eventuel nen bsp. please 😃 hock scho ne ganze woche an dem prob hab gegooglet usw. nur komm ich net weiter



  • naja hab das mal gesehn dass man so testen kann ob die maustaste gedrückt wurde... vllt. is es uch lParam xD hehe...

    das beste wäre wenn Ascha die Eibträge us der DB Tabelle zählt, ne for schleif macht, die bis i < n Eibträge und das dann mit AppendMenu ins Menu einfüg und i ist dann die id und dann kann er mit wm_command arbeiten

    lg sigint



  • @Ascharan: Häääää? Es ist doch alles genannt, wo ist denn nun Dein Problem ?
    @c4f: Ne so kann man das nur prüfen, wenn der entsprechende Parameter dafür vorgesehen ist. Das ist hier weder bei wParam noch bei lParam der Fall. Außerdem verstehe ich nicht warum das hier von Interesse ist. Es geht doch einfach um eine Auswahl und dann um die entsprechende Index-Position.

    das beste wäre wenn Ascha die Eibträge us der DB Tabelle zählt, ne for schleif macht, die bis i < n Eibträge und das dann mit AppendMenu ins Menu einfüg und i ist dann die id und dann kann er mit wm_command arbeiten

    Was das soll verstehe ich nicht (Oder sagen wir so: Ich glaube ich weiß, was Du damit sagen willst, aber bringen tut das hier eigentlich gar nix / macht nur unnötigen Aufwand 😋 ).



  • mhm steh jetzt aufm schuh sagma mal so das mit dem einträgen zählen brauch ich net da das menü ja schon eine rangfolge hat in dem moment wo es erzeugt wird beginnend von 0 bis 12 bsp für 13 einträge sonst könnte ich ja nicht das machen

    [cpp]
    void Create(HMENU hMenu)
    {
     static int itemID = 0;
     MENUITEMINFO mii;
    
     mii.cbSize = sizeof(MENUITEMINFO);			  
     mii.fType = MFT_STRING;			  
     mii.fMask = MIIM_FTYPE | MIIM_DATA | MIIM_ID;
    
     int count = GetMenuItemCount(hMenu);
     for(int i=0;i<count;i++)
     {
    	mii.wID = itemID++;
    
    	char str[MAX_PATH];
    	GetMenuString(hMenu,i,str,MAX_PATH,MF_BYPOSITION);
    	MessageBox(0,str,"Message",MB_OK);
     }
    }[/cpp]
    

    der code gipt alle einträge nacheinander in einer messagebox aus 😃 jetzt wollt ich nur die einzelne position des eintrags haben damit ich diese als int übergeben kann und dann den einzelnen string auslese und nicht gleich alle einträge

    MFG Ascharan



  • Also ich hab das so.
    Im Hauptprogramm

    case WM_CONTEXTMENU:
    	if(DoContextMenu(hDlg, wParam, lParam))
    		return FALSE;
    

    Und dann die Funktion

    BOOL DoContextMenu(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
    HMENU hMenu;
    	POINT p;
    	int i;
    
    	p.x = LOWORD(lParam);
    	p.y = HIWORD(lParam);
    
    	hMenu = CreatePopupMenu (); // Menu anlegen 
    	InsertMenu(hMenu, 0, MF_BYPOSITION, 1, "kleine Symbole");
    	InsertMenu(hMenu, 1, MF_BYPOSITION, 2, "große Symbole");
    	InsertMenu(hMenu, 2, MF_BYPOSITION, 3, "Liste");
    	InsertMenu(hMenu, 3, MF_BYPOSITION, 4, "Report");
    	InsertMenu(hMenu, 0, MF_SEPARATOR, 0, NULL); // Separator 
    
    	int iAuswahl = (int) TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON |
    		TPM_RETURNCMD, p.x, p.y, 0, hwndListView, 0);
    
    	switch( iAuswahl ) {
    	case 1:
    		SwitchView(hwndListView, LVS_SMALLICON);
    		break;
    	case 2:
    		SwitchView(hwndListView, LVS_ICON);
    		break;
    	case 3:
    		SwitchView(hwndListView, LVS_LIST);
    		break;
    	case 4:
    		SwitchView(hwndListView, LVS_REPORT);
    		break;
    	}	
    	DestroyMenu(hMenu);
    
    	return TRUE;
    }
    

    MfG schirrmie



  • Hab mal ne blöde Idee, aber naja vllt hilft es ja doch...
    Das blöde ist ich weiß niht genau was du willst, das ist der Nachteil wenn Deutsch ne Fremdsprache ist....

    Arbeite doch nicht mit den ID's bzw. die Nummer des Menüs,
    du kanns ja mit GetMenuString arbeiten, dann lässt du dir einfach den String zurückgeben und kopierst ihn in den Buffer und arbeitest damit weiter

    Hoffe das Hilft, ich tue mein bestens ......

    lg c4f



  • lol was glaubst du eigentlich an was ich versuch ranzukommen da menüs keine ids haben 😃 probier grad schirrmie's code aus das was er bisher zeigt gefällt mir



  • Ascharan schrieb:

    lol was glaubst du eigentlich an was ich versuch ranzukommen da menüs keine ids haben 😃 probier grad schirrmie's code aus das was er bisher zeigt gefällt mir

    Natürlich haben Menü-Einträge eine ID (Eine Ausnahme ist natürlich, dass der Programmierer keine gesetzt hat - auch möglich, aber selten und wenn Du das Menü selbst erstellt hast, ist das sowieso nicht zutreffend).



  • naja definiere selbst erstellt 😃



  • ich füge mein menü so ein

    void CMyDatabase::PrintFieldMenu(string strTable, const _bstr_t &field, HMENU hWin)
    {	
     LPCTSTR my_String;
    
     // Select all the columns from the desired table
     char szSQLStatement[999] = {0};
     sprintf_s(szSQLStatement, "SELECT * FROM %s", strTable.c_str());
    
     m_recordset->Open(szSQLStatement, m_connection.GetInterfacePtr(),ADODB::adOpenForwardOnly, ADODB::adLockReadOnly, ADODB::adCmdText);
      m_recordset->MoveFirst();	
      try
      {
        while (!m_recordset->ADOEOF) 
        {
          char szText01[255];
          my_String = _strdup((char*) ((_bstr_t)(m_recordset->GetFields()->GetItem(field)->GetValue())) );
          sprintf(szText01,"%s",my_String);
          AppendMenu(hWin,MFT_STRING,NULL,szText01);
          m_recordset->MoveNext();
       }
     }
    catch( _com_error &e )
    {
      MessageBox(NULL, static_cast<char *>(e.Description()), "Error", MB_OK);
    }
     m_recordset->Close();
    
     // Return our string we got from the database
     //return strValue;
    }
    

    AppendMenü übergibt keine ID der wert steht auf NULL

    AppendMenu(hWin,MFT_STRING,NULL,szText01);
    

    liegt wohl darin das ich die anzahl der menü einträge nicht kenne



  • Ascharan schrieb:

    AppendMenü übergibt keine ID der wert steht auf NULL

    AppendMenu(hWin,MFT_STRING,NULL,szText01);
    

    liegt wohl darin das ich die anzahl der menü einträge nicht kenne

    Dann vergib doch einfach ne aufsteigende ID und merk Dir nur den Anfangswert, die Anzahl und damit die letzte gültige ID weißt Du doch dann:
    AnfangsID + AnzahlDerEinträge = LetzteGültigeID

    😉



  • nach schirrmie bsp code hab ich das prob gelöst und funcs bloss jetzt hab ich n anderes problem und zwar das
    bsp

    switch( iAuswahl ) {
        case 1:
            CreateMessage(iAuswahl,hMenu);
            break;
        }
    

    case ist ja eine fest gelegter wert nun hab ichs mit

    switch( iAuswahl ) 
    { 
    if(iAuswahl == iAuswahl)
     CreateMessage(iAuswahl,hMenu);
     break;
    

    versucht doch klapts net naja binn halt noch net besonders gut darin 😃



  • ROFL! Was ist denn überhaupt das Problem ... typischer Fall von 'funktioniert nicht - mach mal, dass das geht' 🙄 ... . Der letzte Code-Abschnitt ist Schwachsinn. Außerdem: wenn if(iAuswahl == iAuswahl) { ... } irgendwann mal falsch sein soll, würd ich mir ernsthaft Gedanken machen 🕶 .



  • naja komm erst von arbeit was solls jeder kann doch mal schwach sinn blappern 😃



  • Also deine letzten beiden Codeabschnitte sind ja wirklich mal schwachsinn 🙂 Du übergibst doch immer iAuswahl also warum triffst du vorher noch ne abfrage welchen wert iAuswahl hat 😕
    Was ist denn das für eine Funktion CreateMessage? Was versuchst du zu erreichen und was geht nicht? Versteh dich nicht 🙂

    schirrmie



  • Wie gesat, wenn du die ID's kennst, kanns de die ID's ja alle im case zweig benutzen nee, is doch logisch, du speicherst ja offensichtlich die ID in iAuswahl, also warum machst du denn keine case Zweige????

    lg c4f



  • hir das ist meine CreateMessage

    void CreateMessage(UINT i, HMENU hMenu)
    {
    	MENUITEMINFO mii;
    	mii.cbSize = sizeof(MENUITEMINFO);
    	mii.fType = MFT_STRING;
    	mii.fMask = MIIM_FTYPE | MIIM_DATA | MIIM_ID;
    	char str[MAX_PATH];
    	GetMenuString(hMenu,i,str,MAX_PATH,MF_BYPOSITION);
    	MessageBox(0,str,"Message",MB_OK);
    
    }
    

    ich benötige die ausgewählte position des menüs um sie an CreateMessage
    weiterzugeben.

    und bei Case kann ich ja schlecht 2-300 vordefines machen auserdem weis ich ja net wieviele einträge gemacht werden


Anmelden zum Antworten