Re: Getting view in the document class
Eric Lilja wrote:
Well, the document holds a matrix of tiles that make up the game board.
Each tile knows where it's located (it has a CRect that describes its
position on the view's client area, it also knows its position in the
matrix). When a tile changes state (a cell dies or comes alive), it
invalidates itself. This is when I need a pointer to the view to call
InvalidateRect(). Since UpdateAllViews() was suggested in this thread,
I'm now thinking about calling that instead of the invalidate function
of the tile, and using the parameters to tell the view that a tile was
invalidated and supply its rect. Then a tile won't have to know about
the view and the document doesn't have to get a pointer to the view in
OnNewDocument(). How does that sound? If I go down this road, I will be
calling UpdateAllViews() alot when the simulation is running..
That's a good approach, and a good illustration of what UpdateAllViews
is all about. I think you will find that UpdateAllViews won't slow
things down. All it does is call the view's OnUpdate for you, and in
OnUpdate you decide what to do.
By default OnUpdate will invalidate the entire view. If you want to get
the extra efficiency of repainting only what has changed then your
OnUpdate would call InvalidateRect with the passed rect, and OnDraw
would call GetClipBox to get the overall required repainting rect.
A minor refinement you might consider: You implied that each cell knows
its rect in the matrix. Things like scroll and zoom become much more
practical if each cell knows only its "logical position" in the matrix,
such as indexes. Only the view should translate logical coordinates
into pixel coordinates, since the transform is likely to change if the
view is resized or scrolled.
--
Scott McPhillips [MVP VC++]