Basisklasse für Controls


  • Mod

    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?


  • Mod

    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.)


  • Mod

    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? 😉


  • Mod

    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 CStaticToolTip
    

    auflösen kann?


Anmelden zum Antworten