IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Contrôles > CStatic
        Comment compléter le dessin d'un CStatic ?
        Comment gérer un Tooltip (bulle) sur un contrôle CStatic ou un CEdit ?
        Comment intercepter un clic souris sur un contrôle CStatic ?



Comment compléter le dessin d'un CStatic ?
auteur : Farscape
La technique: On rajoute le style Notify dans la fonction PreSubclassWindow.
Sur le paint du static on laisse faire la classe de base mais on envoie un message privé pour terminer le dessin...

// header
class CMyStatic : public CStatic
{
// Construction
public:
CMyStatic();
// Attributes
public:
// Operations
public:
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyStatic)
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
// Implementation
public:
virtual ~CMyStatic();
// Generated message map functions
protected:
//{{AFX_MSG(CMyStatic)
afx_msg void OnPaint();
//}}AFX_MSG
LRESULT AddPaint(UINT wParam,LONG lParam);
DECLARE_MESSAGE_MAP()
};

// source
#define WM_ADDPAINT WM_USER+100

/////////////////////////////////////////////////////////////////////////////
// CMyStatic

CMyStatic::CMyStatic(){}

CMyStatic::~CMyStatic(){}

BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
//{{AFX_MSG_MAP(CMyStatic)
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ADDPAINT,AddPaint)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyStatic message handlers
void CMyStatic::PreSubclassWindow() 
{
// TODO: Add your specialized code here and/or call the base class
      CStatic::PreSubclassWindow();
      ModifyStyle(0, SS_NOTIFY);
}

LRESULT CMyStatic::AddPaint(UINT wParam, LONG lParam)
{
    CDC *pTempDC=GetWindowDC();
    CRect rect;

    GetWindowRect(&rect);

    CPen Pen;
    Pen.CreatePen(PS_SOLID, 2, RGB(255,0,0));
    CPen* OldPen = pTempDC->SelectObject(&Pen);

    pTempDC->MoveTo(0,rect.Height()/2);
    pTempDC->LineTo(rect.Width(),rect.Height()/2);

    pTempDC->SelectObject(OldPen);
    Pen.DeleteObject(); 
    ReleaseDC(pTempDC);
return 0;
}

void CMyStatic::OnPaint() 
{
    CStatic::OnPaint();
    PostMessage(WM_ADDPAINT,0,0);
   //CPaintDC dc(this); // device context for painting
   // TODO: Add your message handler code here
   // Do not call CStatic::OnPaint() for painting messages
}

Comment gérer un Tooltip (bulle) sur un contrôle CStatic ou un CEdit ?
Mise à jour le 20/01/2005[haut]
auteur : Farscape
Deux méthodes, une on va dire bas de gamme qui consiste à déclarer dans la classe fenêtre dialog ou formview ou dialogbar etc?,une donnée membre de la classe CToolTipCtrl

CToolTipCtrl  m_tooltip ;
dans la fonction OnInitialUpdate ou OnInitDialog on initialise le tooltip avec le contrôle où la bulle doit appraître avec la fonction AddTool qui permet de préciser le texte.

 m_tooltip.Create(this); // la view ou la dialog   
 m_tooltip.AddTool(GetDlgItem(IDC_STATIC1), "bulle d'infos !");  
Dernier point: faire en sorte que les messages soit bien relayés pour le tooltip quand la souris passe sur le contrôle.
Le traitement se fait sur la fenêtre parent.

BOOL CMyFormView::PreTranslateMessage(MSG* pMsg) 
{ 
   // TODO: Add your specialized code here and/or call the base class 
   if (m_tooltip.m_hWnd != NULL)  m_tooltip.RelayEvent(pMsg); 
   return CFormView::PreTranslateMessage(pMsg); 
}
Dernière chose avant de passer à la solution plus évoluée il faut impérativement dans le cas d'un static cocher dans la ressource notify pour que ça fonctionne.

La solution plus évoluée consiste en une classe template qui contient le mécanisme du tooltip et qui permet l'association directe avec un contrôle existant au niveau de la déclaration, le contrôle final disposant de son Tooltip intégré et gérant lui-même l'affichage de la bulle.

