tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
1529
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    chris_head chris_head ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    22
    Hallo,

    ich versuche jetzt schon einige Zeit einen Tooltip auf ein CEdit zu zaubern welches sich auf einem CWnd (KEIN CDialog und KEIN CView o.ä.) befindet. Leider bisher nicht von Erfolg gekrönt.
    Gegooglet hab ich schon sehr intensiv. Ich finde aber nur Lösungen für CEdit (oder anders Ctrl) auf CDialog /CFormView / CView ect.

    Kann mir jemand helfen?
    PS: verwende MFC mit VC6
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Zeig mal Code.

    Da wirst du vermutlich das CWnd subclassen müssen und mit RelayEvent die Mouse/Tastatur-Nachrichten an das Tooltip-Control weitergeben müssen.
     

  3. #3
    ks2 ks2 ist offline Grünschnabel
    Registriert seit
    Sep 2008
    Beiträge
    3
    ich weiß zwar nicht ob es unbedingt hilft, aber ich habe mir mal dazu folgendes notiert:

    Tooltips in einer CDialog-Anwendung anzeigen
    -der APP-Klasse folgende zwei Membervariablen zuweisen:
    Code :
    1
    2
    
        CToolTipCtrl *m_gpToolTip;
        HWND m_hwndDialog;
    -der APP-Klasse die virtuelle Funktion "ProcessMessageFilter" hinzufügen
    -in dieser Funktion folgenden Code einfügen:
    Code :
    1
    2
    3
    4
    5
    6
    
        if (m_hwndDialog != NULL)
            if (lpMsg->hwnd == m_hwndDialog || ::IsChild(m_hwndDialog, lpMsg->hwnd))
            {
                if (m_gpToolTip != NULL)
                    m_gpToolTip->RelayEvent(lpMsg);
            }
    -im Konstruktor der App-Klasse die variablen leeren
    Code :
    1
    2
    3
    
        //für ToolTips
        m_hwndDialog = NULL;
        m_gpToolTip = NULL;
    -der Dialog-Klasse folgende Membervariable hinzufügen:
    Code :
    1
    
        CToolTipCtrl *m_pToolTip;
    -im Konstruktor die Variable wieder leeren
    Code :
    1
    
        m_pToolTip=NULL;
    -im Destruktor oder in der OnDestroy den ToolTip freigeben
    Code :
    1
    2
    3
    
        //ToolTip freigeben
        if (m_pToolTip !=NULL)
            delete m_pToolTip;
    -Beachten Sie, dass für jedes Steuerelement, welches ToolTips erhalten soll, eine Membervariable von dessen Klasse vorhanden sein muss!
    -nun nur noch in der OnInitDialog-Funktion die Tooltips initialisieren:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
        //ToolTips initialisieren
        if (!m_pToolTip)
        {
            int rt;
            m_pToolTip=new CToolTipCtrl;
            rt=m_pToolTip->Create(this);
            ASSERT(rt != 0); //nur für Debug
            ((CTestZipDlgApp*)AfxGetApp())->m_gpToolTip=m_pToolTip;
            //für jedes Steuerelement welches einen ToolTip erhalten soll, hier eine Zeile einfügen
            rt=m_pToolTip->AddTool(&m_NewArchivButton,"Erstellt ein neues ZIP-Archiv");
            ASSERT(rt != 0);
            rt=m_pToolTip->AddTool(&m_ArchivOpenButton,"Öffnet ein vorhandenes ZIP-Archiv");
            ASSERT(rt != 0);
            rt=m_pToolTip->AddTool(&m_AddFiles,"fügt dem geöffneten Archiv Dateien hinzu");
            ASSERT(rt != 0);
            rt=m_pToolTip->AddTool(&m_ExtractFiles,"entpackt die ausgewählten Dateien");
            ASSERT(rt != 0);
            m_pToolTip->Activate(TRUE);
        }
        ((CTestZipDlgApp*)AfxGetApp())->m_hwndDialog=m_hWnd;
        //Ende ToolTip initialisieren
    Theoretisch sollte es auch mit GetDlgItem anstatt der Membervariablen funktionieren.
    Geändert von ks2 (10.09.08 um 21:52 Uhr)
     

  4. #4
    chris_head chris_head ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    22
    Mit Code zeigen wird schwer, weil sehr komplex. Ich versuchs mal sinnvoll zu kürzen .

    im Header:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ...
    class CMyDialog  : public CWnd
    {
     public:
       CMyDialog();
     private:
       CEdit* m_myEdit;
       ...
    }

    zugehörige Source
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    CMyDialog::CMyDialog()
    {
      m_myEdit = NULL
    }
     ...
    int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
      if (-1 == CWnd::OnCreate(lpCreateStruct))
            return -1;
      m_myEdit = new CEdit;
      m_myEdit->Create(WS_CHILD | WS_VISIBLE | ES_LEFT,  CRect(125,20,165,40), this, IDC_MYEDIT);
      m_myEdit->ShowWindow(SW_SHOW);
    ...
    }
    ...

    Ich habe schon mehrere Varianten für die Tooltip-Erstellung ausprobiert.
    Mit CTooltipCtrl und dem Ausführen des RelayEvent in PreTranslateMessage ging es in einem Beispiel mit CDialog. Aber mit CWnd funktionierte es nicht mehr.

    Mit ist gerade aufgefallen ,dass PreTranslateMessage keine MausMessages verarbeitet . Deshalb habe ich versucht mit OnMouseMove die WM_MOUSEMOVE msg abzufangen und innerhalb dieser Fkt. RelayEvent aufzurufen. Dazu habe ich ne Dummy MSG gebaut.
    Code :
    1
    2
    
    MSG msg;
    msg.message = WM_MOUSEMOVE;
    und dann die ins RelayEvent gepackt. Leider immer noch kein Tooltip zu sehen . Muss ich die MSG mit allen Parametern füllen? Wenn ja mit welchen?

    Hoffentlich reichen die Ausführungen jetzt .
    Geändert von chris_head (10.09.08 um 17:10 Uhr)
     

  5. #5
    ks2 ks2 ist offline Grünschnabel
    Registriert seit
    Sep 2008
    Beiträge
    3
    ich dachte immer cwnd wird nur für childwindows wie steuerelemente usw. verwendet.
    tut mir leid, ich hab es bisher nur bei cdialog abgeleiteten klassen verwendet und hab jetzt nix anderes da zum testen
     

  6. #6
    chris_head chris_head ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    22
    Ich hab nach langem Hin und Her mich dazu durchgerungen für jedes Control, das ich benutze, eine eigene Klasse (jeweils abgeleitet von der eigentlcihen Klasse, also MyEdit von CEdit usw.) zu schreiben. In jeder Klasse implementere ich ein CToolTipCtrl und entsprechende Methoden zum Erstellen und ändern des Tooltips.
    Das funktioniert erstmal. Ich finde es aber nicht sehr schön.
    Außerdem wollte ich die ganzen Tooltipsachen in ne extra Klasse packen. Damit ich von der ToolTipKlasse erben kann (z.B. class MyEdit : public CEdit , public MyToolTip) . Leider habe ich die MyToolTip von CWnd abgeleitet, damit ich WM_MouseMove usw. abfangen kann. Dadurch kommt es zu Fehlern da ja Cedit und MyToolTip beide von CWnd abgeleitet sind und beim Übersetzen nicht genau bestimmt ist aus welcher Klasse eine CWnd-Methode aufgerufen werden soll. Kann mir da jemand nen schlauen Tipp geben? Am liebsten mit Lösungsansatz.
    Geändert von chris_head (11.09.08 um 16:12 Uhr)
     

Ähnliche Themen

  1. WINAPI Tooltip für Button erzeugen
    Von souljumperZ im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 18.01.08, 18:28
  2. CWnd-Objekt drehen
    Von titanic im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 16.10.07, 09:58
  3. CWnd und HWND
    Von SCIPIO-AEMILIANUS im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 15.06.07, 13:52
  4. CWnd Problem
    Von CodeFatal im Forum VisualStudio & MFC
    Antworten: 4
    Letzter Beitrag: 14.08.06, 12:08
  5. CWnd::Create
    Von Antifant im Forum VisualStudio & MFC
    Antworten: 9
    Letzter Beitrag: 21.09.04, 08:24