PDA

View Full Version : سوال: حاشیه دار کردن کنترل Textbox در یک User Control



gilsoft
دوشنبه 19 دی 1390, 05:31 صبح
سلام و عرض خسته نباشید به دوستان محترم ...
من یه همچین کدی رو از همین سایت برداشتم و استفاده کردم .. خیلی خوشم اومد. این کد بدور کنترل ، یه حاشیه به رنگ و سایز دلخواه ترسیم میکنه ... :لبخندساده:


Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
Dim g As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue, 5.0)
g.DrawRectangle(pen, New Rectangle(TextBox1.Location, TextBox1.Size))
pen.Dispose()
End Sub

میخوام این کد رو تو یه کامپوننت شخصی اسفاده کنم .. هرچی کلنجار رفتم .. نشد که نشد !
نمونه ای رو که تو کامپوننت استفاده کردم به شکل زیر تغییر دادم ... :ناراحت:


Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
Dim g As Graphics = e.Graphics
Dim pen As New Pen(Color.Blue, 5.0)
g.DrawRectangle(pen, New Rectangle(Me.Location, Me.Size))
pen.Dispose()
End Sub

اما به هیچ وجه عمل نمیکنه ! به نظر شما من کجای کارم اشتباهه ؟! :متفکر:

arash020
دوشنبه 19 دی 1390, 06:16 صبح
سلام
کد شما اون حاشیه رو ایجاد میکنه
اگه مشکل شما اینه که درست سرجاش نمیفته برای اینه که خوب محل شناسایی نمیشه توی اون رویداد یا بعد از تغییراتی شناساشش میشه
شما میتونی دستی هم مختصات بدی
به جای روش :

g.DrawRectangle(pen, New Rectangle(Me.Location, Me.Size))
از روش :

g.DrawRectangle(pen, New Rectangle(34, 65, 76, 87))
استفاده بفرمااین.
داخل پرانتز به ترتیب از چپ به راست:
x شروع
y شروع
عرض
طول


امبدوارم کمک کرده باشم
موفق باشید

mgh64120
دوشنبه 19 دی 1390, 08:47 صبح
سلام دوست عزيز
به تاپيك زير يه نگاهي بيندازيد.
http://barnamenevis.org/showthread.php?98755-ظ†ع©ط§طھطŒ-ط§غŒط¯ظ‡-ظ‡ط§-ظˆ-طھط±ظپظ†ط¯ظ‡ط§غŒ-ع©ظˆع†ع©-ط¨ط±ظ†ط§ظ…ظ‡-ظ†ظˆغŒط³غŒ-ط¯ط±-vb.net&p=484447#post484447
موفق باشيد...

gilsoft
دوشنبه 19 دی 1390, 09:01 صبح
سلام دوست عزيز
به تاپيك زير يه نگاهي بيندازيد.
http://barnamenevis.org/showthread.php?98755-ظ†ع©ط§طھطŒ-ط§غŒط¯ظ‡-ظ‡ط§-ظˆ-طھط±ظپظ†ط¯ظ‡ط§غŒ-ع©ظˆع†ع©-ط¨ط±ظ†ط§ظ…ظ‡-ظ†ظˆغŒط³غŒ-ط¯ط±-vb.net&p=484447#post484447
موفق باشيد...
این تاپیک با دستور زیر یه کادر رسم می کنه ... عیبش اینه که سایز خط/کادر رو نمیتونی مشخص کنی ! یه چیزی رو خدمت همه ی دوستان عرض کنم که تقریبا تمام سایت رو جستجو کردم .. ولی نتونستم جواب بگیرم

ControlPaint.DrawBorder(graphics, rectangle, borderColor, ButtonBorderStyle.Solid)