CTplToolTip<CEdit> m_Edit;
CTplToolTip<CStatic> m_Static; 
Utilisation :il ne restera plus qu'à appeler la fonction AddTool(" avec le texte")
J'ai juste fait le départ ; je n'ai pas relayé les autres fonctions du CTooltipCtrl dans la classe template ,de même que je n'ai pas géré la destruction .
A vous de faire le reste !

// CTplToolTip window
// Modification 12/01/2005 : Rajoute Traitement sur prise de focus du controle.
// prise en charge du mutliligne avec SetMaxTipWidth.

template <class GENERIC_TOOLTIP>
class CTplToolTip : public GENERIC_TOOLTIP
{
    // Construction
public:
    CTplToolTip(){}    
    // Attributes    
public:    
    CToolTipCtrl m_tooltip;
    CString      m_strText;
    UINT         m_nIDTool; 
    // Operations
public:
    
    BOOL AddTool(LPCTSTR lpszText=LPSTR_TEXTCALLBACK,
                LPCRECT lpRectTool=NULL,UINT nIDTool=0)
    {
        m_strText=lpszText;
        m_nIDTool=nIDTool;       
        return m_tooltip.AddTool(this,lpszText,lpRectTool ,nIDTool );
    } 
    // Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CTplToolTip)
public:
    virtual LRESULT DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
    {
        if(nMsg==WM_MOUSEACTIVATE && m_tooltip.m_hWnd != NULL)
        {
            m_tooltip.DelTool(this,m_nIDTool);
            m_tooltip.AddTool(this,m_strText,NULL,m_nIDTool);
           
        }
        return GENERIC_TOOLTIP::DefWindowProc( nMsg, wParam,lParam);
    } 
    virtual BOOL PreTranslateMessage(MSG* pMsg)
    {
        if (m_tooltip.m_hWnd != NULL)
        {
            // translate the message based on TTM_WINDOWFROMPOINT
            MSG msg = *pMsg;
            msg.hwnd = (HWND)m_tooltip.SendMessage(TTM_WINDOWFROMPOINT,
                0, (LPARAM)&msg.pt);
            CPoint pt = pMsg->pt;
            if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
                ::ScreenToClient(msg.hwnd, &pt);
            
            msg.lParam = MAKELONG(pt.x, pt.y);
            // Let the ToolTip process this message.
            m_tooltip.RelayEvent(&msg);
        }
        return GENERIC_TOOLTIP::PreTranslateMessage(pMsg);
    }
    
protected:
    virtual void PreSubclassWindow()
    {
        GENERIC_TOOLTIP::PreSubclassWindow();
        
        m_tooltip.Create(this); // la view ou la dialog   
        m_tooltip.SetDelayTime(1000); // le delay
        m_tooltip.Activate(TRUE); 
       m_tooltip.SetMaxTipWidth(500); // pour le multiligne. 
    }
    
    //}}AFX_VIRTUAL    
    // Implementation
public:    
    virtual ~CTplToolTip(){}    
    // Generated message map functions
protected:
};
pour finir rien n'empêche de faire un typdef pour éviter la déclaration à la volée:

typedef CTplToolTip<CEdit> CExEdit;
typedef CTplToolTip<CStatic> CExStatic;

Comment intercepter un clic souris sur un contrôle CStatic ?
Créé le 20/05/2006[haut]
auteur : Farscape
Pour recevoir les notifications souris il faudra commencer par cocher l'option notify dans les ressources du static.
Dans le cas d'un static dynamique on rajoutera le style SS_NOTIFY dans le Create:

CStatic myStatic;

// Create a child static control that centers its text horizontally.
myStatic.Create(_T("my static"), WS_CHILD|WS_VISIBLE|SS_CENTER|SS_NOTIFY, 
   CRect(10,10,150,50), pParentWnd);
Après génération avec l'aide de classwizard d'une classe dérivée de CStatic,
il suffira d'intercepter le message reflected =BN_CLICKED pour un clic gauche ou le message WM_RBUTTONDOWN pour le clic droit .



Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.