Question and Answer Database FAQ4286C.txt :Resizing a Canvas Object's cliprect Category :VCL Platform :All Windows Product :C++Builder1.0, C++Builder3.x, C++Builder4.x, Question: How do I resize a Canvas Object's cliprect? Answer: To do we need to combine Win32 API calls with VCL code. The example below uses an Image component and a Button. Place the code in the OnClick event handler of the button. void __fastcall TForm1::Button3Click(TObject *Sender) { HRGN MyRgn; MyRgn = ::CreateRectRgn(100,100,200,200); ::SelectClipRgn(Image1->Canvas->Handle,MyRgn); Ellipse(Image1->Canvas->Handle,90,90,210,210); Image1->Invalidate(); ::SelectClipRgn(Image1->Canvas->Handle,NULL); ::DeleteObject(MyRgn); MyRgn = CreateRectRgn(200,200,300,300); ::SelectClipRgn(Image1->Canvas->Handle,MyRgn); ::Ellipse(Image1->Canvas->Handle,190,190,310,310); Image1->Invalidate(); ::SelectClipRgn(Image1->Canvas->Handle,NULL); ::DeleteObject(MyRgn); MyRgn = ::CreateRectRgn(300,300,400,400); ::SelectClipRgn(Image1->Canvas->Handle,MyRgn); ::Ellipse(Image1->Canvas->Handle,290,290,410,410); Image8->Invalidate(); ::SelectClipRgn(Image1->Canvas->Handle,NULL);// reset to default state ::DeleteObject(MyRgn); } In this function we are changing the Clipping region from the VCL default rect that is the whole canvas to one of our own definition. Because the ClipRect property is read only, we can?t set it directly. We must do some behind the scenes work and then let the VCL do its work. First, what we need to do is define a region and we do this with the API call CreateRectRgn and pass it the region we wish to create. In the fist case we are creating a 100 x 100 pixel square region anchored at 100,100 on the canvas. Next we need to select this region as the clipping Rect and we do this with SelectClipRgn. This function takes two parameters, a DC which we use Image8->Canvas->Handle and the region we wish to select. Next we draw our ellipse and immediately follow itfollowed by a call to the Invalidate method. This issues a WM_PAINT message and the VCL reads the ClipRect, which is now the region that we defined and does the drawing accordingly. A second call to SelectClipRgn passing NULL as the second parameter reselects the original clipping region we had prior to us redefining it and lastly we need to do our own cleanup, so we have to make the call to DeleteObject to release the region. So there you have a good example of how to mix VCL code with straight API Windows code. Lastly we can see that the ClipRect has indeed been reset to the default value. void __fastcall TForm1::Button4Click(TObject *Sender) { Image8->Canvas->FillRect(Image8->Canvas->ClipRect); } This function call repaints the whole canvas, so our ClipRect is back to normal. 1/21/1999 2:53:32 PM
Last Modified: 01-SEP-99