PDA

View Full Version : آموزش: ساخت ComboxBox دارای WaterMark - ( متن نمایشی برای راهنمایی کاربر)



alireza264
جمعه 23 مرداد 1394, 14:02 عصر
سلام
با توجه به اینکه چندین بار دوستان بدنبال استفاده از WaterMark در ComboxBox بودند این تاپیکو ایجاد کردم. همچنین بدلیل اینکه توضیح دستورات رو قبلا در تاپیک های مشابه چندین بار گفتم و یا توسط سایرین گفته شده از توضیح مجدد خودداری شده ولی اگه قسمتی نا مفهوم هست بفرمایید تا توضیح بدم
از همه دوستان و اساتید هم خواهش می کنم نظر بدن و کد و بهینه و کاملتر کنن
برای دانلود فایل ها به انتها بروید

134255



using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;



public partial class WaterMark_ComboBox : System.Windows.Forms.ComboBox
{
// تعریف Api مورد نیاز
#region
[DllImport("user32")]
private static extern IntPtr GetWindow(IntPtr hWnd, int wCmd);
private const int GW_CHILD = 5;

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}

[DllImport("user32")]
private static extern IntPtr GetDC(IntPtr hWnd);

[DllImport("user32")]
private static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("user32")]
private static extern int GetClientRect(IntPtr hWnd,
ref RECT lpRect);

[DllImport("user32", CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

#endregion

#region Message Constants


// معرفی ویندوز مسیج ها
const int WM_SETFOCUS = 7;
const int WM_KILLFOCUS = 8;
const int WM_ERASEBKGND = 14;
const int WM_PAINT = 15;
#endregion


#region Member Variables
private bool _focusSelect = true;
private bool _draw_WaterMark = true;
private string _WaterMark_Text = String.Empty;
private Color _WaterMark_Color = SystemColors.GrayText;
private Font _WaterMark_Font = null;
#endregion

public WaterMark_ComboBox()
{
this.WaterMark_Font = this.Font;
}

[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Appearance")]
[Description("متن مورد نظر برای پیش نمایش ")]
public string WaterMark_Text
{
get { return _WaterMark_Text; }
set { _WaterMark_Text = value.Trim(); this.Invalidate(); }
}

[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Appearance")]
[Description("رنگ متن پیش نمایش")]
public Color WaterMark_ForeColor
{
get { return _WaterMark_Color; }
set { _WaterMark_Color = value; this.Invalidate(); }
}

[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Appearance")]
[Description("فونت متن پیش نمایش")]
public Font WaterMark_Font
{
get { return _WaterMark_Font; }
set { _WaterMark_Font = value; this.Invalidate(); }
}

[Browsable(true)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Category("Behavior")]
[Description("بررسی فوکوس کنترل ")]
public bool FocusSelect
{
get { return _focusSelect; }
set { _focusSelect = value; }
}


/// انتخاب کل متن وقتی داخلش کلیک شد
protected override void OnEnter(EventArgs e)
{
if (this.Text.Length > 0 && _focusSelect)
this.SelectAll();

base.OnEnter(e);
}


//RightToLeft نوشتن متن با توجه به
protected override void OnRightToLeftChanged(EventArgs e)
{
base.OnRightToLeftChanged(e);
this.Invalidate();
}


//ساخت کنترل با توجه به متن پیش نمایش

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);

// اگر کنترل خالی متن بود . متن پیش نمایش را نشان بده
if (_draw_WaterMark && this.Text.Length == 0)
DrawText_WaterMark(e.Graphics);
}


protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case WM_SETFOCUS:
SendMessage(this.Handle, WM_PAINT, IntPtr.Zero, IntPtr.Zero);
break;

case WM_KILLFOCUS:
SendMessage(this.Handle, WM_PAINT, IntPtr.Zero, IntPtr.Zero);
break;
}

base.WndProc(ref m);
if (m.Msg == WM_PAINT && _draw_WaterMark && this.Text.Length == 0 && !this.GetStyle(ControlStyles.UserPaint))
DrawText_WaterMark();
}


protected virtual void DrawText_WaterMark()
{
using (Graphics g = this.CreateGraphics())
{
DrawText_WaterMark(g);
}
}


protected virtual void DrawText_WaterMark(Graphics g)
{
IntPtr textBoxHandle = IntPtr.Zero;
IntPtr hDC = IntPtr.Zero;
RECT lpRect = new RECT();

textBoxHandle = GetWindow(this.Handle, GW_CHILD);
GetClientRect(textBoxHandle, ref lpRect);
hDC = GetDC(textBoxHandle);
g = Graphics.FromHdc(hDC);

TextFormatFlags flags = TextFormatFlags.NoPadding | TextFormatFlags.Top | TextFormatFlags.EndEllipsis;
Rectangle rect = new Rectangle(lpRect.Left, lpRect.Top, (lpRect.Right - lpRect.Left), (lpRect.Bottom - lpRect.Top));

switch (this.RightToLeft)
{
case RightToLeft.Yes:
flags = flags | TextFormatFlags.Right;
rect.Offset(0, 1);
break;
case RightToLeft.No:
flags = flags | TextFormatFlags.Left;
rect.Offset(1, 1);
break;
case RightToLeft.Inherit:
flags = flags | TextFormatFlags.Left;
rect.Offset(1, 1);
break;
}


TextRenderer.DrawText(g, _WaterMark_Text, _WaterMark_Font, rect, _WaterMark_Color, this.BackColor, flags);
g.Dispose();
ReleaseDC(textBoxHandle, hDC);
}
}