none
CMFCToolTipCtrl dans une CView RRS feed

  • 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(&params);
        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

    vendredi 21 décembre 2012 14:20

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
    vendredi 11 janvier 2013 10:15

Toutes les réponses