شیوه ساختن فرم Transparent در .Net
  در این مقاله شیوه ساختن فرم های غیر مستطیلی (Transparnet) را در دات نت شرح می دهم .
   VB
   ۳۸۳۵۹
   دانلود
   محمد زنگنه
   ۱۳۸۶/۱۱/۳۰
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

مقدمه
بسياري از برنامه نويسان دوست دارند ظاهر فرم هاي برنامه هاشان متفاوت از فرم هاي استاندارد ويندوز باشد ، در اين مقاله شيوه ساختن فرم هايي به هر شکل دلخواه را بيان مي کنم .

در دات نت به 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 خودداري کنيد ، چون رنگ هايي که اين برنامه توليد مي کند ناخالص هستند و با روش شما اسازگار نيستند .
در انتها از زحمات دوست خوبم علي رشيدي کمال تشکر را دارم .

ومن الله التوفيق