ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
1529
1529
EMPFEHLEN
-
10.09.08 15:03 #1
- 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
-
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.
-
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:
-der APP-Klasse die virtuelle Funktion "ProcessMessageFilter" hinzufügenCode :1 2
CToolTipCtrl *m_gpToolTip; HWND m_hwndDialog;
-in dieser Funktion folgenden Code einfügen:
-im Konstruktor der App-Klasse die variablen leerenCode :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); }
-der Dialog-Klasse folgende Membervariable hinzufügen:Code :1 2 3
//für ToolTips m_hwndDialog = NULL; m_gpToolTip = NULL;
-im Konstruktor die Variable wieder leerenCode :1
CToolTipCtrl *m_pToolTip;
-im Destruktor oder in der OnDestroy den ToolTip freigebenCode :1
m_pToolTip=NULL;
-Beachten Sie, dass für jedes Steuerelement, welches ToolTips erhalten soll, eine Membervariable von dessen Klasse vorhanden sein muss!Code :1 2 3
//ToolTip freigeben if (m_pToolTip !=NULL) delete m_pToolTip;
-nun nur noch in der OnInitDialog-Funktion die Tooltips initialisieren:
Theoretisch sollte es auch mit GetDlgItem anstatt der Membervariablen funktionieren.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 initialisierenGeändert von ks2 (10.09.08 um 21:52 Uhr)
-
10.09.08 15:39 #4
- 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.
und dann die ins RelayEvent gepackt. Leider immer noch kein Tooltip zu sehenCode :1 2
MSG msg; msg.message = WM_MOUSEMOVE;
. 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)
-
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
-
11.09.08 16:10 #6
- 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
-
WINAPI Tooltip für Button erzeugen
Von souljumperZ im Forum C/C++Antworten: 2Letzter Beitrag: 18.01.08, 18:28 -
CWnd-Objekt drehen
Von titanic im Forum VisualStudio & MFCAntworten: 1Letzter Beitrag: 16.10.07, 09:58 -
CWnd und HWND
Von SCIPIO-AEMILIANUS im Forum C/C++Antworten: 0Letzter Beitrag: 15.06.07, 13:52 -
CWnd Problem
Von CodeFatal im Forum VisualStudio & MFCAntworten: 4Letzter Beitrag: 14.08.06, 12:08 -
CWnd::Create
Von Antifant im Forum VisualStudio & MFCAntworten: 9Letzter Beitrag: 21.09.04, 08:24





Zitieren
Login






