# Question about the event mouse-hover in MFC project

**URL:** https://discourse.vtk.org/t/question-about-the-event-mouse-hover-in-mfc-project/11412
**Category:** Support
**Created:** [May 9, 2023, 10:51am UTC](https://discourse.vtk.org/t/question-about-the-event-mouse-hover-in-mfc-project/11412 "2023-05-09T10:51:30Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![ljx006barbatos](https://discourse.vtk.org/user_avatar/discourse.vtk.org/ljx006barbatos/32/7015_2.png) [@ljx006barbatos](https://discourse.vtk.org/u/ljx006barbatos)
#### Post date: [May 9, 2023, 10:51am UTC](https://discourse.vtk.org/t/question-about-the-event-mouse-hover-in-mfc-project/11412/1 "2023-05-09T10:51:30Z")

</div>

Context: I have built a scene with several actors to present two rooms and the components in MFC program, and I want to implement a function: I can print some message to identify components when I put my cursor in the item for a while. I tried to use vtkballoonwidget to do it, and it works but whenever I resize the current window the event WM\_MOUSEHOVER would never be detected anymore.

Here some codes related:  
CMFCApplicationVtkView.h:  
class CMFCApplicationVtkView : public CView  
{

public:  
vtkSmartPointer renderer ;  
//vtkMFCrenderwindow  
vtkSmartPointer renWin ;  
vtkSmartPointer iren;

```
vtkSmartPointer<PickCallback> pickCallback;
vtkSmartPointer<vtkPropPicker> picker;

vtkSmartPointer<customIteractorStyle> style;

vtkSmartPointer<vtkBalloonWidget> balloonWidget;
bool m_bMouseTracking;

```

///

#  
/// ///////////////////  
/// 

protected: // création à partir de la sérialisation uniquement  
CMFCApplicationVtkView() noexcept;  
DECLARE\_DYNCREATE(CMFCApplicationVtkView)

// Attributs  
public:  
CMFCApplicationVtkDoc\* GetDocument() const;

// Opérations  
public:

// Substitutions  
public:  
virtual void OnDraw(CDC\* pDC); // substitué pour dessiner cette vue  
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);  
protected:  
virtual BOOL OnPreparePrinting(CPrintInfo\* pInfo);  
virtual void OnBeginPrinting(CDC\* pDC, CPrintInfo\* pInfo);  
virtual void OnEndPrinting(CDC\* pDC, CPrintInfo\* pInfo);

// Implémentation  
public:  
virtual ~CMFCApplicationVtkView();  
#ifdef \_DEBUG  
virtual void AssertValid() const;  
virtual void Dump(CDumpContext& dc) const;  
#endif

protected:

// Fonctions générées de la table des messages  
protected:  
DECLARE\_MESSAGE\_MAP()  
public:  
afx\_msg void OnLButtonDblClk(UINT nFlags, CPoint point);  
virtual void OnInitialUpdate();  
afx\_msg void OnNewmenuTest1();  
afx\_msg void OnUpdateNewmenuTest1(CCmdUI\* pCmdUI);  
afx\_msg void OnAffichageTest2();  
afx\_msg void OnSize(UINT nType, int cx, int cy);  
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);  
afx\_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
// afx\_msg void OnClose();  
afx\_msg void OnMouseHover(UINT nFlags, CPoint point);  
afx\_msg void OnMouseLeave();  
afx\_msg void OnMouseMove(UINT nFlags, CPoint point);  
};  
CMFCApplicationVtkView.cpp  
LRESULT CMFCApplicationVtkView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)  
{  
// TODO: ajoutez ici votre code spécialisé et/ou l’appel de la classe de base  
switch (message)  
{  
case WM\_MOUSEMOVE:  
if (!m\_bMouseTracking)  
{  
TRACKMOUSEEVENT tme;  
tme.cbSize = sizeof(TRACKMOUSEEVENT);  
tme.dwFlags = TME\_HOVER | TME\_LEAVE;  
tme.hwndTrack = m\_hWnd;  
tme.dwHoverTime = HOVER\_DEFAULT;  
m\_bMouseTracking = TrackMouseEvent(&tme);

```
	}
	if (this->iren->GetInitialized())
	{
		return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam, this->iren);
	}
	break;
case WM_MOUSEHOVER:
	if (this->iren->GetInitialized())
	{
		m_bMouseTracking = false;
		return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam, this->iren);
	}
	break;
case WM_MOUSELEAVE:
	if (this->iren->GetInitialized())
	{
		m_bMouseTracking = false;
		return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam, this->iren);
	}
	break;
case WM_SIZE:
	if (!m_bMouseTracking)
	{
		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(TRACKMOUSEEVENT);
		tme.dwFlags = TME_HOVER | TME_LEAVE;
		tme.hwndTrack = m_hWnd;
		tme.dwHoverTime = HOVER_DEFAULT;
		m_bMouseTracking = TrackMouseEvent(&tme);

	}
	if (this->iren->GetInitialized())
	{
		return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam, this->iren);
	}
	break;
case WM_PAINT:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_CHAR:
case WM_TIMER:
case WM_MOUSEWHEEL:
	if (this->iren->GetInitialized())
	{
		return vtkHandleMessage2(this->m_hWnd, message, wParam, lParam, this->iren);
	}
	break;
}

return CView::WindowProc(message, wParam, lParam);

```

}  
void CMFCApplicationVtkView::OnSize(UINT nType, int cx, int cy)  
{  
CView::OnSize(nType, cx, cy);

```
// TODO: ajoutez ici le code de votre gestionnaire de messages

CRect rect;
this->GetClientRect(&rect);
this->renWin->SetSize(rect.Width(), rect.Height()); // dimi4

if (this->iren->GetInitialized())// dimi4
{
	this->iren->SetSize(rect.right - rect.left, rect.bottom - rect.top);//(cx,cy);
	this->iren->UpdateSize(rect.right - rect.left, rect.bottom - rect.top);
}

//// Reset mouse tracking after resizing
//if (!m_bMouseTracking)
//{
//	TRACKMOUSEEVENT tme;
//	tme.cbSize = sizeof(TRACKMOUSEEVENT);
//	tme.dwFlags = TME_HOVER | TME_LEAVE;
//	tme.hwndTrack = m_hWnd;
//	tme.dwHoverTime = HOVER_DEFAULT;
//	m_bMouseTracking = TrackMouseEvent(&tme);

//}

```

}  
void CMFCApplicationVtkView::OnInitialUpdate()  
{  
CView::OnInitialUpdate();

```
// TODO: ajoutez ici votre code spécialisé et/ou l'appel de la classe de base

this->renWin->WindowInitialize();

CInformationLocal* pInfoLocal = new CInformationLocal((CMFCApplicationVtkView*)this);
/*pInfoLocal->CreateLocal(ID_SOL);
pInfoLocal->CreateLocal(ID_PLAFOND);
pInfoLocal->CreateLocal(ID_MF);
pInfoLocal->CreateLocal(ID_MO);*/

//pInfoLocal->CreateLocal(ID_SOLA);
//
//pInfoLocal->CreateLocal(ID_SEPARATIF);

for (int i = ID_SOLA; i < ID_COUNT; i++) {
	pInfoLocal->CreateLocal((TYPE_OBJET_LOCAL)i);
}

	/// <summary>
	/// ////////////////////////////////////
	/// </summary>

	////style->SetFixedAxesActor(axes);
	//iren->SetInteractorStyle(style); //24/04/2023

// Create the widget.
auto balloonRep = vtkSmartPointer<vtkBalloonRepresentation>::New();
balloonRep->SetBalloonLayoutToImageRight();

balloonWidget = vtkSmartPointer<vtkBalloonWidget>::New();
balloonWidget->SetInteractor(this->iren);
balloonWidget->SetRepresentation(balloonRep);
//balloonWidget->AddBalloon(sphereActor.GetPointer(), "This is a sphere", nullptr);
vtkSmartPointer<vtkActorCollection> actors = renderer->GetActors();
vtkActor* current_actor;
actors->InitTraversal();
while (current_actor = actors->GetNextActor()) {
	std::string strIntitule = (static_cast<MyActor*>(current_actor))->GetActorName();
	balloonWidget->AddBalloon(current_actor, strIntitule.c_str(), nullptr);
}
balloonWidget->EnabledOn();

/*vtkSmartPointer<vtkActorCollection> actors = renderer->GetActors();
vtkSmartPointer<vtkActor> current_actor;
actors->InitTraversal();
while (current_actor = actors->GetNextActor()) {
	auto edges = vtkSmartPointer<vtkExtractEdges>::New();
	edges->SetInputData(current_actor->GetMapper()->GetInput());
	edges->Update();
	auto edges_mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	edges_mapper->SetInputData(edges->GetOutput());
	auto edges_actor = vtkSmartPointer<vtkActor>::New();
	edges_actor->SetMapper(edges_mapper);
	edges_actor->GetProperty()->SetColor(0.75, 0.75, 0.75);
	edges_actor->GetProperty()->SetOpacity(1.0);
	renderer->AddActor(edges_actor);
}*/
pInfoLocal->HighLightEdge();

vtkSmartPointer<vtkNamedColors> colors = vtkSmartPointer<vtkNamedColors>::New();
renderer->SetBackground(colors->GetColor3d("Cornsilk").GetData());

```

}  
If u want more information let me know, thanks for your help.
