menu bar item (kein pop-up) highlighten, aber wie?
Hallo alle zusammen,
folgender Fall:
Ich habe eine Applikation vorliegen, die aus 5 Dialogen besteht. Zwischen den einzelnen Dialogen wird hin und hergeschaltet, indem man in der "menu bar"(ganz unten) auf das entsprechende Feld tippt. Die "menu bar" besteht also aus 5 Einträgen und diese sind keine "Pop-up-Menüs". Sobald ich ein "menu bar item" betätige, wird dieser (solange ich drauf tippe) gehighlighted und die Applikation wechselt in den richtigen Dialog. Sobald ich jedoch das "menu item", also den getippten Menü-Punkt wieder loslasse, verschwindet die gehighlightete Fläche und ich weiß nicht, in welchem Dialog ich mich befinde.
Ich benutze:
PPC 2003(iPAQ) mit Windows CE 4.2
unter embedded Visual C++4.0 SP4
MFC
Bei der Erstellung des Dialogs wird unter ::InitDialog() folgender code ausgeführt, um die "menu bar" zu erstellen:
SHMENUBARINFO mbi = {0};
memset(&mbi, 0, sizeof(SHMENUBARINFO));
mbi.cbSize = sizeof(SHMENUBARINFO);
mbi.hInstRes = AfxGetResourceHandle();
mbi.hwndParent = m_hWnd;
mbi.nToolBarId = IDR_MENUBAR_MAIN;
mbi.nBmpId = 0;
mbi.cBmpImages = 0;
if(SHCreateMenuBar(&mbi)==FALSE)
return FALSE;
}
FRAGE:
Kann mir jemand verraten, was ich tun soll, damit der Menü-Punkt nach dem drauftippen gehighlightet bleibt?
Folgende Funktionen schon ohne Erfolg ausprobiert:
-MENUITEMINFO
-GetMenuItemInfo
-SetMenuItemInfo
Vielen Dank im Voraus
MfG.EW.
AW: menu bar item (kein pop-up) highlighten, aber wie?
so weit ich weiss verhindert dir das die MFC, da sie die menübar für dich konstruiert. Ich würde dir die WinAPI empfehlen....
AW: menu bar item (kein pop-up) highlighten, aber wie?
Ciao
Das habe ich mal in einem Dialog mit Menubar gemacht, vielleicht hilfts dir was:
Erstelle folgende Memberfunktionen:
afx_msg void OnButton1();
afx_msg void OnButton2();
...
afx_msg void OnUpdateButton1(CCmdUI* pCmdUI);
afx_msg void OnUpdateButton2(CCmdUI* pCmdUI);
...
Der Pointer m_pWndEmptyCB ist ein Member von CDialog soweit ich mich erinnere. (Hab nur den Code ohne Entwicklungsumgebung und Hilfe hier...)
void CMyDialog::OnButton1()
{
m_pWndEmptyCB->OnUpdateCmdUI((CFrameWnd *) this, TRUE);
}
void CMyDialog::OnUpdateButton1(CCmdUI * pCmdUI)
{
BOOL bCheck = jenachdem_ob_es_markiert_sein_soll;
pCmdUI->m_pOther->SendMessage(TB_CHECKBUTTON, pCmdUI->m_nID, MAKELONG(bCheck , 0));
}
... Das gleiche für Button 2 usw...
Wie gesagt, ich hatte nur einen Dialog, aber vielleicht hilfts dir was.
Gruss
AW: menu bar item (kein pop-up) highlighten, aber wie?
Ach ja, wenn du CDialog verwendest, kannst du zum Laden der CommandBar folgendes verwenden:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CCeCommandBar * pCommandBar = (CCeCommandBar*) m_pWndEmptyCB;
pCommandBar->LoadToolBar(IDR_TOOLBAR);
return TRUE;
}
Gib Bescheid obs funktioniert.
Grüessli
AW: menu bar item (kein pop-up) highlighten, aber wie?
Kannst du bitte noch ein paar Worte dazu sagen?
Bin noch großer Anfänger.
-Wo alles muss ich was einfügen?
-Wozu dient die Funktion OnButton?
-Ich habe eine Funktion "StartAction" in die das Programm als erstes reinläuft, wenn der Button in der Menüleiste gedrückt wurde. Kann ich in diese etwas einfügen?
-Was ist mit der Message_MAP. Soll da etwas eingefügt werden?
-Ich will keine Toolbar kreieren, weil ich ja schon eine menu bar mit "SHCreateMenuBar" erstellt habe.
Vielen Dank
EW
AW: menu bar item (kein pop-up) highlighten, aber wie?
Jä so, also ich versuchs mal. (Ist ziemlich schwierig sowas über das Forum zu erklären, da man den bisherigen Code sehen müsste)
Zuerst muss ich noch wissen, wie hast du das Projekt kreiert? Als Dialog-Applikation oder als Standard-Applikation mit den Klassen CFrameBlabla, CDocumentBlabla oder so usw.? Der Code, den ich gepostet habe, funktioniert nur mit einer Dialogbasierten Anwendung denke ich...
Die Funktion OnButtonX ist die gleiche Funktion wie deine Funktion StartAction. Also dort hinein käme der Code von OnButtonX.
In der MESSAGE_MAP solltest du bereits einen Eintrag drin haben für das Ereignis, wenn du auf einen deiner Buttons klickst, etwa so:
ON_COMMAND(IDS_START_ACTION1, OnStartAction1)
Im Klassen-Assistent (Class-Wizzard), aufrufbar mit Ctrl+W, kannst du für deine Buttons auch Ereignisbehandlungsroutinen für UPDATE_COMMAND_UI erstellen.
Ich weiss nicht ob dies weiterhilft. Wenn du willst, kannst du mir den Code auch mal per Mail senden, damit ich mir ein genaueres Bild verschaffen kann (keine Angst, ich behandle ihn vertraulich... ;-) )
Gruss Philipp
Liste der Anhänge anzeigen (Anzahl: 1)
AW: menu bar item (kein pop-up) highlighten, aber wie?
Hallo .
Vielen Dank für eure Antworten. Ich habe einen Code erzeugt und als Anhang mitgesandt, der ähnlich wie meine Applikation aufgebaut ist. Es ist ein eVC 4.0 Projekt (SP4). Man kann es entweder mit dem Emulator oder mit einem richtigen Pocket PC starten. Am Anfang bekommt man irgendwelche Fehlermeldungen, diese einfach mit IGNORE abweisen (ca. 6 mal) und dann seht Ihr einen Hauptdialog mit 3 Buttons. Wenn man auf einen Button drückt, wird man in das jeweilige Dialogfenster geleitet. Es erscheint eine menu bar mit der man dann wieder wechseln kann. Aber der Button in der menu bar ist nicht gehighlightet.!!!!!!!!!!!!
Wie kriegt man es hin den Button zu highlighten?
Danke.
Liste der Anhänge anzeigen (Anzahl: 1)
AW: menu bar item (kein pop-up) highlighten, aber wie?
Hoi EW
Ich fürchte, du hast da ziemlich ein Durcheinander im Code. So etwas, wie du es möchtest, könnte man eleganter mit sogenannten Tab's machen (wie du sie z.B. vom Pocket PC unter Startmenu / Einstellungen her kennst).
Eine andere Möglichkeit ist Folgende: Du hast einen Hauptdialog, und von diesem rufst du dann per Menu die anderen Dialoge auf, zum Beispiel den About Dialog. Um zum ersten Dialog zurückzukehren, musst du dann auf "ok" tippen.
Ich habe mir erlaubt, für den ersten geschliderten Fall ein Projekt mit dem Grundgerüst zu erstellen. In den Klassen CSetupDlg, CToolsDlg und CAboutDlg findest du jeweils bereits vorgefertigte Funktionen für wenn der entsprechende Dialog aktiv oder eben nicht mehr aktiv wird.
Ich hoffe, dies hilft dir weiter.
Gruss Philipp
AW: menu bar item (kein pop-up) highlighten, aber wie?
Ja, du hast recht, das könnte man theoretisch mit tabs machen, jedoch verwende ich Tabs in meinem Projekt, um von der menu bar auf weitere unterpunkte zugreifen zu können. Mit anderen Worten: Die menu bar muss da schon bleiben.
Auch möchte ich auf keinen Fall erst auf OK(oben links) in einem Dialog drücken müssen um ins andere Dialogfenster zu kommen. Es muss ein sofortiger Wechsel zwischen den Dialogen stattfinden.
Hat jemand noch einen Vorschlag? Am einfachsten wäre ja in meinem Fall, wenn ich beim Start des Dialoges einfach den entsprechenden Button mit einer bestimmten Funktion highlighten könnte (aber mit welcher?)
Oder sollte ich die menu bar ganz anders aufbauen? API? Wie macht man sowas?
Vielen Dank für eure Hilfe.
MfG.EW.
AW: menu bar item (kein pop-up) highlighten, aber wie?
AW: menu bar item (kein pop-up) highlighten, aber wie?
Hier die Antwort (in englisch)
I've found the answer:
after creating the menubar you store the handle:
m_hstoredMB = mbi.hwndMB;
and then, if you press on the menubar item:
void CMyDlg::OnButtonPress()
{
TBBUTTONINFO tbi;
memset (&tbi, 0, sizeof (tbi));
tbi.cbSize = sizeof (tbi);
tbi.dwMask = TBIF_STATE;
::SendMessage (m_hstoredMB, TB_GETBUTTONINFO, ID_STATUS, (LPARAM)&tbi);
tbi.fsState = TBSTATE_ENABLED | TBSTATE_PRESSED;
::SendMessage (m_hstoredMB, TB_SETBUTTONINFO, ID_STATUS, (LPARAM)&tbi);
}
//ID_STATUS ist the ID of the pressed Button(seen in the Resources viev->menu bar
Danke für die Mitarbeit und Hilfe