Re: How to create a tooltip window which remains there until i
explicitly hide it.
This one works for me. I use a class CToolTipExtra, code see below:
HTH
class CMyFormView : public CFormView
{
...
CToolTipExtra m_ToolTip;
CButton m_SomeButton;
}
void CMyFormView::OnInitialUpdate()
{
...
//m_ToolTip.PreSetParent(AfxGetMainWnd());
m_ToolTip.PreSetParent(this);
}
void CMyFormView::ShowToolTipExtra(int nID)
{
CRect rect;
POINT pt;
m_SomeButton.GetWindowRect(&rect);
//AfxGetMainWnd()->ScreenToClient(&rect);
ScreenToClient(&rect);
pt.x = rect.right;
pt.y = rect.top;
m_ToolTip.ShowTip(pt, nID);
}
void CMyFormView::HideToolTipExtra()
{
m_ToolTip.HideTip();
}
////////////////////////////////////////////////////////////////////////////=
/
// based on a sample of
// Zarembo Maxim <zen@softzenware.com>
//
////////////////////////////////////////////////////////////////////////////=
/
// ToolTipExtra.h : Header-Datei
//
////////////////////////////////////////////////////////////////////////////=
/
#if !
defined(AFX_TOOLTIPEXTRA_H__4F97955F_DC40_4273_B33E_A4E6673C4656__INCLUDED_)=
#define
AFX_TOOLTIPEXTRA_H__4F97955F_DC40_4273_B33E_A4E6673C4656__INCLUDED_
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif
////////////////////////////////////////////////////////////////////////////=
/
// Fenster CToolTipExtra
class CToolTipExtra : public CWnd
{
// Konstruktion
public:
CToolTipExtra();
// Attribute
protected:
CWnd* m_pParent;
TOOLINFO m_ti;
CString m_strText;
// Operationen
public:
// =DCberschreibungen
// Vom Klassen-Assistenten generierte virtuelle
Funktions=FCberschreibungen
//{{AFX_VIRTUAL(CToolTipExtra)
//}}AFX_VIRTUAL
// Implementierung
protected:
void ShowTip(const POINT& pt);
public:
void ShowTip(const POINT& pt, LPCTSTR lpszText);
void ShowTip(const POINT& pt, UINT nID);
void HideTip();
void PreSetParent(CWnd* pParent);
virtual ~CToolTipExtra();
// Generierte Nachrichtenzuordnungsfunktionen
protected:
//{{AFX_MSG(CToolTipExtra)
// HINWEIS - Der Klassen-Assistent f=FCgt hier Member-Funktionen ein
und entfernt diese.
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
////////////////////////////////////////////////////////////////////////////=
/
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ f=FCgt unmittelbar vor der vorhergehenden Zeile
zus=E4tzliche Deklarationen ein.
#endif //
AFX_TOOLTIPEXTRA_H__4F97955F_DC40_4273_B33E_A4E6673C4656__INCLUDED_
////////////////////////////////////////////////////////////////////////////=
/
// Copyright:
// Uwe Kotyczka <uwe.kotyczka@jenoptik.com>
// created: April 2004
//
// based on a sample of
// Zarembo Maxim <zen@softzenware.com>
//
////////////////////////////////////////////////////////////////////////////=
/
// ToolTipExtra.cpp: Implementierungsdatei
//
#include "StdAfx.h"
#include "Special.h"
#include "ToolTipExtra.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////////=
/
// CToolTipExtra
CToolTipExtra::CToolTipExtra()
{
m_pParent = NULL;
}
CToolTipExtra::~CToolTipExtra()
{
}
BEGIN_MESSAGE_MAP(CToolTipExtra, CWnd)
//{{AFX_MSG_MAP(CToolTipExtra)
// HINWEIS - Der Klassen-Assistent f=FCgt hier Zuordnungsmakros ein
und entfernt diese.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
////////////////////////////////////////////////////////////////////////////=
/
// Behandlungsroutinen f=FCr Nachrichten CToolTipExtra
void CToolTipExtra::ShowTip(const POINT& pt)
{
// create a tooltip window
if (!IsWindow(m_hWnd))
{
DWORD dwStyle = TTS_ALWAYSTIP;
ASSERT(m_pParent == NULL || IsWindow(m_pParent->GetSafeHwnd()));
if (IsWindow(m_pParent->GetSafeHwnd()))
dwStyle |= WS_CHILD;
VERIFY(CreateEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, dwStyle,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
m_pParent->GetSafeHwnd(), NULL, NULL));
}
// initialize members of the TOOLINFO structure
m_ti.cbSize = sizeof(TOOLINFO);
m_ti.uFlags = TTF_TRACK;
m_ti.hwnd = NULL;
/*if (AfxIsValidString(lpszText))*/
m_ti.hinst = NULL;
m_ti.uId = 0;
m_ti.lpszText = (LPTSTR)(LPCTSTR)m_strText;
// tooltip control will cover the whole window
m_ti.rect.left = 0;
m_ti.rect.top = 0;
m_ti.rect.right = 0;
m_ti.rect.bottom = 0;
if (IsWindow(m_hWnd))
{
// send an TTM_ADDTOOL message to the tooltip control window
::SendMessage(m_hWnd, TTM_ADDTOOL, 0, (LPARAM)&m_ti);
// multiline support
::SendMessage(m_hWnd, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);
::SendMessage(m_hWnd, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(pt.x,
pt.y));
::SendMessage(m_hWnd, TTM_TRACKACTIVATE, TRUE, (LPARAM)&m_ti);
// force visibility
if (!IsWindowVisible())
ShowWindow(SW_SHOWNA);
}
}
void CToolTipExtra::ShowTip(const POINT& pt, LPCTSTR lpszText)
{
m_strText = lpszText;
ShowTip(pt);
}
void CToolTipExtra::ShowTip(const POINT& pt, UINT nIDText)
{
// This would restrict the tooltip to 80 characters.
/*m_ti.hinst = AfxFindResourceHandle(MAKEINTRESOURCE((nIDText>>4)+1),
RT_STRING);
ASSERT(m_ti.hinst != NULL);
ShowTip(pt, MAKEINTRESOURCE(nIDText));*/
m_strText.LoadString(nIDText);
ShowTip(pt);
}
void CToolTipExtra::HideTip()
{
if (IsWindow(m_hWnd))
{
::SendMessage(m_hWnd, TTM_TRACKACTIVATE, FALSE, (LPARAM)&m_ti);
// send an TTM_DELTOOL message to the tooltip control window
::SendMessage(m_hWnd, TTM_DELTOOL, 0, (LPARAM)&m_ti);
}
}
void CToolTipExtra::PreSetParent(CWnd* pParent)
{
ASSERT(pParent == NULL || IsWindow(pParent->GetSafeHwnd()));
m_pParent = pParent;
DestroyWindow();
}