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 ]
010
20.08.2003, 11:07 Uhr
0xdeadbeef
Gott
(Operator)


Der Dialog nimmt gar kein WM_NCHITTEST entgegen. Also, ich hab jetzt folgendes gemacht:

C++:
//MyDialog.h
class CMyDialog : public CDialog {
protected:
  CToolTipCtrl m_ttToolTip;
  //...
};



C++:
//MyDialog.cpp

CMyDialog::CMyDialog() {
    EnableToolTips();
}

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    //{{AFX_MSG_MAP(CMyDialog)
    ON_WM_CREATE()
    ON_WM_DESTROY()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

int CMyDialog::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    m_ttToolTip.Create(this, TTS_ALWAYSTIP);
    
    return 0;
}

void CMyDialog::OnDestroy()
{
    CDialog::OnDestroy();
    
    m_ttToolTip.DestroyWindow();
    
}

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    m_ttToolTip.RelayEvent(pMsg);
    
    return CDialog::PreTranslateMessage(pMsg);
}



C++:
//MyCanvas.cpp
BEGIN_MESSAGE_MAP(CMyCanvas, CWnd)
    //{{AFX_MSG_MAP(CMyCanvas)
    ON_WM_NCHITTEST()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

UINT CYieldCurveCanvas::OnNcHitTest(CPoint point)
{
    CString s;
    s.Format(_T("%d, %d"), point.x, point.y);
    m_ycsadParent->m_ttToolTip.AddTool(this, s);

    return CWnd::OnNcHitTest(point);
}


Jetzt schmiert er mir zwar nicht mehr ab, aber zeigt auch keinen ToolTip an. Was mach ich jetzt schon wieder falsch? Irgendwie steig ich durch diese Geschichte noch nicht so richtig durch...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 20.08.2003 um 11:10 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
20.08.2003, 12:47 Uhr
0xdeadbeef
Gott
(Operator)


OK. Ich bin jetzt mal nach dee Microsoft HOWTO zu dem Thema vorgegangen. Die liegt hier: http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q141/7/58.asp&NoWebContent=1

Mein Code sieht also jetzt so aus:

C++:
//MyDialog.h

class CMyDialog {
protected:
    CToolTipCtrl       *m_pttToolTip;

    public:
    virtual BOOL PreTranslateMessage(MSG* pMsg);
}



C++:
//MyDialog.cpp
CMyDialog::CMyDialog() : CDialog(CMyDialog::IDD), m_pttToolTip(NULL)
{

}

BOOL CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    m_pttToolTip = new CToolTipCtrl();
    m_pttToolTip->Create(this);
    m_pttToolTip->AddTool(GetDlgItem(IDC_DRAWINGAREA), _T("Test"));
    m_pttToolTip->Activate(TRUE);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
{
    if(m_pttToolTip)
        m_pttToolTip->RelayEvent(pMsg);
    return CDialog::PreTranslateMessage(pMsg);
}


Aber auch das will nicht so recht laufen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
21.08.2003, 17:52 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
hat sich Dein Problem erledigt, oder sitzt Du noch daran? Bin erst jetzt wieder zum lesen gekommen. Eigentlich sollten beide Varianten funktionieren.
Vielleicht eine blöde Frage, aber: UINT CYieldCurveCanvas::OnNcHitTest(CPoint point)
Hast Du die mit dem Assi oder per Hand eingefügt?
--
"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
013
29.08.2003, 13:36 Uhr
0xdeadbeef
Gott
(Operator)


Per Assistent. Wenn ich das nicht tue, hab ich mir doch ruck-zuck mein Projekt zerschossen, aus welchen Gründen auch immer...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
29.08.2003, 18:56 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo deadbeef,
falls es noch akut ist, werde ich mich mal am Wochende an der Problematik versuchen.
--
"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
015
30.08.2003, 10:32 Uhr
0xdeadbeef
Gott
(Operator)


Ich hab jetzt erstmal an einer anderen Stelle weitergemacht, aber das Problem besteht noch.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
01.09.2003, 22:24 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
bin am Wochende leider zu nichts gekommen, deshalb erst heute meine Antwort.
Habe mal eine Klasse von CToolTipCtrl abgeleitet. Hier ein paar wesentliche Auszüge:
Header:

