مقدمه
بسياري از
برنامه نويسان دوست دارند ظاهر فرم هاي برنامه هاشان متفاوت از فرم هاي استاندارد
ويندوز باشد ، در اين مقاله شيوه ساختن فرم هايي به هر شکل دلخواه را بيان مي کنم .
در دات نت به 2 روش مي توانيم فرم هاي غير مستطيلي بسازيم :
1 - خود دات نت اين
کار را انجام دهد .
2 - به وسيله برنامه نويسي گرافيکي .
براي استفاده از هر کدام از اين روشها ابتدا تصويري را که مي خواهيد فرم تان به آن
شکل باشد را با استفاده از برنامه هاي گرافيکي مانند Paint يا ... ايجاد کنيد.نکته
اي که در زمان ايجاد تصوير بايد به آن توجه کنيد ، اين است که رنگ پس زمينه تصوير
را بدانيد و به خاطر بسپاريد .اين مطلب از اهميت فوق العاده اي برخوردار است به
همين علت توصيه مي کنم RGB رنگ را به خاطر داشته باشيد .
روش اول
يک فرم ايجاد کرده و خصوصيت FormBorderStyle آنرا برابر با
None قرار دهيد .
تصويري را که در يک برنامه گرافيکي ساخته ايد را به
عنوان BackgraundImage فرم قرار دهيد .
خصوصيت TransparentKey فرم
را برابر با رنگ Backgraund تصوير قرار دهيد .
برنامه را اجرا کنيد . به
همين سادگي !!!!!
توجه :
اين روش بر روي همه سيستم هاي جواب نمي دهد .براي مشاهده محدوديت هاي اين روش به
MSDN مراجعه کنيد .
روش دوم ( استفاده از برنامه
نويسي گرافيکي) :
اين کار زحمت بيشتري دارد ولي باعث مي شود با جزييات
مفيدي آشنا شده وشيوه انجام اين کار را متوجه شويد .
در اين روش هم بايد خصوصيت
FormBorderStyle فرمتان را برابر با None قرار دهيد .
اجازه بدهيد در اينجا يک مقدار به عقب برگرديم و از خود بپرسيم که
Transparent کردن يک فرم به چه معني است ؟
يک فرم Transparent فرمي
است که ناحيه )Region) فرم فقط و فقط محدود به خود تصوير است و رنگ پس
زمينه تصوير از خود تصوير حذف شده است .
براي Transparent کردن يک فرم ،
ما نيز دقيقا همين کار را انجام مي دهيم ، يعني ناحيه اي ايجاد مي کنيم که شامل فقط
خود تصوير باشد و رنگ پس زمينه از آن حذف شده باشد ،سپس ناحيه فرم را برابر با اين
ناحيه قرار مي دهيم .
تابع زير يک شئ از نوع
Bitmap و يک رنگ به عنوان رنگي که بايد از تصوير حذف شود را مي گيرد و
يک ناحيه گرافيکي که شامل تصوير بدون پيکسلهايي که داراي رنگ پس زمينه هستند را
برمي گرداند .
Public Function ConvertFromTransparentBitmap(ByVal imageRegion As Bitmap,
ByVal transparentColor As Color) As Region
Dim aPixel As GraphicsUnit = GraphicsUnit.Pixel
Dim imageBoundsF As RectangleF = imageRegion.GetBounds(aPixel)
Dim imageWidth As Integer = imageBoundsF.Width
Dim imageHeight As Integer = imageBoundsF.Height
Dim regionPath As GraphicsPath = New GraphicsPath()
For intY As Integer = 0 To imageHeight - 2
For intX As Integer = 0 To imageWidth - 2
Dim TempColor As Color = imageRegion.GetPixel(intX, intY)
If imageRegion.GetPixel(intX, intY) <> transparentColor Then
regionPath.AddRectangle(New Rectangle(intX, intY, 1, 1))
End If
Next
Next
Dim formRegion As Region = New Region(regionPath)
regionPath.Dispose() Return
formRegion
End Function
|
براي بهبود کارايي مي توان از تابع زير هم استفاده نمود ، که سريعتر است ، به اين
خاطر که در اين روش سطري پيکسل حذف مي کنيم .
Private Function ConvertFromTransparentBitmapFastesr(ByVal bitmap As Bitmap)
As Region Dim graphicsPath As
GraphicsPath = New GraphicsPath()
Dim colorTransparent As Color = bitmap.GetPixel(0, 0)
Dim colOpaquePixel As Integer = 0
For intRow As Integer = 0 To bitmap.Height - 1
colOpaquePixel = 0
For intColumn As Integer = 0 To bitmap.Width - 1
If bitmap.GetPixel(intColumn, intRow) <> colorTransparent Then
colOpaquePixel = intColumn
Dim colNext As Integer = intColumn
For colNext = colOpaquePixel To bitmap.Width - 1
If bitmap.GetPixel(colNext, intRow) = colorTransparent Then
Exit For
End If
Next
graphicsPath.AddRectangle(New Rectangle(colOpaquePixel, intRow, colNext -
colOpaquePixel, 1))
intColumn = colNext
End If
Next
Next
Return New Region(graphicsPath) End Function
|
حال در هنگام بارگذاري فرم Region فرم خود را برابر خروجي يکي از توابع بالا قرار
مي دهيم .
Region =
ConvertFromTransparentBitmap(imageBackground, transparentColor)
|
نکاتي در مورد مقاله :
1 - روش برنامه نويسي گرافيکي نسبت به روش اول کندتر است
چون در اين روش عمليات در سطح کتاب خانه هاي .Net انجام مي شود .
2 – اين مقاله
براي آگاهي دوستان از شيوه Transparent شدن فرم بوده و اينکه شما بدانيد اين کار
چگونه انجام مي شود. شما با دانستن اين مطلب مي توانيد استفاده هاي ديگري از
آن بکنيد.
3 - چون در هر 2 روش خصوصيت FormBorderStyle فرم مساوي
None قرار داديم ، فرم شما قابليت Drag & Drop ندارد و شما بايد براي
دادن قابليت Drag & Drop به فرمتان کد بنويسيد .( در مثال همراه مقاله وجود دارد .)
توجه :
از ساختن تصوير پس زمينه با برنامه PhotoShop خودداري کنيد ،
چون رنگ هايي که اين برنامه توليد مي کند ناخالص هستند و با روش شما اسازگار نيستند
.
در انتها از زحمات دوست خوبم علي
رشيدي کمال تشکر را دارم .
ومن الله التوفيق