ID Artikel: 314945 - Kajian Terakhir: 24 September 2011 - Revisi: 2.0

Cara menggambar persegi panjang karet gelang atau persegi panjang fokus dalam Visual C#

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

A karet gelang atau fokus persegi panjang adalah persegi panjang yang trek dengan penunjuk mouse sementara Anda menekan tombol kiri mouse. Teknik ini umum digunakan untuk membatasi pilihan dalam menanggapi pengguna-pointer mouse masukan. Di perangkat grafis Interface (GDI), persegi panjang ini umumnya diimplementasikan dengan menggunakan raster operasi (ROPs). Namun, System.Drawing metode berdasarkan GDI + (penerus GDI), yang tidak memiliki dukungan untuk ROPs. Artikel ini menjelaskan pendekatan lain untuk mengimplementasikan fokus persegi panjang di.NET Framework.

Dalam GDI, persegi panjang fokus adalah biasanya diambil dengan menggunakan ROP kode. Secara khusus, ROP2 kode R2_XORPEN dan R2_NOT sering digunakan. Ketika Anda menggunakan salah satu kode ROP2 ini, Anda dapat menghapus baris sebelumnya dengan menggambar garis lagi di posisi yang sama. Ini adalah kadang-kadang dikenal sebagai eksklusif-OR (XOR) efek.

Contoh kode

Karena ROPs tidak tersedia dalam GDI + dan System.Drawing, pendekatan lain diperlukan untuk menggambar garis reversibel dengan alat-alat ini. Sebagai contoh, Anda dapat menggunakan Platform doa layanan (PInvoke) untuk berinterpolasi dengan GDI. Namun, solusi yang menggunakan hanya berhasil kode adalah tersedia melalui penggunaan anggota statis ControlPaint::DrawReversibleFrame(). Kode contoh berikut, yang ditulis dalam C# dan siap untuk paste bentuk kelas di Microsoft Visual C# aplikasi default, menunjukkan ini pendekatan:
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;
}
				
Catatan Kode harus berubah dalam Visual Studio 2005. Bila Anda membuat proyek Windows Forms, Visual C# menambahkan salah satu bentuk proyek secara default. Formulir ini dinamakan Form1. Dua file yang mewakili bentuk yang bernama Form1.cs dan Form1.designer.cs. Anda menulis kode dalam Form1.cs. Designer.cs file adalah di mana Windows Forms Designer menulis kode sumber yang mengimplementasikan semua tindakan Anda dilakukan dengan menyeret dan menjatuhkan kontrol dari Toolbox. Untuk informasi lebih lanjut tentang Windows bentuk desainer Visual C# 2005, kunjungi Web site Microsoft berikut:
http://msdn2.Microsoft.com/en-us/library/ms173077.aspx (http://msdn2.microsoft.com/en-us/library/ms173077.aspx)
Perhatikan bahwa solusi ini hanya tersedia untuk output pada layar. Pada menarik garis reversibel pada objek grafis, Anda perlu baik berinterpolasi dengan GDI atau panggilan Bitmap::LockBits() dan memanipulasi gambar bit langsung.


Berlaku bagi:
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Windows XP Professional
Kata kunci: 
kbdswgdi2003swept kbgdi kbhowtomaster kbmt KB314945 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:314945  (http://support.microsoft.com/kb/314945/en-us/ )