در وی بی 2005 میتوان لیبل رو اتو سایز کرد. بطوریکه اندازه لیبل برابر با اندازه تکست لیبل میشود.
ولی آیا واقعا همینطوره؟
جواب منفی می باشد. یه شکل زیر دقت کنید:
این تصویر مربوط میشود به یک لیبل استاندارد در وی بی 2005 که اتوسایز آن برابر True ست شده است. حتی Margin و Padding آن هم برابر صفر قرار داده شده است. ولی باز هم مشاهده می فرمایید که حاشیه های بین لبه ها قابل رویت می باشد.
برای درک بهتر موضوع، همان لیبل رو در برنامه PhotoImpact نشان داده ام. (تصویر زیر)
ملاحظه می فرمایید که کاملا یک اتو سایز واقعی ( = اندازه تکست ) به نمایش گذاشته شده است.
این موضوع مدتی بود که ذهن منو شدیدا به خودش مشغول کرده بود. چون در حال حاضر مشغول نوشتن نرم افزار دریچه می باشم و برای بخش چاپ این نرم افزار ، نیاز به یک تکنیک داشتیم تا اندازه لیبل دقیقا برابر با تکست آن شود.
در یک سایت ایرانی و چند سایت خارجی این سوال رو مطرح کردم ولی هیچ کس نتونست یک جوابی برای این مسئله پیدا کند. حتی در خود Msdn هم جوابی برای این مسئله پیدا نکردم. البته چند راه حل ارائه دادند ولی باز هم کاملا اتوسایز نمیشد و حاشیه ها قابل رویت بودند.
به هر حال پس از کلنجار فراوان تونستم متدی بنویسم که با سرعت بسیار خوبی بتونه یک لیبل با اتو سایز واقعی رو به نمایش بگذارد. تصمیم گرفتم این متد رو همینجا بنویسم تا دوستان دیگه هم که همچین سوالی براشون پیش اومد بتوانند از آن بهره بگیرند.
بسیار ممنون.
کد:
Public Sub Actual_AutoSize(ByVal AxLabel As Label)
If AxLabel.Text.Trim.Length = 0 Then Exit Sub
Dim gp As New Drawing2D.GraphicsPath
Dim sf As New StringFormat
Dim rgn As Region
sf.LineAlignment = StringAlignment.Near
sf.Alignment = StringAlignment.Near
gp.AddString(AxLabel.Text, AxLabel.Font.FontFamily, AxLabel.Font.Style, AxLabel.Font.SizeInPoints, New Point(0, 0), sf)
rgn = New Region(gp)
Dim bit As New Bitmap(AxLabel.Width, AxLabel.Height)
AxLabel.DrawToBitmap(bit, AxLabel.DisplayRectangle)
Dim x As Integer = rgn.GetBounds(AxLabel.CreateGraphics).X
Dim y As Integer = rgn.GetBounds(AxLabel.CreateGraphics).Y
Dim XX, YY As Integer
For XX = x To bit.Width - 1
For YY = y To bit.Height - 1
If bit.GetPixel(XX, YY).ToArgb.ToString <> AxLabel.BackColor.ToArgb.ToString Then
GoTo 100
End If
Next
Next
100:
Dim FirstX As Integer = XX
For XX = bit.Width - 1 To 0 Step -1
For YY = y To bit.Height - 1
If bit.GetPixel(XX, YY).ToArgb.ToString <> AxLabel.BackColor.ToArgb.ToString Then
GoTo 200
End If
Next
Next
200:
Dim SecondX As Integer = XX
For YY = y To bit.Height - 1
For XX = x To bit.Width - 1
If bit.GetPixel(XX, YY).ToArgb.ToString <> AxLabel.BackColor.ToArgb.ToString Then
GoTo 300
End If
Next
Next
300:
Dim FirstY As Integer = YY
For YY = bit.Height - 1 To 0 Step -1
For XX = x To bit.Width - 1
If bit.GetPixel(XX, YY).ToArgb.ToString <> AxLabel.BackColor.ToArgb.ToString Then
GoTo 400
End If
Next
Next
400:
Dim SecondY As Integer = YY
AxLabel.Region = New Region(New Rectangle(FirstX, FirstY, SecondX - FirstX, SecondY - FirstY))
gp = Nothing
sf = Nothing
rgn = Nothing
bit = Nothing
x = Nothing
y = Nothing
XX = Nothing
YY = Nothing
FirstX = Nothing
SecondX = Nothing
FirstY = Nothing
SecondY = Nothing
End Sub
نتیجه کار: