FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, 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
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 } |
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 ; |
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 !"); |
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); } |
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; |
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: }; |
Code c++ : | Sélectionner tout |
1 2 3 | typedef CTplToolTip<CEdit> CExEdit; typedef CTplToolTip<CStatic> CExStatic; |
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); |
il suffira d'intercepter le message reflected =BN_CLICKED pour un clic gauche ou le message WM_RBUTTONDOWN pour le clic droit .
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 çaLes 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 © 2024 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.