23 Ağustos 2017 Çarşamba

Graphics Sınıfı

Graphics sınıfı
Çizimler Graphics sınıfı ile yapılıyor. Temel şekilleri çizmek için DrawLine, DrawEllipse,  DrawRectangle, DrawArc, DrawPie, DrawPolygon, DrawBezier gibi metodlar var. Bu şekilleri içi doldurulmuş şekilde çizmek için Fill..() metodları var.

Sınıf Ne Zaman Tetiklenir
Bazı Windows API'lerini anlamak gerekir.
InvalidateRect
Hemen çizimi başlatmaz. Çizim isteğini kuyruğa ekler. Şöyle kullanırız.
InvalidateRect(win, NULL, NULL);

UpdateWindow
Pencereyi hemen tekrar çizer.

RedrawWindow
InvalidateRect veya UpdateWindow gibi kullanılabilir. Verilen parametreye göre davranışı değişir.
Çizim işini kuyruğa eklemek için şöyle yaparız.
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE);

Eğer hemen çizmek istersek şöyle yaparız.
RedrawWindow(win, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW)

Control.Invalidate metodunun için şöyledir. true olarak çağrılırsa çizim işini kuyruğa ekler.
//Invalidates the control and causes a paint message to be sent to the control.
//This will not force a synchronous paint to occur, calling update after
//invalidate will force a synchronous paint.
public void Invalidate(bool invalidateChildren)
{
  if (IsHandleCreated)
  {
    if (invalidateChildren)
    {
      SafeNativeMethods.RedrawWindow(new HandleRef(window, Handle),
                                     null, NativeMethods.NullHandleRef,
                                     NativeMethods.RDW_INVALIDATE |
                                     NativeMethods.RDW_ERASE |
                                     NativeMethods.RDW_ALLCHILDREN);
    }
    else
    {
      // It's safe to invoke InvalidateRect from a separate thread.
      using (new MultithreadSafeCallScope())
      {
        SafeNativeMethods.InvalidateRect(new HandleRef(window, Handle),
                                         null,
                 (controlStyle & ControlStyles.Opaque) != ControlStyles.Opaque);
      }
    }

    NotifyInvalidate(this.ClientRectangle);
  }
}



Metodları
Constructor - Bir bitmap'ten oluşturma
Şöyle yaparız.
Bitmap bitMap = new System.Drawing.Bitmap(...);   
Graphics g = Graphics.FromImage(bitMap);
Clear metodu
Arka planı verilen renk ile boyar ve temizler.
graphics.Clear(Color.White);
CompositingQuality Alanı
Şöyle yaparız.
g.CompositingQuality = CompositingQuality.HighQuality;
CopyFromScreen metodu - point + point + size
CopyFromScreen metodu yazısına taşıdım.

CopyFromScreen metodu - x1 + y1 + x2 + y2 + size
CopyFromScreen metodu yazısına taşıdım.

DrawCurve metodu - Pen kullanır
En az 3 noktayı birleştiren bir çizgi çizer.
Graphics g = e.Graphics;
Pen aPen = new Pen(Color.Blue, 1);
Point point1 = new Point(10, 30);
Point point2 = new Point(30, 40);
Point point3 = new Point(50, 60);
Point[] Points = { point1,point2,point3 };
g.DrawCurve(aPen, Points);
DrawEllipse - Pen kullanır
Şöyle yaparız.
Graphics g = ...;
Pen pen = new Pen(colorDialog1.Color, 2);

int sizeCircle = ...;
int mouseX = ...;
int mouseY = ...;
g.DrawEllipse(pen, mouseX, mouseY, sizeCircle, sizeCircle);
DrawImage metodu
Verilen Bitmap'i çizer.
Graphics g = ...; 
g.DrawImage(bitmap, 0, 0, bitmap.Width, bitmap.Height);
Şöyle yaparız.
Bitmap bitmap = new Bitmap(sz.Width, sz.Height))
Rectangle rect = new Rectangle(0, 0, sz.Width, sz.Height);
g.DrawImage(bitmap, this.MarginBounds, rect, GraphicsUnit.Pixel);
Verilen Bitmap'i belirtilen diğer Bitmap'e çizer.
Bitmap source =...;
Rectangle facerectangle =...;
Bitmap target = ...;

