FAQ VC++ et MFCConsultez toutes les FAQ

Nombre d'auteurs : 20, nombre de questions : 546, dernière mise à jour : 5 avril 2013  Ajouter une question

 

Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++

Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.

Sur ce, je vous souhaite une bonne lecture. Farscape


SommaireContrôlesCStatic (3)
précédent sommaire suivant
 

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

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  
// 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() 
};
Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  
// 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 
}

Mis à jour le 5 avril 2013 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

Code c++ : Sélectionner tout
1
2
  
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.

Code c++ : Sélectionner tout
1
2
3
  
 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.

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
  
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.

Code c++ : Sélectionner tout
1
2
3
  
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 !

Code c++ : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  
// 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:

Code c++ : Sélectionner tout
1
2
3
  
typedef CTplToolTip<CEdit> CExEdit; 
typedef CTplToolTip<CStatic> CExStatic;

Mis à jour le 20 janvier 2005 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:

Code c++ : Sélectionner tout
1
2
3
4
5
6
  
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 .

Mis à jour le 20 mai 2006 farscape

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

 
Contacter le responsable de la rubrique C++