کارگاه کامپوننت و دی ال ال
در این تاپیک میخوام با همراهی شما دوستان، کامپوننتها و دی ال ال هایی رو که ساختیم برای استفاده عموم قرار بدیم. شرط قرار دادن کامپوننت یا دی ال ال در این تاپیک این است:
1- حتما توسط خود ما نوشته شده باشد.
2- علاوه بر کامپوننت ، باید آموزش ساخت آن را نیز برای دیگران شرح دهیم. ( این کار را در چند جلسه هم میتوان آموزش داد و لزومی به بازگویی مطالب در یک جلسه نیست).
3- آموزشها باید قدم به قدم باشد. طراح کامپوننت یا دی ال ال باید با سعه صدر به تمام سوالات منطقی بازدید کنندگان و علاقمندان پاسخ دهد.
4- سورس کامپوننتها ، فقط در صورت تمایل طراح، منتشر خواهد شد.
آموزش ساخت لیبل پیشرفته - قسمت اول
برای شروع کار ، میخواهیم یک لیبل بسازیم که بسیار متفاوت تر و پیشرفته تر از لیبل موجود در دات نت خواهد بود.
برخی از خصوصیات لیبل که فعلا مد نظر ما هستند عبارتند از :
نوشتن روی لیبل، با رنگهای مختلف و با درجه چرخش مختلف.
بک گراند تک رنگ، چند رنگ و گرادیانت.
خاصیت Image با اپشنهایی مثل Tile و Stretch و Zoom و عیره.
اتوسایزلیبل به اندازه متن موجود در آن.
امکان گرفتن فوکوس.
و ...
دوستان اگه خصوصیات دیگری مد نظرشون بود، اعلام کنند تا آموزش داده شود.
********************************
خب ، شروع میکنیم.
ابتدا از منوی New Project گزینه Windows Control Library را انتخاب کنید. نام Advanced Label رو برای آن تایپ کرده و کلید Ok را فشار دهید.
حالا برنامه را Save کنید.
مهمترین پراپرتی که یک لیبل باید داشته باشد، پراپرتی text می باشد. اما اگر شما در پنجره پراپرتی ، لیست خصوصیات را ببینید، چیزی به این نام پیدا نمیکنید. پس باید این پراپرتی را خودمان بسازیم.
برای تعریف یک پراپرتی ، یک فرمول کلی وجود دارد که در زیر نوشته شده است:
کد:
Public Property (Property Name) As Variable
Get
Return (Current Value)
EndGet
Set(ByVal value AsString)
New Value = Value
End Set
End Property
در پروژه فعلی برای ساخت پراپرتی تکست لیبل، اینگونه عمل میکنیم:
کد:
Dim strText As String=Me.Name
Public Property Caption As String
Get
Return strText
End Get
Set(ByVal value As String)
strText = Value
Me.Invalidate()
End Set
End Property
آموزش ساخت لیبل پیشرفته - قسمت دوم
بعد از ساخت پراپرتی Caption ، پروژه رو اجرا کنید. می بینید که پراپرتی جدید به لیست پراپرتیها اضافه شده، اما هیچ مقداری ندارد و با تغییر آن نیز هیچ اتقاقی نمی افتد. خب ، این برای اینه که ما هنوز برنامه رو بصورت کامل عملیاتی نکردیم و هنوز گامهای زیادی تا پایان کار پیش رو داریم.
توجه داشته باشید که در تعریف یک پراپرتی ، بهتر است مقدار اولیه و پیشفرض آنرا نیز تعیین کنید. پس برای تعین مقدار پیش فرض ، بصورت زیر عمل میکنیم:
به ابتدای پروژه ( خط اول ) عبارت زیر را اضافه نمایید:
Imports System.ComponentModel
و تعریف پراپرتی را به صورت زیر تغییر دهید:
کد:
Dim strText As String = "Adv Label"
<DefaultValue("Adv Label")> _
Public Property Caption() As String
Get
Return strText
End Get
Set(ByVal value As String)
strText = value
Me.Invalidate()
End Set
End Property
پروژه رو مجددا اجرا کنید. میبینید که مقدار اولیه در پراپرتی Caption نمایش داده میشود. خب، دیگه کار ما با این پراپرتی تموم شده و در هرجای برنامه میتونیم از مقدار آن استفاده کنیم و آنرا به کاربر نشان دهیم. برای نمایش مقدار caption ، در پروژه فعلی، از رویداد paint استفاده خواهیم کرد. ( رویداد paint قلب پروژه ما خواهد بود).
پس برای شروع، رویداد paint رو به پروژه اضافه میکنیم و آنرا بصورت زیر تکمیل میکنیم:
کد:
Private Sub UserControl1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
e.Graphics.DrawString(strText, Me.Font, _
New SolidBrush(Me.ForeColor), 0, 0)
End Sub
پروژه رو اجذا کنید. همانطوریگه ملاحظه می کنید مقدار پیشفرض Caption بر روی کنترل نوشته شده است. حالا مقدار Caption را تغییر دهید. چه اتقاقی روی میدهد؟
ادامه دارد.
آموزش ساخت لیبل پیشرفته - قسمت سوم
قبل از ادامه بحث، خاصیت AutoScaleMode کنترل رو به None تغییر دهید. این کار بدین منظور انجام میشود که با تغییر اندازه فونت کنترل، اندازه خود کنترل تغییر نکند. این تغییر بسیار مهم است و در بخشهای بعدی از آن استفاده خواهیم کرد.
در این بخش به یکی از خاصیتهای مهم کنترل خود خواهیم پرداخت و آن عبارت است از AutoSize .
اگر هم اکنون برنامه رو اجرا کنید و خاصیت اتوسایز رو تغییر دهید میبینید که هیچ اتفاقی روی نمیدهد. این وظیفه برنامه نویس هست که این خاصیت رو راهبری کند. چون این پراپرتی بصورت پیشفرض در لیست پراپرتیها وجود دارد ، از تعریف مجدد آن خودداری کرده و به جای آن کدهای مورد نظر رو در رویداد AutoSizeChanged خواهیم نوشت.
هدف چیست؟ هدف ما در این قسمت این است که وقتی خاصیت اتو سایز به True ست شد، اندازه کنترل برابر با طول متن آن شود. برای نیل به این هدف ابتدا متغیر MySize رو از نوع Size بصورت گلوبال تعریف میکنیم و رویداد AutoSizeChanged رو بصورت زیر تکمیل میکنیم:
کد:
Private Sub UserControl1_AutoSizeChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.AutoSizeChanged
Me.Invalidate()
End Sub
رویدادهای Load و SizeChanged رو هم بصورت زیر تکمیل میکنیم:
کد:
Private Sub UserControl1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
MySize = Me.Size
End Sub
Private Sub UserControl1_SizeChanged(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.SizeChanged
If Me.AutoSize = False Then MySize = Me.Size
End Sub
این دستورات برای این است که کاربر بتونه با تغییر مقدار اتوسایز، تغییرات رو بصورت RealTime مشاهده کنه.
در نهایت رویداد paint رو هم بصورت زیر تغییر میدهیم:
کد:
Private Sub UserControl1_Paint(ByVal sender As Object, ByVal e As _
System.Windows.Forms.PaintEventArgs) Handles Me.Paint
If Me.AutoSize = True Then
Dim MySizeF As New SizeF
MySizeF = e.Graphics.MeasureString(strText, Me.Font, 0)
Me.Size = MySizeF.ToSize
Else
Me.Size = MySize
End If
e.Graphics.DrawString(strText, Me.Font, _
New SolidBrush(Me.ForeColor), 0, 0)
End Sub
برنامه رو اجرا کنید و با تغییر مقدار اتوسایز، نتیجه رو ببینید. در حالت AutoSize=True مقدار caption را هم تغییر داده و حاصل کار را تماشا کنید.
خب تا اینجا اگر سوالی باشه در خدمت شما هستم.
ادامه دارد.