using (Graphics g = Graphics.FromImage(target))
{
  g.DrawImage(source, new Rectangle(0, 0, target.Width, target.Height),
              facerectangle, GraphicsUnit.Pixel);
}
Resmi boyutlandırmak için şöyle yaparız.
Image ScaleImage(Image image, int maxWidth, int maxHeight)
{
  var ratioX = (double)maxWidth / image.Width;
  var ratioY = (double)maxHeight / image.Height;
  var ratio = Math.Min(ratioX, ratioY);
  var ratio2 = Math.Max(ratioX, ratioY);

  var newWidth = (int)(image.Width * ratio);
  var newHeight = (int)(image.Height * ratio2);

  var newImage = var newImage = new Bitmap(newWidth, newHeight,
   image.PixelFormat);
  newImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

  Graphics grPhoto = Graphics.FromImage(newImage);
  grPhoto.InterpolationMode = InterpolationMode.High;

  grPhoto.DrawImage(image, 0, 0, newWidth, newHeight);

  grPhoto.Dispose();
  return newImage;           
}
DrawLine Pen kullanır
Şöyle yaparız.
using (Pen p = new Pen(...))
{
  p.DashStyle = DashStyle.Dot;
  p.Width = 3;
  g.DrawLine(p, 0, 0, 10, 10);
}
DrawPath - Pen kullanır
GraphicsPath nesnesini çizer. Şöyle yaparız.
using (GraphicsPath path = ...)
{
  using (Pen p = new Pen(...,...))
  {
    g.DrawPath(p, path);
  }
}
DrawRect metodu Pen kullanır
Örnek
Pen p = new Pen(Color.Black, 4);
Graphics g = panel1.CreateGraphics();
g.DrawRectangle(p, 0, 0, 20, 20);
DrawString metodu - Font ve Brush kullanır
DrawString metodu yazısına taşıdım.

Flush
Şöyle yaparız.
graphics.Flush();
graphics.Dispose();
FillEllipse metodu - Brush kullanır
Şöyle yaparız.
SolidBrush redBrush = new SolidBrush(Color.Red);
Graphics g = this.CreateGraphics();
g.FillEllipse(redBrush, new Rectangle(0,0,200,300));
Rectangle nesnesi yerine dış çerçeveyi verebiliriz. Şöyle yaparız.
Point point = ...
g.FillEllipse(Brushes.Black, point.X, point.Y, 10, 10);
FillPath metodu - Brush kullanır.
Şöyle yaparız.
using (GraphicsPath path = ...)
{
  using (Brush b = new SolidBrush(...))
  {
    g.FillPath(b, path);
  }
}
FillRectangle metodu - Brush kullanır
SolidBrush nesnesini using ile kullanmak gerekir.
using (SolidBrush greenBrush = new SolidBrush(Color.Green))
{
  g.FillRectangle(greenBrush , selection);
}
Kendimiz kodlamak isteseydik doldurmak işlemi için Flood Fill algoritması kullanalabilirdik.

Eğer sistemdeki SolidBrush'lar biterse şu hatayı alırız.
'System.OutOfMemoryException' occurred in System.Drawing.dll
GetHdc metodu
Şöyle yaparız.
IntPtr hdcBitmap = g.GetHdc();
InterpolationMode Alanı
Yazıcıdan çıktı için şöyle yaparız.
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
Path çizmek için şöyle yaparız.
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
MeasureString metodu
Verilen string'in belirtilen font ile kaç pixel tutacağını döndürür. Şöyle yaparız.
g.MeasureString("...", font)
PixelOffsetMode
Anlamadım ama şöyle yaparız.
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
ReleaseHdc metodu
GetHdc metodu ile alınan kaynağı bırakır. Şöyle yaparız.
IntPtr hdcBitmap = g.GetHdc();
...
g.ReleaseHdc(hdcBitmap);
Win32'de şuna denk gelir.
HWND hWin = ...;
HDC hdc = GetDC(hWin);
...
ReleaseDC(hWin, hdc);
ResetTransform metodu
Şöyle yaparız.
g.ResetTransform();
RotateTransform metodu
Şöyle yaparız.
g.RotateTransform(90);
SmoothingMode Alanı
Yazıcıdan çıktı için şöyle yaparız.
g.SmoothingMode = SmoothingMode.HighQuality; // so footer is anti-aliased
Metin göstermek için şöyle yaparız.
g.SmoothingMode = SmoothingMode.AntiAlias;
TextRenderingHint Alanı
Metin göstermek için şöyle yaparız.
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
TranslateTransform metodu
Birçok transform çeşidi var. Bazıları ScaleTransform (ölçeklendirerek bir nokte etrafında döndür) , RotateTransform (sadece döndür) , TranslateTransform (nesneyi x ve y kadar oynat ve döndür) gibi.

DrawImage gibi metodlardan önce resmi çevirmek için kullanılır. Şöyle yaparız.
g.TranslateTransform(30, 30);
Transform metodu
Verilen nokta etrafında matris kadar döndürür. Örnek:
Matrix m = new Matrix ();
m.RotateAt (45);// clockwise direction
g.Transform = m;
//Do drawing
g.ResetTransform ();

VisibleClipBounds Alanı
RectangleF nesnesinin SizeF alanı Size nesnesine şöyle çevrilir.
Size region = g.VisibleClipBounds.Size.ToSize();

Hiç yorum yok:

Yorum Gönder