من یه کنترل Textbox سفارشی نوشتم که حدود 20تا Property داره و اگه این مشکل رو برطرف کنم .. با سورس کد میزارم رو سایت که همه استفاده کنند ...
توضیح اینکه من در واقع میخوام یه چیزی مثل Highlighter مجموعه کامپوننت DevComponents داشته باشم
از mgh64120 (http://barnamenevis.org/member.php?41719-mgh64120) و arash020 (http://barnamenevis.org/member.php?126373-arash020) هم سپاسگزارم .

gilsoft
چهارشنبه 21 دی 1390, 06:21 صبح
سلام. من این کنترل سفارشی رو گذاشتم رو سایت . اینم لینکش :
http://barnamenevis.org/showthread.php?322525-%DA%A9%D9%86%D8%AA%D8%B1%D9%84-TextBox-%D8%A8%D8%A7-%28%D9%85%D8%AC%D9%85%D9%88%D8%B9-30-%D8%AE%D8%A7%D8%B5%DB%8C%D8%AA%29-%D8%A8%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%B3%D9%88%D8%B1%D8%B3-%DA%A9%D8%AF-%D8%AA%D9%82%D8%AF%DB%8C%D9%85-%D8%A8%D9%87-%D8%A7%D8%B9%D8%B6%D8%A7%D8%A1-%D8%AA%D8%A7%D9%84%D8%A7%D8%B1-VB.net&daysprune=2
اما کسی نیمتونه درباره این مشکل من رو یه راهنمایی کنه ؟ :متفکر:

Saman_12
چهارشنبه 21 دی 1390, 19:31 عصر
اصلاح میکنم :

کد اولیه که شما استفاده کردید مشکلی نداره فقط مشکل از اتفاق نیفتادن رویداد پینت تکست باکس هستش شما دو (یا بیشتر) راه دارید :
1.کادر مورد نظر رو روی پارنت تکست باکس رسم کنید.(با add handler)
2.کادر رو روی خود تکست باکس رسم کنید.(بعید میدونم زیاد خوب بشه.)(با add handler)
3.....

gilsoft
چهارشنبه 21 دی 1390, 19:49 عصر
کد اولیه که شما استفاده کردید یه کادر دور تکست باکس روی فرم رسم میکنه نه روی تکست باکس دلیلش هم همینه که کادر توی یوزر کنترل رسم نمیشه شما دو (یا بیشتر) راه دارید :
سلام دوست من
من کادر توی (داخل) Textbox تونستم رسم کنم. (سورش هم از همین سایت دانلود کردم) توضیح اینکه من در واقع میخوام یه چیزی مثل Highlighter مجموعه کامپوننت DevComponents داشته باشم . یعنی بیرون کادر رسم بشه اگه به صورت گرادیانت هم باشه که چه بهتر ... بیشتر برام گرادیانتش مهمه !

Saman_12
چهارشنبه 21 دی 1390, 21:21 عصر
گرادیانت رو درست یادم نیست ولی فکر کنم با این دوتا بشه چیزی میانه رو طرح زد :
Dim br As New Drawing2D.LinearGradientBrush(Me.DisplayRectangle, Color.DeepSkyBlue, Color.Snow, 45)

e.Graphics.FillRectangle(br, Me.DisplayRectangle)
e.Graphics.FillRectangle(New SolidBrush(Me.BackColor), New Rectangle(10, 10, Me.Width - 20, Me.Height - 20))


Dim gp As New Drawing2D.GraphicsPath
gp.AddRectangles({Me.DisplayRectangle, New Rectangle(10, 10, Me.Width - 20, Me.Height - 20)})

Dim gpbr As New Drawing2D.PathGradientBrush(gp)
gpbr.SurroundColors = {Color.DeepSkyBlue, Color.GreenYellow, Color.Snow, Color.LightYellow}

e.Graphics.FillPath(gpbr, gp)

gilsoft
پنج شنبه 22 دی 1390, 02:15 صبح
گرادیانت رو درست یادم نیست ولی فکر کنم با این دوتا بشه چیزی میانه رو طرح زد :
من تو User Control نتونستم از این کدها استفاده کنم (اگه میتونی یه Sample کوچک بذار ببینم چطور میشه ازش استفاده کرد !
اینم نمونه عکس :

80615

بازم ممنونم ...

Saman_12
پنج شنبه 22 دی 1390, 11:46 صبح
البته یک تیکه کوچیکش رو تغییر دادم :لبخند: :

gilsoft
جمعه 10 آذر 1391, 19:44 عصر
سلام دوستان

من با کد زیر حاشیه ی کنترل شخصی TextBox خودمو رنگی میکردم و هیچ مشکلی نداشتم .... :لبخندساده:

اما تو محیط Windows 7 کد زیر کار نمیکنه ! :افسرده: :گریه:

مشکلش هم اینه که همش hdc برابر صفره !

نمیدونم چرا ؟ :متعجب:

Private Shared WM_NCPAINT As Integer = &H85
Private Shared WM_ERASEBKGND As Integer = &H14
Private Shared WM_PAINT As Integer = &HF

<DllImport("user32.dll")> _
Shared Function GetDCEx(ByVal hwnd As IntPtr, ByVal hrgnclip As IntPtr, ByVal fdwOptions As UInt32) As IntPtr
End Function
<DllImport("user32.dll")> _
Shared Function ReleaseDC(ByVal hwnd As IntPtr, ByVal hDC As IntPtr) As Integer
End Function
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
MyBase.WndProc(m)
If m.Msg = WM_NCPAINT Or m.Msg = WM_ERASEBKGND Or m.Msg = WM_PAINT Then

Dim hdc As IntPtr = GetDCEx(m.HWnd, CType(1, IntPtr), 1 Or &H20)

If (hdc <> IntPtr.Zero) Then

Dim graphics As Graphics = graphics.FromHdc(hdc)
Dim borderColor As Color = Color.Blue
Dim rectangle As Rectangle = New Rectangle(0, 0, Me.Width, Me.Height)
ControlPaint.DrawBorder(graphics, rectangle, borderColor, ButtonBorderStyle.Solid)
m.Result = CType(1, IntPtr)
ReleaseDC(m.HWnd, hdc)
End If
End If
End Sub

منبع کد فوق : حاشیه دار کردن کنترل TextBox با یک رنگ دلخواه (http://barnamenevis.org/showthread.php?98755-vb.net&p=484491&viewfull=1#post484491)