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.
Metodları
Constructor - Bir bitmap'ten oluşturma
Şöyle yaparız.
Arka planı verilen renk ile boyar ve temizler.
Şöyle yaparız.
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.
Şöyle yaparız.
Verilen Bitmap'i çizer.
DrawString metodu yazısına taşıdım.
Flush
Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
SolidBrush nesnesini using ile kullanmak gerekir.
Eğer sistemdeki SolidBrush'lar biterse şu hatayı alırız.
Şöyle yaparız.
Yazıcıdan çıktı için şöyle yaparız.
Verilen string'in belirtilen font ile kaç pixel tutacağını döndürür. Şöyle yaparız.
Anlamadım ama şöyle yaparız.
GetHdc metodu ile alınan kaynağı bırakır. Şöyle yaparız.
Şöyle yaparız.
Şöyle yaparız.
Yazıcıdan çıktı için şöyle yaparız.
Metin göstermek için şöyle yaparız.
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.
Verilen nokta etrafında matris kadar döndürür. Örnek:
RectangleF nesnesinin SizeF alanı Size nesnesine şöyle çevrilir.
Ç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 metoduArka planı verilen renk ile boyar ve temizler.
graphics.Clear(Color.White);
CompositingQuality AlanıŞöyle yaparız.
g.CompositingQuality = CompositingQuality.HighQuality;
CopyFromScreen metodu - point + point + sizeCopyFromScreen 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 metoduVerilen 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.
Şöyle yaparız.
GraphicsPath nesnesini çizer. Şöyle yaparız.
ÖrnekImage 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ırGraphicsPath nesnesini çizer. Şöyle yaparız.
using (GraphicsPath path = ...)
{
using (Pen p = new Pen(...,...))
{
g.DrawPath(p, path);
}
}
DrawRect metodu - Pen kullanırPen p = new Pen(Color.Black, 4);
Graphics g = panel1.CreateGraphics();
g.DrawRectangle(p, 0, 0, 20, 20);
DrawString metodu - Font ve Brush kullanırDrawString 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ırSolidBrush 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 metoduVerilen string'in belirtilen font ile kaç pixel tutacağını döndürür. Şöyle yaparız.
g.MeasureString("...", font)
PixelOffsetModeAnlamadım ama şöyle yaparız.
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
ReleaseHdc metoduGetHdc 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 metoduBirç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 metoduVerilen nokta etrafında matris kadar döndürür. Örnek:
Matrix m = new Matrix ();VisibleClipBounds Alanı
m.RotateAt (45);// clockwise direction
g.Transform = m;
//Do drawing
g.ResetTransform ();
RectangleF nesnesinin SizeF alanı Size nesnesine şöyle çevrilir.
Size region = g.VisibleClipBounds.Size.ToSize();
Hiç yorum yok:
Yorum Gönder