[vtkusers] Re: Can't catch double clicks in vtkWin32RenderWindowInteractor
Goodwin Lawlor
goodwin.lawlor at ucd.ie
Wed Mar 21 11:49:45 EDT 2007
list at kobenetz.de wrote:
> VTK 5.0.2, WinXP SP2 on Mac(Intel) with Bootcamp, C++, Visual Studio 2005
>
> Hi,
>
> I'm having some trouble with the vtkWin32RenderWindowInteractor and the
> mouse:
>
> 1. I can't catch double-clicks
> 2. The mouse-picking as described in
> http://www.vtk.org/Wiki/VTK_Mouse_Picking does not work for me. See
> description below.
>
>
> 1. I've tried using vtkRenderWindowInteractor::GetRepeatCount() with the
> Default style and the TrackballCamera style. GetRepeatCount does never
> return 1.
>
> I've looked through the source and traced back the problem to the
> following file and inserted two 'printf's to see if the clicks are beeing
> caught:
>
> vtkWin32RenderWindowInteractor.cxx:
> ---- Line 640
>
> case WM_LBUTTONDBLCLK:
> me->OnLButtonDown(hWnd,wParam,MAKEPOINTS(lParam).x,MAKEPOINTS(lParam).y,
> 1);
> printf ("\n\nDouble-click!\n\n");
> break;
>
> case WM_LBUTTONDOWN:
> me->OnLButtonDown(hWnd,wParam,MAKEPOINTS(lParam).x,MAKEPOINTS(lParam).y,
> 0);
> printf ("\n\nSingle-click!\n\n");
> break;
>
> ----
>
> When I double-click the mouse in the RenderWindow I get the "Single-click"
> message twice, not the "Double-click" one. Where's the problem?
>
>
> 2. When trying to use the mouse picking as described, "press"-"don't
> move"-"release" it always appears that the mouse has been moved in
> between:
>
>
> ----
> void cb_leftButtonDown( vtkObject *caller, unsigned long eid, void
> *clientdata, void *calldata )
> {
> MouseMotion = 0;
> cout << "cb_leftButtonDown\n";
>
> if( iren->GetRepeatCount() == 1 )
> {
> // This never happens anyway ...
> cout << "Double-click!\n";
> }
>
> style->OnLeftButtonDown();
> }
>
> void cb_leftButtonUp( vtkObject *caller, unsigned long eid, void
> *clientdata, void *calldata )
> {
>
> cout << "cb_leftButtonUp\n";
>
> if( MouseMotion == 0 )
> {
> picker->Pick( iren->GetEventPosition()[0], iren->GetEventPosition()[1],
> 0.0, ren1);
> showPick( 0,0,0,0 ); // Draw some info about picking location ...
> }
>
> style->OnLeftButtonUp();
> }
>
> void cb_mouseMove( vtkObject *caller, unsigned long eid, void *clientdata,
> void *calldata )
> {
> if( MouseMotion == 0 )
> {
> cout << "Mouse has been moved!";
> }
> MouseMotion = 1;
>
> style->OnMouseMove();
> }
> ----
>
> What happens is the following: I click and hold the mouse button without
> moving the mouse (Optical mouse up in the air). Instantly I get the
> Message "cb_leftButtonDown" and a few MILLISECONS later "Mouse has been
> moved!". If I click-release fast enough I can manage to get a pick, but
> why do I get this unexpected behaviour?
>
> Thanks,
>
> Christoph
Hi Christoph,
The RepeatCount will only be set when you've released the button, so
should be accessed in your cb_leftButtonUp method...
if( MouseMotion == 0 && iren->GetRepeatCount() == 1)
{
...
}
Have you cut out where you declare the "iren" and "style" pointers in
your callback?
You'll have to cast "caller" as a pointer to vtkInteractorStyle and call:
vtkInteractorStyle *style = vtkInteractorStyle::SafeDownCast(caller);
vtkRenderWindowInteractor *iren = style->GetInteractor();
I've only tried this code with Tcl scripts (and the modified C++
classes)... there could be a bug with the win32 events.
hth
Goodwin
More information about the vtkusers
mailing list