// /// Called by Paint to repaint all of the gadgets, PaintGadgets iterates through the /// list of gadgets, determines the gadget's area, and repaints each gadget. /// /// You can override this function to implement a specific look (for example, /// separator line, raised, and so on). // void TGadgetWindow::PaintGadgets(TDC& dc, bool, TRect& rect) { TPoint viewport = dc.GetViewportOrg(); for (TGadget* gadget = Gadgets; gadget; gadget = gadget->Next) { if (gadget->GetBounds().Touches(rect)) { dc.SetViewportOrg((TPoint&)gadget->GetBounds()); // If the gadget is a sloppy painter & needs clipping support, set the // clip rect before painting, otherwise just paint. Most gadgets don't // need this help // if (gadget->Clip) { TRegion savedClipRgn; dc.GetClipRgn(savedClipRgn); dc.IntersectClipRect(gadget->GetBounds()); gadget->Paint(dc); dc.SelectClipRgn(savedClipRgn); } else gadget->Paint(dc); } } dc.SetViewportOrg(viewport); }
// /// If TScroller_AutoOrg is true (default condition), BeginView automatically /// offsets the origin of the logical coordinates of the client area by XPos, YPos /// during a paint operation. If AutoOrg is false (for example, when the scroller is /// larger than 32,767 units), you must set the offset manually. // void TScroller::BeginView(TDC& dc, TRect& rect) { long xOrg = XPos * XUnit; long yOrg = YPos * YUnit; if (AutoOrg && xOrg <= INT_MAX && yOrg <= INT_MAX) { TPoint offset(int(-xOrg), int(-yOrg)); dc.SetViewportOrg(offset); rect -= offset; } }