Basisklasse für Controls
-
Wenn ich das richtig verstehe wird TTN_NEEDTEXTW nur ausgelöst wenn der Tooltip angezeigt werden soll, also nur einmal. Zudem spare ich ich mir ja gerade die ganze Nachrichtenbehandlung. Alles was man noch tun muss ist die ctrl.h zu includieren und CBeliebigesWnd m_wnd mit Ctrl<CBeliebigesWnd> m_wnd zu ersetzen.
-
Aber es gehen Ressourcen drauf ohne Ende. Und selbst wenn Du solch ein Handling hast.Du könntest ein Standard-System ja auch für die Basisklasse entwickeln...
Aber wie Du meinst.
-
Genau da liegt ja mein Problem, um eine Standardklasse zwischen zu schalten muss man ja sämtliche vorhandenen Controlklassen ändern, das würde ich aber gern umgehen.
Vieleicht fehlt mir auch ein bisschen der Einblick wieviele Resourcen so ein ToolTipCtrl wirklich verbraucht. Ich habe jetzt einen Dialog mit ca. 40 Controls, dafür werden insgesamt 5 ToolTipCtrls erstellt, das werden sicher auch noch ein paar mehr, aber ist das schon zu viel?Kann man vieleicht einem Template irgendwie beibringen, das es die statische Variable wirklich nur einmal geben soll, und nicht für jede class T eine?
-
Jedes Tooltip ist ein aktives Fenster und ein Subclass!
-
Ich weiss schon, ich nerv manchmal ein bisschen

Ist denn, bei dem Weg über EnableTooltips, sichergestellt daß nur ein ToolTipCtrl existiert? Mein MainDlg enthält mehrere Unterdialoge die aber dynamisch erstellt werden müssen, da die Anzahl variiert. D.h. doch daß ich EnableToolTips für jeden Unterdialog aufrufen müsste. Wird denn da nicht intern auch ein weiteres CToolTipCtrl erstellt?EDIT: Zum vorherigen Post: es zeigt, trotzdem nur 5 ToolTipCtrls existeren, jedes der 40 Controls einen (teilweise dynamischen) ToolTip an! (Nur um Unklarheiten zu beseitigen.)
-
Nein! Für all das benötigt die MFC exakt 1 Tooltip!
-
Mein Problem ist also, daß für jeden Controltyp ein ToolTipControl erstellt wird. Hast Du da vieleicht noch eine Idee? Jetzt wird ja für jeden Templateparameter T eine Klasse erstellt, damit werden aber auch die statischen Variablen geklont. Meine Idee wäre jetzt das Template noch von einer weiteren Klasse abzuleiten, die die statische Variable enthält, also etwa so:
class CStaticToolTip { public: static CToolTipCtrl m_tt; } template <class T> CCtrl : public T, public CStaticToolTip { ... }Damit sollte m_tt nur noch einmal exisitieren. Sieht aber irgendwie nicht schön aus

-
Es funktioniert, nicht ganz so wie gedacht, aber es funktioniert
Es existiert jetzt nur noch ein ToolTipCtrl 
Und zwar wie folgt:Implementierung der Klasse für das statische TTCtrl:
StaticToolTip.h:#pragma once class CToolTipCtrl; class CStaticToolTip { public: CStaticToolTip(CWnd* pWnd); protected: static CToolTipCtrl m_tt; };StaticToolTip.cpp:
#include "StdAfx.h" #include "StaticToolTip.h" #include <afxcmn.h> CToolTipCtrl CStaticToolTip::m_tt; CStaticToolTip::CStaticToolTip(CWnd* pWnd) { static bool bOnce = true; //m_tt.Create darf nur einmal aufgerufen werden! if(bOnce) { if (!m_tt.Create(pWnd,TTS_ALWAYSTIP)) { TRACE("Unable To create ToolTip\n"); } else { m_tt.Activate(true); } } bOnce=false; }Und zu guter Letzt, das Template:
Ctrl.h#pragma once #include "statictooltip.h" template<class T> class CCtrl : public T, public CStaticToolTip { public: CCtrl(); virtual ~CCtrl(); public: void SetToolText(LPCTSTR lpszText); //Setzen des ToolTextes protected: virtual BOOL PreTranslateMessage(MSG* pMsg); // weiterleiten der Messages an m_tt.RelayEvent virtual void PreSubclassWindow(); // Initialisierung des ToolTips bei der Erzeugung des Controls }; template<class T> CCtrl<T>::CCtrl() : CStaticToolTip(this) { } template<class T> CCtrl<T>::~CCtrl() { } template<class T> void CCtrl<T>::SetToolText(LPCTSTR lpszText) { CStaticToolTip::m_tt.UpdateTipText(lpszText,this); } template<class T> void CCtrl<T>::PreSubclassWindow() { if(!CStaticToolTip::m_tt.AddTool((T*)this,"ToolTip Not Set")) { TRACE("Unable To Add ToolTip\n"); } T::PreSubclassWindow(); } template<class T> BOOL CCtrl<T>::PreTranslateMessage(MSG* pMsg) { CStaticToolTip::m_tt.RelayEvent(pMsg); return T::PreTranslateMessage(pMsg); }Bsp. zur Benutzung:
CMyDialog.h:
#include "ctrl.h" class CMyDialog ... { ... CCtrl<CEdit> m_edit; //beliebiges control, vorher CEdit m_edit ... }CMyDialog.cpp:
//z.B. in: CMyDialog::DoDataExchange(CDataExchange* pDX) { DDX,DDV Aufrufe; CString str; m_edit.GetWindowText(str); m_edit.SetToolText(str); //Dadurch wird der Inhalt des Edits in den ToolTip geschrieben //was auch während dessen Anzeige funktioniert }Na was sagst Du jetzt?

-
Gebe mich geschlagen...

-
Es war mir eine Ehre!

Danke Dir, hab wieder viel gelernt.
-
Hat vieleicht noch jemand eine Idee wie man die Mehrfachvererbung:
template<class T> class CCtrl : public T, public CStaticToolTipauflösen kann?