Menü Problem



  • @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



  • Und warum funktioniert nicht einfach?

    CreateMessage(iAuswahl, hMenu);
    

    schirrmie



  • jap funks 😃 , noch ne frage jetzt zeigt er mir bei jeder auswahl die messagebox an auch bei beenden und wiederherstellen da es ein tray menü ist.
    Lassen sich menüs ausschließen 😕 , nur ne frage 😃



  • Tzz...:

    if(iAuswahl >= ID_MENU_START_ID && iAuwahl <= ID_MENU_LAST_ID)
       CreateMessage(...);
    


  • vielen dank 😃 Funk Alles und sorry das ich genervt habe 😃 bessere hilfe kann man nirgens bekommen :p


Anmelden zum Antworten