裁剪(二)

mac2022-06-30  72

private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.FillRectangle(Brushes.White, this.ClientRectangle);//create essensial objects for painting text strings SizeF sizeF = g.MeasureString("Test", this.Font); StringFormat sf = new StringFormat(); sf.LineAlignment = StringAlignment.Center;//set properties of the grid int cellHeight = (int)sizeF.Height + 4;int cellWidth = 80;int nbrColumns = 50;int nbrRows = 50;//output general info to console Console.WriteLine("-------------------------"); Console.WriteLine("e.ClipRectangle = " + e.ClipRectangle); Console.WriteLine("The following cells need to be redrawn " + "(in whole or in part):");//draw the cells and the output to console for (int row = 0; row < nbrRows; ++row) {for (int col = 0; col < nbrColumns; ++col) { Point cellLocation = new Point(col * cellWidth, row * cellHeight); Rectangle cellRect = new Rectangle(cellLocation.X, cellLocation.Y, cellWidth, cellHeight);if (cellRect.IntersectsWith(e.ClipRectangle)) { Console.WriteLine("Row:{0} cel:{1}", row, col); g.FillRectangle(Brushes.LightBlue, cellRect); g.DrawRectangle(Pens.Black, cellRect);string s = String.Format("{0},{1}", col, row); g.DrawString(s, this.Font, Brushes.Black, cellRect, sf); }else { } }这段代码中的if语句指出,只有矩形与ClipRectangle的交集不为空,事件处理程序才将创建此矩形。 换句话说,如果操作系统不打算向绘图表面提交矩形的至少部分区域,它将不会创建矩形。 如果没有if。。else语句,事件处理程序将需要生成50行和50列,也就是2500个矩形, 但是if。。else语句将每一个矩形的预定位置与clipRectangle进行比较,所以代码生成的唯一矩形是实际绘制到可视的绘图表面的那些矩形。可以通过Graphics。IsVisibleClipEmpty测试代替Rectangle。IntersectsWith测试来实现一个类似的效果, 即将if语句改为if(!g.IsVisibleClipEmpty)区别是IntersectsWith把每一个矩形与裁剪矩形比较,IsVisibleClipEmpty把每一个矩形与客户矩形比较。

 

转载于:https://www.cnblogs.com/ttssrs/archive/2012/03/14/2396516.html

最新回复(0)