C++:
class CMyToolTip : public CToolTipCtrl
{
// Konstruktion
public:
    CMyToolTip();

// Attribute
public:

// Operationen
public:

// Überschreibungen
    // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen
    //{{AFX_VIRTUAL(CMyToolTip)
    //}}AFX_VIRTUAL

// Implementierung
public:
    virtual ~CMyToolTip();
    BOOL AddWTool(CWnd*, LPCTSTR);
    BOOL AddRTool(CWnd*,LPCTSTR,LPCRECT,UINT);

    // Generierte Nachrichtenzuordnungsfunktionen
protected:
    //{{AFX_MSG(CMyToolTip)
        // HINWEIS - Der Klassen-Assistent fügt hier Member-Funktionen ein und entfernt diese.
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};


Impl.

C++:
..........
..........
BOOL CMyToolTip::AddWTool(CWnd* pWnd, LPCTSTR pszText){
    TOOLINFO ti;
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_IDISHWND|TTF_SUBCLASS;
    ti.hwnd = pWnd->GetParent()->GetSafeHwnd();
    ti.uId = (UINT) pWnd->GetSafeHwnd();
    ti.hinst = AfxGetInstanceHandle();
    ti.lpszText = (LPTSTR) pszText;
    return (BOOL) SendMessage(TTM_ADDTOOL,0,(LPARAM)&ti);
}

BOOL CMyToolTip::AddRTool(CWnd* pWnd, LPCTSTR pszText, LPCRECT lpR, UINT nIDTool){
    TOOLINFO ti;
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    ti.hwnd = pWnd->GetParent()->GetSafeHwnd();
    ti.uId = nIDTool;
    ti.hinst = AfxGetInstanceHandle();
    ti.lpszText = (LPTSTR) pszText;
    ::CopyRect(&ti.rect,lpR);
    return (BOOL) SendMessage(TTM_ADDTOOL,0,(LPARAM)&ti);
}


Danach wie folgt eingebunden:

C++:
/*........
........
//{{AFX_MSG(CTipsDlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    //}}AFX_MSG
    afx_msg void OnToolTipShow( NMHDR* , LRESULT* );
    DECLARE_MESSAGE_MAP()
private:
    CWnd* pWnd;
    CRect rect;
    CMyToolTip m_Tt;*/


BEGIN_MESSAGE_MAP(CTipsDlg, CDialog)
    //{{AFX_MSG_MAP(CTipsDlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
    ON_NOTIFY(TTN_NEEDTEXT,NULL,OnToolTipShow)
END_MESSAGE_MAP()

// in OnInitDialog()

EnableToolTips(TRUE);

    pWnd = (CWnd*)GetDlgItem(IDC_RECT);
    pWnd->GetWindowRect(&rect);
    m_Tt.Create(this);
    m_Tt.AddRTool(pWnd,LPSTR_TEXTCALLBACK,
        rect,IDC_RECT);

..............
..............
void CTipsDlg::OnToolTipShow(NMHDR * pNMHDR, LRESULT * pResult )
{
    TOOLTIPTEXT* pttt = (TOOLTIPTEXT*) pNMHDR;
    if(pttt->hdr.idFrom == IDC_RECT){
        CString string;
        POINT point;
        GetCursorPos(&point);
        string.Format(_T("%d: %d "),point.x,point.y);
        ::lstrcpy(pttt->szText,(LPCTSTR) string);
    }
}


So funzt das mittelprächtig :)
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 01.09.2003 um 22:27 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
02.09.2003, 17:23 Uhr
0xdeadbeef
Gott
(Operator)


Das funzt sogar recht gut. Zu Anfang hatte ich einen ganz merkwürdigen Fehler, aber den hab ich behoben gekriegt. Irgendwie hat sich die TooltipCtrl mit den WM_MOUSEHOVER und WM_MOUSELEAVE-Messagehandlern in die Haare gekriegt. Das hatte zur Folge, dass Tooltips erst angezeigt wurden, nachdem ich das entsprechende Unterfenster einmal mit der Maus verlassen hatte. zum Glück brauche ich die Handler jetzt nicht mehr...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
02.09.2003, 17:30 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
Na bist du jetzt doch noch zum MFC-Fan geworden?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
02.09.2003, 17:46 Uhr
0xdeadbeef
Gott
(Operator)


Nein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: