title: Using Control Vertical Scroller to Form a Marquee
body: <p>I'm using MSVB2005. I'd like to write a user-control which is an automatic text-scroller, scrolling <strong>fixed-text</strong> vertically, in a smooth manner, e.g. pixel by pixel (and <strong>not</strong> line-by-line). This is also known as <em>Marquee</em> (in HTML, for example).</p>
  
  <p>I've already implemented such a control using a timer, which upon each of its ticks, text is rendered onto control's surface 1 pixel up. It works very well, BUT consumes rather much CPU power, as graphical hardware acceleration is not used, and all rendering computations "fall" on the main CPU.</p>
  
  <p>I'd like to improve control's performance by using graphical mechanisms built into the OS (i.e. Windows), such as Form/Control vertical scroller. I'm pretty sure the OS uses hardware-acceleration underneath.</p>
  
  <p>I thought that my user-control could inherit from the <em>ScrollableControl</em> class, or from another class which inherits <em>ScrollableControl</em>, such as <em>Panel</em>.
  I did that, and upon each tick of the aforementioned timer - the following is performed: </p>
  
  <pre><code>Y += 1
  Me.AutoScrollPosition = New Point(0, Y)
  </code></pre>
  
  <p>where <code>Y</code> is a class-member, and hence increased by one upon each timer tick.
  This works well too, BUT:</p>
  
  <p><strong>1)</strong> only if text-rendering is performed upon each call to control's <code>OnPaint</code> event-handler. If So... What was gained by this form of solution? (text-rendering seems to be the part that consumes most of the CPU time)</p>
  
  <p>Is there a way to render the WHOLE text <em>only once</em> to control's surface, and have the OS fully manage the scrolling, i.e. let the OS automatically repaint the visible area of the control upon each move of the vertical scroller (without having to self-repaint the relevant part of the text on every call to <em>OnPaint</em>)?</p>
  
  <p><strong>2)</strong> The vertical scroll-bar is visible. I need it to be active but <em>not</em> visible.</p>
  
  <p>Your assistance would be much obliged.</p>
  
  <p><strong>P.S.</strong></p>
  
  <p>The control is intended for a Winforms application, so I cannot switch to WPF right now.
  I'm not familiar with DirectX and OpenGL, and wouldn't have the time to learn any of these technologies any time soon. so currently, a solution in any of these directions wouldn't be considered feasible. Thanks.</p>