Nasıl yapılır: Basit Bir Windows Forms Denetimi Geliştirme
Bu bölümde, özel bir Windows Forms denetimi yazmanın temel adımları açıklanmıştır. Bu kılavuzda geliştirilen basit denetim, özelliğinin hizalamasının Text değiştirilmesini sağlar. Olayları tetiklemiyor veya işlemez.
Basit bir özel denetim oluşturmak için
öğesinden System.Windows.Forms.Controltüretilen bir sınıf tanımlayın.
Public Class FirstControl Inherits Control End Class
public class FirstControl:Control {}
Özellikleri tanımlayın. (Bir denetim sınıftan birçok özelliği devraldığından, ancak özel denetimlerin Control çoğu genellikle ek özellikleri tanımladığından özellikleri tanımlamanız gerekmez.) Aşağıdaki kod parçası, öğesinden Controldevralınan
FirstControl
özelliğin Text görüntüsünü biçimlendirmek için kullanan adlıTextAlignment
bir özelliği tanımlar. Özellikleri tanımlama hakkında daha fazla bilgi için bkz . Özelliklere Genel Bakış.// ContentAlignment is an enumeration defined in the System.Drawing // namespace that specifies the alignment of content on a drawing // surface. private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
' ContentAlignment is an enumeration defined in the System.Drawing ' namespace that specifies the alignment of content on a drawing ' surface. Private alignmentValue As ContentAlignment = ContentAlignment.MiddleLeft <Category("Alignment"), Description("Specifies the alignment of text.")> _ Public Property TextAlignment() As ContentAlignment Get Return alignmentValue End Get Set alignmentValue = value ' The Invalidate method invokes the OnPaint method described ' in step 3. Invalidate() End Set End Property
Denetimin görsel görünümünü değiştiren bir özellik ayarladığınızda, denetimi yeniden çizmek için yöntemini çağırmanız Invalidate gerekir. Invalidate , temel sınıfında Controltanımlanır.
Denetiminize işleme mantığı sağlamak için öğesinden devralınan Control korumalı OnPaint yöntemi geçersiz kılın. geçersiz kılmazsanız OnPaint, denetiminiz kendisini çizemez. Aşağıdaki kod parçasında OnPaint yöntemi, öğesinden Control devralınan Text özelliği alan tarafından
alignmentValue
belirtilen hizalamayla görüntüler.protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); StringFormat style = new StringFormat(); style.Alignment = StringAlignment.Near; switch (alignmentValue) { case ContentAlignment.MiddleLeft: style.Alignment = StringAlignment.Near; break; case ContentAlignment.MiddleRight: style.Alignment = StringAlignment.Far; break; case ContentAlignment.MiddleCenter: style.Alignment = StringAlignment.Center; break; } // Call the DrawString method of the System.Drawing class to write // text. Text and ClientRectangle are properties inherited from // Control. e.Graphics.DrawString( Text, Font, new SolidBrush(ForeColor), ClientRectangle, style); }
Protected Overrides Sub OnPaint(e As PaintEventArgs) MyBase.OnPaint(e) Dim style As New StringFormat() style.Alignment = StringAlignment.Near Select Case alignmentValue Case ContentAlignment.MiddleLeft style.Alignment = StringAlignment.Near Case ContentAlignment.MiddleRight style.Alignment = StringAlignment.Far Case ContentAlignment.MiddleCenter style.Alignment = StringAlignment.Center End Select ' Call the DrawString method of the System.Drawing class to write ' text. Text and ClientRectangle are properties inherited from ' Control. e.Graphics.DrawString( _ me.Text, _ me.Font, _ New SolidBrush(ForeColor), _ RectangleF.op_Implicit(ClientRectangle), _ style) End Sub
Denetiminiz için öznitelikler sağlayın. Öznitelikler, görsel tasarımcının denetiminizi ve tasarım zamanında özelliklerini ve olaylarını uygun şekilde görüntülemesini sağlar. Aşağıdaki kod parçası özelliğine
TextAlignment
öznitelikler uygular. Visual Studio gibi bir tasarımcıda özniteliği Category (kod parçasında gösterilir) özelliğin mantıksal bir kategori altında görüntülenmesine neden olur. özniteliği, Description özellik seçildiğinde Özellikler penceresinin alt kısmında açıklayıcı bir dize görüntülenmesineTextAlignment
neden olur. Öznitelikler hakkında daha fazla bilgi için bkz . Bileşenler için Tasarım Zamanı Öznitelikleri.[ Category("Alignment"), Description("Specifies the alignment of text.") ]
<Category("Alignment"), Description("Specifies the alignment of text.")> _ Public Property TextAlignment() As ContentAlignment
(isteğe bağlı) Denetiminiz için kaynak sağlayın. Denetiminizle kaynakları paketlemek için bir derleyici seçeneği (
/res
C#için) kullanarak denetiminiz için bit eşlem gibi bir kaynak sağlayabilirsiniz. Çalışma zamanında, kaynak sınıfının yöntemleri ResourceManager kullanılarak alınabilir. Kaynakları oluşturma ve kullanma hakkında daha fazla bilgi için bkz . Masaüstü Uygulamalarında Kaynaklar.Denetiminizi derleyin ve dağıtın. Derlemek ve dağıtmak
FirstControl,
için aşağıdaki adımları yürütebilirsiniz:Aşağıdaki örnekteki kodu bir kaynak dosyaya (FirstControl.cs veya FirstControl.vb gibi) kaydedin.
Kaynak kodu bir derlemede derleyin ve uygulamanızın dizinine kaydedin. Bunu yapmak için, kaynak dosyayı içeren dizinden aşağıdaki komutu yürütür.
vbc -t:library -out:[path to your application's directory]/CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll FirstControl.vb
csc -t:library -out:[path to your application's directory]/CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll FirstControl.cs
Derleyici
/t:library
seçeneği, derleyiciye oluşturduğunuz derlemenin yürütülebilir bir kitaplık (yürütülebilir değil) olduğunu bildirir./out
seçeneği, derlemenin yolunu ve adını belirtir. seçeneği,/r
kodunuz tarafından başvuruda bulunılan derlemelerin adını sağlar. Bu örnekte, yalnızca uygulamalarınızın kullanabileceği bir özel derleme oluşturursunuz. Bu nedenle, uygulamanızın dizinine kaydetmeniz gerekir. Dağıtım denetimi paketleme ve dağıtma hakkında daha fazla bilgi için bkz . Dağıtım.
Aşağıdaki örnekte için FirstControl
kod gösterilmektedir. Denetim, ad alanında CustomWinControls
yer alır. Ad alanı, ilgili türlerden oluşan mantıksal bir gruplandırma sağlar. Denetiminizi yeni veya mevcut bir ad alanında oluşturabilirsiniz. C# dilinde bildirim using
(Visual Basic'te Imports
), türün tam adı kullanılmadan türlerin ad alanından erişilmesine izin verir. Aşağıdaki örnekte, bildirimi kodun using
tam adı System.Windows.Forms.Controlkullanmak yerine sınıfına Control 'den System.Windows.FormsControl erişmesine izin verir.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace CustomWinControls
{
public class FirstControl : Control
{
public FirstControl()
{
}
// ContentAlignment is an enumeration defined in the System.Drawing
// namespace that specifies the alignment of content on a drawing
// surface.
private ContentAlignment alignmentValue = ContentAlignment.MiddleLeft;
[
Category("Alignment"),
Description("Specifies the alignment of text.")
]
public ContentAlignment TextAlignment
{
get
{
return alignmentValue;
}
set
{
alignmentValue = value;
// The Invalidate method invokes the OnPaint method described
// in step 3.
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
StringFormat style = new StringFormat();
style.Alignment = StringAlignment.Near;
switch (alignmentValue)
{
case ContentAlignment.MiddleLeft:
style.Alignment = StringAlignment.Near;
break;
case ContentAlignment.MiddleRight:
style.Alignment = StringAlignment.Far;
break;
case ContentAlignment.MiddleCenter:
style.Alignment = StringAlignment.Center;
break;
}
// Call the DrawString method of the System.Drawing class to write
// text. Text and ClientRectangle are properties inherited from
// Control.
e.Graphics.DrawString(
Text,
Font,
new SolidBrush(ForeColor),
ClientRectangle, style);
}
}
}
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Public Class FirstControl
Inherits Control
Public Sub New()
End Sub
' ContentAlignment is an enumeration defined in the System.Drawing
' namespace that specifies the alignment of content on a drawing
' surface.
Private alignmentValue As ContentAlignment = ContentAlignment.MiddleLeft
<Category("Alignment"), Description("Specifies the alignment of text.")> _
Public Property TextAlignment() As ContentAlignment
Get
Return alignmentValue
End Get
Set
alignmentValue = value
' The Invalidate method invokes the OnPaint method described
' in step 3.
Invalidate()
End Set
End Property
Protected Overrides Sub OnPaint(e As PaintEventArgs)
MyBase.OnPaint(e)
Dim style As New StringFormat()
style.Alignment = StringAlignment.Near
Select Case alignmentValue
Case ContentAlignment.MiddleLeft
style.Alignment = StringAlignment.Near
Case ContentAlignment.MiddleRight
style.Alignment = StringAlignment.Far
Case ContentAlignment.MiddleCenter
style.Alignment = StringAlignment.Center
End Select
' Call the DrawString method of the System.Drawing class to write
' text. Text and ClientRectangle are properties inherited from
' Control.
e.Graphics.DrawString( _
me.Text, _
me.Font, _
New SolidBrush(ForeColor), _
RectangleF.op_Implicit(ClientRectangle), _
style)
End Sub
End Class
Formda Özel Denetimi Kullanma
Aşağıdaki örnekte kullanan FirstControl
basit bir form gösterilmektedir. Her biri FirstControl
özelliği için TextAlignment
farklı bir değere sahip üç örneği oluşturur.
Bu örneği derlemek ve çalıştırmak için
Aşağıdaki örnekteki kodu bir kaynak dosyaya (SimpleForm.cs veya SimpleForms.vb) kaydedin.
Kaynak dosyayı içeren dizinden aşağıdaki komutu yürüterek kaynak kodu yürütülebilir bir derlemede derleyin.
vbc -r:CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll SimpleForm.vb
csc -r:CustomWinControls.dll -r:System.dll -r:System.Windows.Forms.dll -r:System.Drawing.dll SimpleForm.cs
CustomWinControls.dll, sınıfını
FirstControl
içeren derlemedir. Bu derleme, bu derlemeye erişen formun kaynak dosyasıyla aynı dizinde olmalıdır (SimpleForm.cs veya SimpleForms.vb).Aşağıdaki komutu kullanarak SimpleForm.exe dosyasını yürütür.
SimpleForm
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace CustomWinControls
{
public class SimpleForm : System.Windows.Forms.Form
{
private FirstControl firstControl1;
private System.ComponentModel.Container components = null;
public SimpleForm()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
private void InitializeComponent()
{
this.firstControl1 = new FirstControl();
this.SuspendLayout();
//
// firstControl1
//
this.firstControl1.BackColor = System.Drawing.SystemColors.ControlDark;
this.firstControl1.Location = new System.Drawing.Point(96, 104);
this.firstControl1.Name = "firstControl1";
this.firstControl1.Size = new System.Drawing.Size(75, 16);
this.firstControl1.TabIndex = 0;
this.firstControl1.Text = "Hello World";
this.firstControl1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter;
//
// SimpleForm
//
this.ClientSize = new System.Drawing.Size(292, 266);
this.Controls.Add(this.firstControl1);
this.Name = "SimpleForm";
this.Text = "SimpleForm";
this.ResumeLayout(false);
}
[STAThread]
static void Main()
{
Application.Run(new SimpleForm());
}
}
}
Imports System.Drawing
Imports System.Collections
Imports System.ComponentModel
Imports System.Windows.Forms
Public Class SimpleForm
Inherits System.Windows.Forms.Form
Private firstControl1 As FirstControl
Private components As System.ComponentModel.Container = Nothing
Public Sub New()
InitializeComponent()
End Sub
Private Sub InitializeComponent()
Me.firstControl1 = New FirstControl()
Me.SuspendLayout()
'
' firstControl1
'
Me.firstControl1.BackColor = System.Drawing.SystemColors.ControlDark
Me.firstControl1.Location = New System.Drawing.Point(96, 104)
Me.firstControl1.Name = "firstControl1"
Me.firstControl1.Size = New System.Drawing.Size(75, 16)
Me.firstControl1.TabIndex = 0
Me.firstControl1.Text = "Hello World"
Me.firstControl1.TextAlignment = System.Drawing.ContentAlignment.MiddleCenter
'
' SimpleForm
'
Me.ClientSize = New System.Drawing.Size(292, 266)
Me.Controls.Add(firstControl1)
Me.Name = "SimpleForm"
Me.Text = "SimpleForm"
Me.ResumeLayout(False)
End Sub
<STAThread()> _
Shared Sub Main()
Application.Run(New SimpleForm())
End Sub
End Class
Ayrıca bkz.
.NET Desktop feedback