[vtk-developers] Re: GUISupport directory ?

Andrew Maclean a.maclean at cas.edu.au
Tue Feb 15 05:55:18 EST 2005


I hope this helps ....

For a dialog it is mot much different from the MDI and SDI examples, except
you have to use the PreTranslateMessage if you want keyboard interaction. I
normally do something like this (this is based on the old MIDI/SDI samples
in the GUI directory) (they also had printing set up too):

//--------------------------------------------------------------------------
-
//We need to allow the interactor to process commands from the keyboard so
we add the PreTranslateMessage override and modify the code as follows:

//! Will allow passing of keystrokes to VTK.
BOOL CDLGDlg::PreTranslateMessage(MSG* pMsg)
{
    // Only process keystrokes that emanate from the render window.

    CRect rect;
    this->m_RenderWindow.GetWindowRect(&rect);

    bool inWindow = (pMsg->pt.x >= rect.left && pMsg->pt.x <= rect.right &&
                                    pMsg->pt.y >= rect.top && pMsg->pt.y <=
rect.bottom);

    if (inWindow)
    {
        switch (pMsg->message)
        {
        //case WM_PAINT:
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_MBUTTONDOWN:
        case WM_MBUTTONUP:
        case WM_RBUTTONDOWN:
        case WM_RBUTTONUP:
        case WM_MOUSEMOVE:
        case WM_CHAR:
        case WM_TIMER:

        // Don't process the vtk quit keyboard command.

        if ( pMsg->message == WM_CHAR &&
            ( ( pMsg->wParam == 'Q' || pMsg->wParam == 'q' ) ||
            ( pMsg->wParam == 'E' || pMsg->wParam == 'e' ) ) )
            break;

        if ( VTKApp->IRen()->GetInitialized() )
            return vtkHandleMessage2(this->m_hWnd, pMsg->message,
pMsg->wParam, pMsg->lParam,
vtkWin32RenderWindowInteractor::SafeDownCast(VTKApp->IRen()));

        break;

        }
    }

return CDialog::PreTranslateMessage(pMsg);

}
//--------------------------------------------------------------------------
-
Regards
   Andrew

-----Original Message-----
From: vtk-developers-bounces at vtk.org [mailto:vtk-developers-bounces at vtk.org]
On Behalf Of Clinton Stimpson
Sent: Tuesday, 15 February 2005 03:53
To: de Boer Ingo
Cc: vtk-developers at vtk.org
Subject: RE: [vtk-developers] Re: GUISupport directory ?

Quoting de Boer Ingo <I.deBoer at polytec.de>:

> > The source is in the current CVS (VTK/GUISupport/MFC).
> Thanks... I just took a look at it...
>
> I have a question. You wrote this:
>
>   // setup the parent window
>   this->renWin->SetWindowId(this->GetSafeHwnd());
>   this->iren->SetRenderWindow(this->renWin);
>   this->iren->Initialize();
>
> I did in my samples something like:
>
>   // setup the parent window
>   this->renWin->SetWindowId(this->GetSafeHwnd());
>   this->renWin->SetParentId(this->GetParent()->GetSafeHwnd());
>   this->iren->SetRenderWindow(this->renWin);
>   this->iren->Initialize();
>
> and set the parent ID. Isn't it necessary to set the parent ID ?

I don't think it is necessary.  The only place in the VTK code it makes a
difference is in the resizing window code, which is redundent, because MFC
is already doing that.

>
> Did you try my samples ?

I didn't.  I realize they were there in the bug tracker when I took this
code from the already existing examples and modified it.

> In my opinion, three samples would be needed, MDI,SDI and
> dialog-based. This is what people do. The only trouble
> with the dialog-based application I had, was, that I
> could not do a double click. For the MDI and SDI it worked
> fine.

We have an MDI and SDI sample already that uses this new class.  Do you want
to try it in a dialog?

>
> In WindowProc you set the focus for the button down.
> Is this necessary ? If yes, shouldn't you set the focus
> also for WM_MOUSEWHEEL and WM_KEYDOWN ?

Doing it on wheel mouse is preference, and I think most people want that.  A
window has to have input focus before it can get a key event.  So it is
redundent to set focus on key down because it already has focus.

>
> In the OnSize function, wouldn't a call like
> this->iren->UpdateSize(cx, cy);
> be enough ?

Yeah, it is.
I think it is weird that a window has already been sized and it is told to
be sized again recursively in VTK.  That is what iren->UpdateSize does.  My
code I had there prevents the recursion from happening and gets the same
work done.


The OnPaint function doesn't pass in a CDC to do printing like that.  It is
the OnDraw functions from CView that has that.  I don't think CWnd has an
OnDraw function.
Perhaps we have 4 widget classes in there, then some of them can support
printing like that.

Clint

>
> How about extending the OnPaint with printing ?
> Like this (pseudo, taken from my code)
> if ( pDC->IsPrinting() )
> {
> 	// Obtain the size of the printer page in pixels.
> 	int cxPage = pDC->GetDeviceCaps(HORZRES);
> 	int cyPage = pDC->GetDeviceCaps(VERTRES);
>
> 	// Get the size of the window in pixels.
> 	int *size = this->pvtkWin32OpenGLRW->GetSize();
> 	int cxWindow = size[0];
> 	int cyWindow = size[1];
> 	float fx = float(cxPage) / float(cxWindow);
> 	float fy = float(cyPage) / float(cyWindow);
> 	float scale = min(fx,fy);
> 	int x = int(scale * float(cxWindow));
> 	int y = int(scale * float(cyWindow));
> 	this->pvtkWin32OpenGLRW->SetupMemoryRendering(cxWindow, cyWindow,
> pDC->GetSafeHdc());
> 	this->pvtkWin32OpenGLRW->Render();
> 	HDC memDC = this->pvtkWin32OpenGLRW->GetMemoryDC();
>
	
StretchBlt(pDC->GetSafeHdc(),0,0,x,y,memDC,0,0,cxWindow,cyWindow,SRCCOPY);
> 	this->pvtkWin32OpenGLRW->ResumeScreenRendering();
> }
> else
> {
> 	// TODO: add draw code for native data here
> 	if (this->pvtkWin32RenderWI->GetInitialized())
> 	{
> 		this->pvtkWin32OpenGLRW->Render();
> 	}
> }
>
> greets
>   Ingo
>


_______________________________________________
vtk-developers mailing list
vtk-developers at vtk.org
http://www.vtk.org/mailman/listinfo/vtk-developers





More information about the vtk-developers mailing list