mit einem Symbolleiste Arbeiten, die einige Menüpunkte aus dem Menü einer älteren MFC-Anwendung wiederholt, ich habe auch in dieser Frage von Tooltips arbeite als (1) zur Änderung der Symbolleisten-Bitmap, um zusätzliche Symbole einzufügen und (2) Bereitstellung von Benutzer-Feedback zum aktuellen Anwendungszustand. Mein Problem ist, dass ich das meiste manuell erledigen muss, anstatt die verschiedenen Assistenten und Werkzeuge zu verwenden.
Was ich getan habe, ist (1) neue Mitglieder der CView abgeleiteten Klasse hinzuzufügen, um zusätzliche Nachrichten zu behandeln, (2) die Symbolleisten-Bitmap geändert, um die zusätzlichen Symbole mit MS Paint und dem Ressourceneditor hinzuzufügen, und (3) neue Ereignis-IDs und Ereignisbehandlungsroutinen zur Nachrichtenzuordnung für die von CView abgeleitete Klasse hinzugefügt.
Ein Problem, das ich mit der Änderung der Symbolleisten-Bitmap hatte, war, dass ich seit dem Einfügen eines Symbols ein vorhandenes Symbol in der Bitmap nach rechts verschieben musste. Mein erster Versuch führte dazu, dass das verschobene Symbol als leer in der Werkzeugleiste der Anwendung angezeigt wurde. Dann erkannte ich, dass ich ein bisschen mehr zur Länge der Symbolleisten-Bitmap hinzufügen musste. Nachdem Sie dem letzten Symbol in der Symbolleisten-Bitmap weitere Spalten hinzugefügt haben, um eine Standardbreite in Pixeln zu erhalten, wird das Symbol ordnungsgemäß angezeigt.
Für Tooltips habe ich die folgende auf die Nachricht Karte:
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText)
ich die folgende Methode zu meiner Klasse dann hinzugefügt, um die Benachrichtigungen für meine Menüpunkte zu behandeln. Als eine Randnotiz scheint es, dass OnToolTipText()
ist die Standardmethode in CFrameWnd
Klasse und CMDIChildWnd
Klasse jedoch stammt aus CWnd
wie auch CFrameWnd
verwendet, so bezweifle ich, dass es einen Unterschied macht, was die Methode benannt ist.
inline BOOL CPCSampleView::OnToolTipText(UINT id, NMHDR * pNMHDR, LRESULT * pResult)
{
static wchar_t toolTextToggleExportSylk [64] = L"Toggle SYLK export.";
static wchar_t toolTextClearWindow [64] = L"Clear the log displayed.";
static wchar_t toolTextConnectLan [64] = L"Log on the POS terminal through the LAN.";
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR;
switch (pNMHDR->idFrom) {
case ID_TOGGLE_SYLK_EXPORT:
pTTT->lpszText = toolTextToggleExportSylk;
return TRUE;
case ID_WINDOW_CLEAR:
pTTT->lpszText = toolTextClearWindow;
return TRUE;
case ID_CONNECT_LAN_ON:
pTTT->lpszText = toolTextConnectLan;
return TRUE;
}
// if we do not handle the message then return FALSE to let someone else do it.
return FALSE;
}
Für die Nutzer-Feedback auf einen Menüpunkt, der eine Datei exportieren schaltet, wenn Berichte tun ich die folgenden Änderungen an der Nachricht Karte zur Verfügung gestellt und dann die erforderlichen Methoden implementiert. Es gibt zwei Arten von Nachrichten beteiligt, so hatte ich zwei Methoden hinzufügen und zwei neue Nachricht Map-Einträge:
// New message map entries to handle the menu item selection event
// and to update the menu item and the toolbar icon with state changes
ON_COMMAND(ID_TOGGLE_SYLK_EXPORT, OnToggleExportSylk)
ON_UPDATE_COMMAND_UI(ID_TOGGLE_SYLK_EXPORT, OnUpdateToggleExportSylk)
// New methods added to the CView derived class
// handle the menu selection event generated by either selecting the menu item
// from the menu or by clicking on the icon in the toolbar.
void CPCSampleView::OnToggleExportSylk()
{
// Exclusive Or to toggle the indicator bit from 0 to 1 and 1 to 0.
GetDocument()->ulReportOptionsMap ^= CPCSampleDoc::ulReportOptionsExportSylk;
}
// handle the request from the MFC framework to update the displayed state this
// not only does a check mark against the menu item it also causes the toolbar
// icon to appear depressed if click is set or non-depressed if click is not set
inline void CPCSampleView::OnUpdateToggleExportSylk (CCmdUI* pCmdUI)
{
if (GetDocument()->ulReportOptionsMap & CPCSampleDoc::ulReportOptionsExportSylk)
{
// SYLK export is turned on so indicate status to the user. This will
// put a check mark beside the menu item and show the toolbar button depressed
pCmdUI->SetCheck (1);
}
else
{
// SYLK export is turned off so indicate status to the user. This will
// remove the check mark beside the menu item and show the toolbar button as raised.
pCmdUI->SetCheck (0);
}
}
Die Ressourcendatei Änderungen erforderlich wurden auch eine neue Schaltfläche für die Kniehebelwirkung zu schaffen, wie eine neue hinzufügen Menüpunkt für die Toggle-Aktion. Ich benutze die gleiche Ressourcen-ID für mehrere verschiedene Dinge, da diese alle getrennt sind. Also ist die ID für die Ressourcen-Zeichenfolge die gleiche wie für den Menü-Eintrag und ist für den Symbolleisten-Button gleich, um mein Leben zu vereinfachen und es leichter zu machen, alle bestimmten Bits und Stücke zu finden.
Die Symbolleiste Ressource-Datei Definition wie folgt aussieht:
IDR_MAINFRAME TOOLBAR 16, 15
BEGIN
BUTTON ID_CONNECT_LAN_ON
SEPARATOR
BUTTON ID_WINDOW_CLEAR
SEPARATOR
BUTTON ID_TOGGLE_SYLK_EXPORT
SEPARATOR
BUTTON ID_APP_ABOUT
END
Und das spezifische Teil des Menüs, das die gleiche Ressource-ID für die Toggle-Ereignis-ID verwendet wie folgt aussieht:
MENUITEM "Export to SYLK file", ID_TOGGLE_SYLK_EXPORT
Dann Geben Sie den Text der Statusleiste ein, der mit der Maus angezeigt wird. Dort befindet sich eine Zeichenfolgetabellen - Addition:
Das lpszText
Mitglied der struct ist in der Dokumentation für den MSDN TOOLINFO
struct beschreiben als:
Zeiger auf den Puffer, der den Text für das Werkzeug enthält, oder Identifikator der String-Ressource, die den Text enthält. Dieses Element wird manchmal verwendet, um Werte zurückzugeben. Wenn Sie den zurückgegebenen Wert untersuchen müssen, müssen Sie auf einen gültigen Puffer ausreichender Größe zeigen. Andernfalls kann es auf NULL gesetzt werden. Wenn LpszText auf LPSTR_TEXTCALLBACK festgelegt ist, sendet das Steuerelement die TTN_GETDISPINFO-Benachrichtigung Code an das Besitzerfenster, um den Text abzurufen.
Überprüfung der bestehenden Antwort auf diese Frage, fragte ich mich über die if
Aussage Prüfung für die TTF_IDISHWND
Flagge. Die MSDN-Dokumentation für die TOOLINFO
Struktur hat folgendes zu sagen:
Zeigt an, dass die Benutzer-ID Mitglied der Fenstergriff mit dem Werkzeug. Wenn dieses Flag nicht gesetzt ist, ist uId die Kennung des Tools.
Ich habe ein ähnliches Problem auf Windows XP (und nur auf XP, keine Probleme auf Vista, 7 und 8) festgestellt. Ich habe einen Knopf mit einer Werkzeugspitze in einem modalen Dialog.Wenn die Maus über der Schaltfläche anhält, wird die QuickInfo nach einer sehr kurzen Verzögerung angezeigt. So weit, ist es gut. Nun geht die Tool-Spitze weg, wenn eine der folgenden zwei Bedingungen erfüllt ist: 1) der Benutzer bewegt die Maus aus der Taste, 2) der Benutzer bewegt die Maus nicht für 4 oder 5 Sekunden. Wenn die QuickInfo aufgrund der zweiten Bedingung nicht mehr angezeigt wird, wird sie in diesem Dialogfeld nicht mehr angezeigt, es sei denn, der Dialog wird geschlossen und erneut geöffnet. –
Ich benutze auch eine Windows XP-Maschine. Ich habe keine Probleme # 2, wie Sie aufgelistet haben, ich kann den Tooltipp verschwinden lassen und es wird wiederkommen, nachdem ich entferne + die Maus darüber bewegen. Mein Problem ist, dass der Tooltip niemals für eindeutige Steuerelemente angezeigt wird, und nicht für spezifische Steuerelemente. Es scheint für einige CCheckBox und einige wird es nicht, es scheint für einige CEdit und einige wird es nicht. Der Tooltip blinkt außerdem etwa alle 50 ms, wodurch er halb unlesbar wird. aber das ist nur mit Nicht-Standard-Mäusen wie dem "Kreuz", das ich oft für Bildschirmpräzision verwende. –
Windows-Tooltips sind eine der größten PITA-Funktionen (zu implementieren) aller Zeiten. –