[vtkusers] vtkWin32OpenGLRenderWindow GetEventPending Bug

Nicholas Schwarz schwarz at evl.uic.edu
Tue Aug 19 23:12:46 EDT 2003


Hi,

I attempted to stop a long render when the user interacts with an object
by using a callback and the AbortCheckMethod of vtkRenderWindow. Below is
my C++ adaptation of the Tcl code on pages 257-258 of "The VTK User's
Guide" for VTK 4.2.

First, I made a callback class like this:

class InteractionCallBack : public vtkCommand {

public:

  static InteractionCallBack* New() {
    return new InteractionCallBack;
  }

  virtual void Execute(vtkObject* caller, unsigned long, void* data) {
    vtkRenderWindow* renWin = vtkRenderWindow::SafeDownCast(caller);
    if (renWin -> GetEventPending()) {
      renWin -> SetAbortRender(1);
    }
  }

};

Later on in my code I added an observer for AbortCheckEvent like this:

InteractionCallBack* icb = InteractionCallBack::New();
renWin -> AddObserver(vtkCommand::AbortCheckEvent, icb);

Of course, I included vtkRenderWindow.h, vtkCommand.h, and all the rest.

This does not work in Windows. (It does work in Linux.) The render is not
aborted when the user attempts to interact with the object. From testing I
determined that the GetEventPending() method in my instance of 
vtkRenderWindow never returns 1; it always returns 0.

I tested this code

int vtkWin32OpenGLRenderWindow::GetEventPending()
{
  MSG msg;

  if (PeekMessage(&msg,this->WindowId,WM_MOUSEFIRST,WM_MOUSELAST,PM_NOREMOVE))
    {
      if ((msg.message == WM_LBUTTONDOWN) ||
          (msg.message == WM_RBUTTONDOWN) ||
          (msg.message == WM_MBUTTONDOWN))
        {
          return 1;
        }
    }

  return 0;
}

from vtkWin32OpenGLRenderWindow (rev 1.115), and determined that the
outside if statement does evaluate to true on the following events:

WM_MOUSEFIRST, 
WM_MOUSEMOVE, 
WM_LBUTTONDOWN, 
WM_LBUTTONUP, 
WM_LBUTTONDBLCLK, 
WM_RBUTTONDOWN, 
WM_RBUTTONUP, 
WM_RBUTTONDBLCLK, 
WM_MBUTTONDOWN, 
WM_MBUTTONUP, 
WM_MBUTTONDBLCLK, 
WM_MOUSEWHEEL, and 
WM_MOUSELAST.

That is what it should do. But, the inner if statement does not evaluate
to true because 'msg.message' always evaluates to 0x0200, WM_MOUSEMOVE. It
never evaluates to a mouse button down event, so it never returns 1.

I noticed that the current GetEventPending() method was added in rev.
1.89, and replaces this (from rev. 1.88)

int vtkWin32OpenGLRenderWindow::GetEventPending()
{
  MSG msg;
  
  return PeekMessage(&msg,this->WindowId,WM_LBUTTONDOWN,WM_MBUTTONDOWN,PM_NOREMOVE);
}

which DOES work properly.

The way GetEventPending() is in rev. 1.115 should work, but it dosen't,
and I don't know why. The current GetEventPending() implementation should
also be better than 1.88's because it is only supposed to respond to
button down events, but again, it dosen't work.

Has anyone successfully gotten a revision newer than 1.88 to work
properly, or has experienced this same problem?

-------------------------------------------------------------------------
Nicholas Schwarz
Electronic Visualization Laboratory           E-Mail: schwarz at evl.uic.edu
Department of Computer Science                Telephone: 312-996-3002
University of Illinois at Chicago             Facsimile: 312-413-7585
-------------------------------------------------------------------------






More information about the vtkusers mailing list