Meilleur auteur de réponses
CMFCToolTipCtrl dans une CView

Question
-
Bonjour,
Je me suis inspiré de cet exemple pour créé un CMFCToolTipCtrl dans ma CView.
http://www.codeproject.com/Articles/203722/How-to-Use-CMFCToolTipCtrl-Tooltips-in-a-View-for
J'ai donc ça:
ViewToolTip.h:
#pragma once #include "stdafx.h" #include <lib_utilities/piString.h> ///////////////////////////////////////////////////////////////////////////// // CViewToolTipCtrl window class CViewToolTip : public CMFCToolTipCtrl{ // Construction public: static CViewToolTip *instance; CViewToolTip(); virtual ~CViewToolTip(); int m_nCurrID; void setText(piString text); void resetText(); protected: CSize OnDrawLabel(CDC* pDC,CRect rect,BOOL bCalcOnly); piString text; };
ViewToolTip.cpp
#include "stdafx.h" #include "ViewToolTip.h" #include "../modelView/AcquiredImageView.h" ///////////////////////////////////////////////////////////////////////////// // CViewToolTip CViewToolTip *CViewToolTip::instance = NULL; //----------------------------------------- CViewToolTip::CViewToolTip(){ this->m_nCurrID = 0; this->resetText(); } //----------------------------------------- //----------------------------------------- void CViewToolTip::resetText(){ piString text = _T("Distance: 0\ndx: 0\ndy: 0"); } //----------------------------------------- //----------------------------------------- CViewToolTip::~CViewToolTip(){ } //----------------------------------------- //----------------------------------------- void CViewToolTip::setText(piString text){ this->text = text; } //----------------------------------------- ///////////////////////////////////////////////////////////////////////////// // CViewToolTip message handlers //----------------------------------------- CSize CViewToolTip::OnDrawLabel(CDC* pDC, CRect rect, BOOL bCalcOnly){ // TRACE("ENTER CViewToolTip::OnDrawLabel bCalcOnly=%d\n", bCalcOnly); ASSERT_VALID(pDC); // my special tooltip drawing system for context sensitive tooltips // in view (track) POINT cursor; GetCursorPos(&cursor); AcquiredImageView::getCurrentInstance()->ScreenToClient(&cursor); //GetActiveView()->ScreenToClient(&cursor); CString labelText = this->text.c_str(); //CString labelText = _T("haha\nhoho"); CString descriptionText = _T(""); CSize sizeText(0, 0); BOOL bDrawDescr = m_Params.m_bDrawDescription && !m_strDescription.IsEmpty(); CFont* pOldFont = (CFont*) pDC->SelectObject(m_Params.m_bBoldLabel && bDrawDescr ? &afxGlobalData.fontBold : &afxGlobalData.fontTooltip); if (labelText.Find(_T('\n')) >= 0){ // Multi-line text UINT nFormat = DT_NOPREFIX; if (bCalcOnly){ nFormat |= DT_CALCRECT; } if (m_pRibbonButton != NULL){ nFormat |= DT_NOPREFIX; } int nHeight = pDC->DrawText(labelText, rect, nFormat); sizeText = CSize(rect.Width(), nHeight); } else{ if (bCalcOnly){ sizeText = pDC->GetTextExtent(labelText); } else{ UINT nFormat = DT_LEFT | DT_NOCLIP | DT_SINGLELINE; if (!bDrawDescr){ nFormat |= DT_VCENTER; } if (m_pRibbonButton != NULL){ nFormat |= DT_NOPREFIX; } sizeText.cy = pDC->DrawText(labelText, rect, nFormat); sizeText.cx = rect.Width(); } } pDC->SelectObject(pOldFont); SetDescription (descriptionText); return sizeText; } //-----------------------------------------
Puis un dans class qui hérite d'une CView:
void AcquiredImageView::OnInitialUpdate(){ ... this->toolTip.CreateEx(this, TTS_NOPREFIX | TTS_NOANIMATE, WS_EX_TRANSPARENT); ... }
void AcquiredImageView::OnMouseMove(UINT nflags, CPoint pt){ ... CRect viewRect; this->GetWindowRect(&viewRect); int xToolTip = viewRect.left + pt.x; int yToolTip = viewRect.top + pt.y; CRect toolTipRect; toolTip.GetWindowRect(&toolTipRect); int widthToolTip = toolTipRect.Width(); int heightToolTip = toolTipRect.Height(); this->toolTip.MoveWindow(xToolTip, yToolTip, widthToolTip, heightToolTip); }
void AcquiredImageView::showToolTip(){ TRACE(_T("void AcquiredImageView::showToolTip called\n")); this->toolTip.Activate(TRUE); if(this->toolTip.GetToolCount() == 0){ CMFCToolTipInfo params; params.m_bVislManagerTheme = TRUE; this->toolTip.SetParams(¶ms); this->toolTip.SetDelayTime(0); this->toolTip.AddTool(this, _T("Measure line")); } TRACE(_T("void AcquiredImageView::showToolTip end\n")); } //----------------------------------------- void AcquiredImageView::hideToolTip(){ TRACE(_T("void AcquiredImageView::hideToolTip called\n")); this->toolTip.Activate(FALSE); this->toolTip.resetText(); TRACE(_T("void AcquiredImageView::hideToolTip end\n")); }
Mais j'ai deux problème:
1) au bout de 5 secondes, le tool tip disparait.
2) Si je clique sur la vue, le tool tip disparait.
Quelqu'un sait comment je pourrai contrôler correctement l'apparition et disparition du tool tip?
Merci d'avance
Réponses
-
Bonjour,
Merci pour votre réponse. Finalement après deux semaines je m'attendais plus à recevoir de réponse.J'ai donc repris la classe d'un collègue qui affiche simplement du texte sur une CImageView (classe interne qui hérite d'une CView). Là je suis en periode de fin de développement de mon logiciel et je ne pourrai pas passer plus de temps sur les CMFCToolTip.
Cordialement
Edit: sous google chrome je ne peux pas cliquer sur le bouton "Envoyer" pour répondre. Il y a quelques semaine ça marchait.- Modifié cedric_fr vendredi 11 janvier 2013 10:16
- Marqué comme réponse Aurel Bera vendredi 11 janvier 2013 10:28
Toutes les réponses
-
Bonjour
Ce que vous avez c’est le fonctionnement normal d’un ToolTip.
Il est affichée pour une période de temps et il cachée quand un évènement est élevée.
Pour contrôler le temps d’affichage vous avez plus de details ici :
http://msdn.microsoft.com/en-us/library/windows/desktop/bb760390(v=vs.85).aspx
Cordialement,
-
Bonjour,
Merci pour tenir la communauté informée sur la suite de vos démarches.
Cordialement,
-
Bonjour,
Merci pour votre réponse. Finalement après deux semaines je m'attendais plus à recevoir de réponse.J'ai donc repris la classe d'un collègue qui affiche simplement du texte sur une CImageView (classe interne qui hérite d'une CView). Là je suis en periode de fin de développement de mon logiciel et je ne pourrai pas passer plus de temps sur les CMFCToolTip.
Cordialement
Edit: sous google chrome je ne peux pas cliquer sur le bouton "Envoyer" pour répondre. Il y a quelques semaine ça marchait.- Modifié cedric_fr vendredi 11 janvier 2013 10:16
- Marqué comme réponse Aurel Bera vendredi 11 janvier 2013 10:28
-
J’ai marque votre réponse.
Ce message c’est envoyée avec Google Chrome.
Il y a un processus de mise à jour pour les forums, donc essayez lundi pour voir si le problème persiste.