Menü Problem
-
Also ich hab das so.
Im Hauptprogrammcase 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 weiterHoffe 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 mirNatü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
bspswitch( 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