Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Tooltips von Hand anzeigen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
19.08.2003, 15:35 Uhr
0xdeadbeef
Gott
(Operator)


Moin,

Wie krieg ichs hin, von Hand nen Tooltip anzuzeigen, also ohne, dass das Framework mir ne Nachricht schickt? Ich hab hier eine von CWnd abgeleitete Klasse, die bei einem WM_MOUSEHOVER-Event u.U. einen Tooltip anzeigen soll, und die MSDN ist da nicht sonderlich auskunftsfreudig...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.08.2003, 16:00 Uhr
mike
Pinguinhüpfer
(Operator)


Hi!
Also es müsste mit OnNcHitTest(CPoint point) gehen. Du musst ja den Tooltip erzeugen. Du übergibst dem Tooltip ja den fensterPointer (this bei abgeleiteter Klasse sonst Refernz auf das Parent-Control). Mit UpdateTipText kannst du dann den Text ändern - je nach dem was CPoint dir zurück gibt.

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.08.2003, 16:36 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab ja gar keine Control. Hätt ich vielleicht dazu schreiben sollen... Also, ich hab eine von CWnd abgeleitete Klasse, so eine Art Canvas, in die ich reinmale. Keine Controls, kein garnichts. Wenn ich jetzt also ein WM_MOUSEHOVER abfange und feststelle, dass der Mauszeiger über einem Punkt ist, an dem gerade was interessantes zu sehen ist, will ich einen Tooltip anzeigen, in dem ein bisschen nähere Information zu dem Punkt steht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.08.2003, 16:53 Uhr
mike
Pinguinhüpfer
(Operator)


OnNcHitTest(CPoint point) übernimmt h einen Punkt
Also probier mal folgendes: Füg in dein CWnd2 Klasse einen Membervariabke ein CToolTipCtrl m_wndToolTip;
Falls OnCreate(LPCREATESTRUCT lpCreateStruct) nicht vorhanden, Strg+W un WM_CREATE einfügen.
Dann schreib in Oncreate folgendes rein:

C++:
if (!m_wndToolTip.Create(this, TTS_ALWAYSTIP))
  TRACE("TOOLTIPS: Da is was schief gegangen");


Dann füg noch WM_DESTROY ein:

C++:
m_wndToolTip.DestroyWindow();


Dann noch in PreTranslateMessage

C++:
m_wndToolTip.RelayEvent(pMsg);


Dann würd ich mit ON_WM_NCHITTEST() arbeiten. Füg das in die MessageMap ein udn anschließend noch den Funktionsprototypen in die *.h

C++:
afx_msg UINT OnNcHitTest(CPoint point);


In der Funktion kannst du dann sagen, ob der Mauscursur in deinem gezeichneten Sachen ist. Mit PtInRect kannst du sagen, ob der von OnNcHitTest zurückgegebene Punkt in den von die definierten Rect befindet. ICh denke da bietet sich eine CMap an.
Und wnenn der Cursor im Rect ist, dann UpdateTipText und es müsste der richtige Text angezeigt werden

Der Funktionsrumpf von schaut folgendermaßen aus

C++:
UINT CMyClass::OnNcHitTest(CPoint point)
{
   return Basisklasse::OnNcHitTest(point);
}


mfg
--

Dieser Post wurde am 19.08.2003 um 16:57 Uhr von mike editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.08.2003, 18:12 Uhr
0xdeadbeef
Gott
(Operator)


Dabei schmiert er mir ständig ab, der Debugger bleibt in der Tooltip.cpp stehen, und zwar genau...

C++:
void CToolTipCtrl::UpdateTipText(LPCTSTR lpszText, CWnd* pWnd, UINT nIDTool)
{
    ASSERT(::IsWindow(m_hWnd)); //<-- Hier.
    ASSERT(pWnd != NULL);

    TOOLINFO ti;
    FillInToolInfo(ti, pWnd, nIDTool);
    ti.lpszText = (LPTSTR)lpszText;
    ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)&ti);
}


Die Methode wird aufgerufen aus

C++:
UINT CMyCanvas::OnNcHitTest(CPoint point)
{
    CString s;
    s.Format(_T("%d, %d"), point.x, point.y);
    m_ttToolTip.UpdateTipText(s, this, IDC_DRAWINGAREA);

    return CWnd::OnNcHitTest(point);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.08.2003, 20:00 Uhr
mike
Pinguinhüpfer
(Operator)


Auf die Schnelle sehe ich den Fehler leider nicht. Es handelt sich aber um eine ungültiges Window Handle. Wenn du willst kann ichs mal Probieren. Schicks einfach an mvodep@gmx.net

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2003, 20:43 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
hab jetzt Deine Variante nicht kompilliert, aber
Initalisierung:

C++:
m_ttToolTip.Create(this);


und wie bei Dir:

C++:
UINT CMyCanvas::OnNcHitTest(CPoint point)
{
    CString s;
    s.Format(_T("%d, %d"), point.x, point.y);
    m_ttToolTip.AddTool(this, s);

    return CWnd::OnNcHitTest(point);
}


sollte eigentlich schon reichen.
Edit-- Ok. Hab jetzt gesehen, das Du nicht den ganzen Dialog nutz. Dann brauchst Du noch einen gültigen Zeiger auf die Zeichenfläche.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 19.08.2003 um 20:49 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.08.2003, 21:38 Uhr
mike
Pinguinhüpfer
(Operator)


Hmm. Wenn ich dich richtig verstanden habe, musse ich den this Ziger, gegen einen CView zeiger ersetzen oder?

mfg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.08.2003, 21:55 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab gar keinen CView-Zeiger. Der Aufbau ist in etwa so:

C++:
//MyCanvas.h
class CMyCanvas : public CWnd {
  //...
};



C++:
//MyCanvas.cpp
BEGIN_MESSAGE_MAP(CMyCanvas, CWnd)
  ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
END_MESSAGE_MAP

void CMyCanvas::OnMouseHover(WPARAM nFlags, LPARAM pt) {
  CPoint point(pt);

  //hier soll festgestellt werden, ob ein Tooltip gezeigt werden muss
  //und ggf. der String berechnet und jener angezeigt werden.
}



C++:
//MyDialog.h
class CMyDialog : public CDialog {
protected:
  CMyCanvas m_mcDrawingArea;
};


Ich hab grad keinen Zugriff auf meinen Code, deswegen dieser Pseudo-Code, aber ich denke, der Aufbau wird klar. Ich hab jetzt also den Kram von Mike in die Implementierung von CMyCanvas gebastelt, und da schmiert mir das Ding ab.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.08.2003, 22:15 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Zitat:
mike postete
Hmm. Wenn ich dich richtig verstanden habe, musse ich den this Ziger, gegen einen CView zeiger ersetzen oder? :wink:


mal davon abgesehen das deadbeef die Sache schon aufgelöst hat...
Nehmen wir also mal an, man arbeitet mit einem Dialog welcher als Zeichenfläche ein CStatic mit der ID IDC_DRAWINGAREA enthält (welcher ja auch von CWnd abgeleitet ist).
Dann muß dieses die Eigenschaft SS_NOTIFY also Benachrichtigung erhalten.

C++:
UINT CMeinDlg::OnNcHitTest(CPoint point)
{
    CString s;
    CWnd* p = GetDlgItem(IDC_DRAWINGAREA);
    s.Format("%d, %d",point.x,point.y);
    m_tip.AddTool(p,s);
    
    return CDialog::OnNcHitTest(point);
}


dürfte somit funktionieren.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: