2013-03-26 10 views
6

Ich habe die Aufgabe, jedem Element in einem Konfigurationsmenü Tooltips zuzuweisen. Ich habe das Hinzufügen der QuickInfo zu jedem Steuerelement auf der Seite abgeschlossen, aber es scheint manchmal, dass die QuickInfo angezeigt wird und manchmal nicht, je nach der Position des Steuerelements auf dem Bildschirm.MFC-Tooltips werden nur bei besonderen Anlässen angezeigt

Um Tooltip-Erize die Seiten, die ich zuerst

EnableToolTips(TRUE); 

in jedem OnInitDialog-Methode des CPropertyPage. I fügen Sie dann die Benachrichtigung Karte

ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipText) 

Mit der Funktion OnToolTipText suchen als solche

BOOL CCfgPrefPage::OnToolTipText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) 
{ 
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
    UINT nID = pNMHDR->idFrom; 

    if (pTTT->uFlags & TTF_IDISHWND) 
    { 
     nID = ::GetDlgCtrlID((HWND)nID); 
     if(nID) 
     { 
      if(nID == GetDlgItem(IDC_PICKDIST_EDIT)->GetDlgCtrlID()) 
       _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE); 
      else if(nID == GetDlgItem(IDC_ENDPTTOL_EDIT)->GetDlgCtrlID()) 
       _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE); 

      pTTT->lpszText = pTTT->szText; // Sanity Check 
      pTTT->hinst = AfxGetResourceHandle(); // Don't think this is needed at all 
      return TRUE; 
     } 
    } 
    return FALSE; 
} 

Es ist für einige meiner Kontrollen scheint die Werkzeugspitze nach oben nicht zeigen. Bei den meisten Kontrollkästchen-Steuerelementen wird die QuickInfo angezeigt, für einige jedoch nicht. Es gibt keine anderen Kontrollen, die sie verdecken, sie sind nicht behindert.

Eine andere Sache, wenn ich die nicht-Standard-Cursor-Fenster wiederholt blinkt die QuickInfo, so dass es in einigen Fällen so unlesbar ist. Wie kann ich das beheben? Dies ist kein Problem für CEdit-Steuerelemente, also warum ist es anderswo ein Problem?

EDIT: Update, die Steuerelemente, die auf den Seiten seit Jahren gewesen sind, scheinen Tooltips zu zeigen. Jedes Steuerelement, das ich jetzt/heute hinzufügen möchte, zeigt keine Tooltips an. Unabhängig von der Position, dem Steuerungstyp und den Einstellungen kann kein einziger Tooltipp auf einem neu eingefügten Steuerelement angezeigt werden.

+0

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. –

+0

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. –

+3

Windows-Tooltips sind eine der größten PITA-Funktionen (zu implementieren) aller Zeiten. –

Antwort

6

Wenn Sie nicht Helper-Klasse verwenden möchten, habe ich vorgeschlagen, dann beheben Sie die Probleme in Ihrem Code. Zuerst Verwendung ON_NOTIFY_EX_RANGE Makro, wenn die selbst Handler Abbildung, wie folgt aus (diese werden alle IDs abdecken):

ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText) 

Als nächstes müssen Sie Ihre Funktion beheben. Ich sehe hier ein paar Probleme. Zuerst müssen Sie beim Testen auf das TTF_IDISHWND-Flag den NID nur erneut initialisieren. Sie müssen dies nicht auf die gesamte Funktion anwenden. Zweitens, nach allen Manipulationen wird Ihre NID die tatsächliche Dialog-ID sein. Es besteht keine Notwendigkeit zu GetDlgItem() Funktion

BOOL CCfgPrefPage::OnToolTipText(UINT id, NMHDR * pNMHDR, LRESULT * pResult) 
{ 
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; 
    UINT nID = pNMHDR->idFrom; 

    if (pTTT->uFlags & TTF_IDISHWND) 
    { 
     nID = ::GetDlgCtrlID((HWND)nID); 
    } 
    if(nID) 
    { 
     if(nID == IDC_PICKDIST_EDIT) 
      _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE); 
     else if(nID == IDC_ENDPTTOL_EDIT) 
      _tcsncpy_s(pTTT->szText, _T("Tool Tip Text"), _TRUNCATE); 

     //pTTT->lpszText = pTTT->szText; // Sanity Check 
     *pResult = 0; 
     return TRUE; 
    } 
    return FALSE; 
} 
+0

, dass Sie für die Mühe , aber das löst meine Probleme nicht. Ich stimme zu, es ist der richtige Weg, um die Funktion zu schreiben. Aber es gibt immer noch 4-5 Steuerelemente auf jeder CPropertyPage, die keinen Tooltip zeigen. Wie kann ich dies debuggen, um zu sehen, wohin die Nachrichten gehen? –

+0

@BumSkeeter - Die Antwort von cha sollte funktionieren. 'EnableToolTips' funktioniert jedoch nur mit ** child ** Steuerelementen des *** CWnd-Objekts ***, an dem es aufgerufen wird. Können Sie bestätigen, dass die neuen Steuerelemente, die Sie hinzugefügt haben, als ** untergeordnete Steuerelemente dieses CWnd-Objekts erstellt werden? – mfc

0

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.

Verwandte Themen