For drawing lines, shapes, fills, on Linux I'd recommend using cairo. On Windows I'd say you should use GDI or GDI+. You can find pascal files importing the functions for those libraries using google. Some of them may come with FPC.<br>
<br>For widgets, if you are using Lazarus, it comes with a widget toolkit. Then there is also the free pascal gui tookit located here: <a href="http://fpgui.sourceforge.net/">http://fpgui.sourceforge.net/</a><br><br>Finally, for handling scrolling, what you need to do is determine the max bounds of your area, compare that to screen area and your drawing scale (your zoom factor). Use that to recalculate both the horizontal  and vertical scroll bar information (page size, scroll size) when the draw area is resized and update the scroll bars accordingly.<br>
<br>When you receive a scroll position change notification (the user drags the scroll bar) you call some api to scroll the drawing (such as ScrollWindowEx), which will invalidate a dirty rectangle in your window.<br><br>When you receive a paint notification (either when the user scrolls or a window is dragged over your window), you should also retrieve the dirty rectangle. Then you need to find the rectangles of your drawn objects that intersect the dirty rectangle. Redraw objects that intersect the dirty rectangle.<br>
<br>If the user zooms in or out, invalidate the entire area.<br><br>It's all pretty standard stuff ... <a href="http://imagebot.org/snapshops/phun-gears-builder.jpg">http://imagebot.org/snapshops/phun-gears-builder.jpg</a><br>