Makale numarası: 314945 - Son Gözden Geçirme: 11 Aralık 2006 Pazartesi - Gözden geçirme: 3.4

Visual C# [NULL]'ya da bir Odak dörtgenini Lastik bant dikdörtgen çizmek için

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Lastik bant veya odak dikdörtgeni çalışırken, sol fare düğmesini basılı tutun, fare işaretçisini izleyen bir dikdörtgen ' dir. Bu teknik, genellikle, yanıt olarak, kullanıcı-giriş fareyi seçim sınırlandırmak için kullanılır. Grafik aygıt arabirimi (GDI), bu dikdörtgenler tarama işlemlerini (ROPs) kullanarak yaygın olarak uygulanır. Ancak, System.Drawing yöntemi GDI ROPs desteği olan + (GDI için) ardıl) dayanır. Bu makalede, .NET Framework'te odağını dikdörtgen uygulamak için başka bir yaklaşım açıklanmaktadır.

GDI içinde odağı dikdörtgenler ROP kodları kullanarak yaygın olarak çizilir. Özellikle, R2_XORPEN ve R2_NOT ROP2 kodları sıklıkla kullanılır. Bu ROP2 kodlardan birini kullandığınızda, satırı tekrar aynı konumda çizerek bir önceki satırı silebilirsiniz. Bazı durumlarda, bu özel OR (XOR) efekti bilinir.

Örnek kod

GDI + ve System.Drawing ROPs kullanılamaz çünkü başka bir yaklaşım bu araçları, tersine çevrilebilir satırları çizim için gereklidir. Örneğin, GDI ile birlikte çalışma için Platform çağırma Hizmetleri (Pınvoke) kullanabilirsiniz. Ancak, kullandığı kod yalnızca yönetilen bir çözüm ControlPaint::DrawReversibleFrame() statik üyesine yoluyla kullanılabilir. C# ve hazır bir uygulamada varsayılan Microsoft Visual C#, <a2>form</a2> sınıfı yapıştırmak için yazılmış aşağıdaki örnek kod, bu yaklaşım gösterir:
Boolean bHaveMouse;
Point	ptOriginal = new Point();
Point	ptLast = new Point();

// Called when the left mouse button is pressed. 
public void MyMouseDown( Object sender, MouseEventArgs e )
{
	// Make a note that we "have the mouse".
	bHaveMouse = true;
	// Store the "starting point" for this rubber-band rectangle.
	ptOriginal.X = e.X;
	ptOriginal.Y = e.Y;
	// Special value lets us know that no previous
	// rectangle needs to be erased.
	ptLast.X = -1;
	ptLast.Y = -1;
}
// Convert and normalize the points and draw the reversible frame.
private void MyDrawReversibleRectangle( Point p1, Point p2 )
{
	Rectangle rc = new Rectangle();

	// Convert the points to screen coordinates.
	p1 = PointToScreen( p1 );
	p2 = PointToScreen( p2 );
	// Normalize the rectangle.
	if( p1.X < p2.X )
	{
		rc.X = p1.X;
		rc.Width = p2.X - p1.X;
	}
	else
	{
		rc.X = p2.X;
		rc.Width = p1.X - p2.X;
	}
	if( p1.Y < p2.Y )
	{
		rc.Y = p1.Y;
		rc.Height = p2.Y - p1.Y;
	}
	else
	{
		rc.Y = p2.Y;
		rc.Height = p1.Y - p2.Y;
	}
	// Draw the reversible frame.
	ControlPaint.DrawReversibleFrame( rc, 
					Color.Red, FrameStyle.Dashed );
}
// Called when the left mouse button is released.
public void MyMouseUp( Object sender, MouseEventArgs e )
{
	// Set internal flag to know we no longer "have the mouse".
	bHaveMouse = false;
	// If we have drawn previously, draw again in that spot
	// to remove the lines.
	if( ptLast.X != -1 )
	{
		Point ptCurrent = new Point( e.X, e.Y );
		MyDrawReversibleRectangle( ptOriginal, ptLast );
	}
	// Set flags to know that there is no "previous" line to reverse.
	ptLast.X = -1;
	ptLast.Y = -1;
	ptOriginal.X = -1;
	ptOriginal.Y = -1;
}
// Called when the mouse is moved.
public void MyMouseMove( Object sender, MouseEventArgs e )
{
	Point ptCurrent = new Point( e.X, e.Y );
	// If we "have the mouse", then we draw our lines.
	if( bHaveMouse )
	{
		// If we have drawn previously, draw again in
		// that spot to remove the lines.
		if( ptLast.X != -1 )
		{
			MyDrawReversibleRectangle( ptOriginal, ptLast );
		}
		// Update last point.
		ptLast = ptCurrent;
		// Draw new lines.
		MyDrawReversibleRectangle( ptOriginal, ptCurrent );
	}
}
// Set up delegates for mouse events.
protected override void OnLoad(System.EventArgs e)
{
	MouseDown += new MouseEventHandler( MyMouseDown );
	MouseUp += new MouseEventHandler( MyMouseUp );
	MouseMove += new MouseEventHandler( MyMouseMove );
	bHaveMouse = false;
}
				
Not kodunu Visual Studio 2005'te değiştirilmelidir. Windows Forms bir proje oluşturduğunuzda, Visual C# bir form projeye varsayılan olarak ekler. Bu formu Form1 ' dir. Form temsil eden iki dosya Form1.cs ve Form1.designer.cs olarak adlandırılır. Kodunuzu, Form1.cs içinde yazın. Designer.cs denetimleri araç Kutusu'ndan bırakarak gerçekleştirilen tüm eylemleri uygulayan kodu burada Windows Form Designer yazar dosyadır. Visual C# 2005'te Windows Forms Tasarımcısı hakkında daha fazla bilgi için aşağıdaki Microsoft Web sitesini ziyaret edin:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
Bu çözüm yalnızca çıktı ekranda kullanılabildiğini unutmayın. Tersine çevrilebilir satırları bir grafik nesnesi üzerinde çizmek için ya da GDI ile birlikte veya Bitmap::LockBits() arayın ve resim bit doğrudan değiştirmek gerekebilir.


Bu makaledeki bilginin uygulandığı durum:
  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Windows XP Professional Edition
  • the operating system: Microsoft Windows XP 64-Bit Edition
Anahtar Kelimeler: 
kbmt kbdswgdi2003swept kbgdi kbhowtomaster KB314945 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:314945  (http://support.microsoft.com/kb/314945/en-us/ )