PDA

View Full Version : مشکل در ايجاد دکمه گرد



negar.rafie
یک شنبه 27 فروردین 1396, 14:18 عصر
سلام
من ميخوام دکمه هاي خودم را گرد کنم
از کد زير استفاده ميکنم و به خوبي گرد ميشه

class RoundButton : Button
{
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
GraphicsPath grPath = new GraphicsPath();
grPath.AddEllipse(0, 0, ClientSize.Width, ClientSize.Height);
this.Region = new System.Drawing.Region(grPath);
base.OnPaint(e);

}
}

حالا دوتا مشکل دارم

اینکه ی حالت میخوام کادر سرتاسر باشه (یعنی بهش border بدم)
ی حالت هم این چهار تا خط نمایش داده نشه

144971

windowsyar
یک شنبه 27 فروردین 1396, 20:50 عصر
سلام
من برای دکمه های گرد
یک عکس گرد (یا هر شکل دیگری)
در فتوشاپ با فرمت png می سازم
و در برنامه استفاده می کنم به نظرم خیلی بهتر از این روش است

Mahmoud.Afrad
یک شنبه 27 فروردین 1396, 23:27 عصر
میتونید رنگ زمینه، بوردر و متن رو توسط متدهای مناسب از شئ گرافیک خودتون رسم کنید و در اینصورت به خط base.OnPaint(e); نیاز نیست.

negar.rafie
دوشنبه 28 فروردین 1396, 02:55 صبح
میتونید رنگ زمینه، بوردر و متن رو توسط متدهای مناسب از شئ گرافیک خودتون رسم کنید و در اینصورت به خط base.OnPaint(e); نیاز نیست.

ممنون
متاسفانه نتونستم
من میخوام هم کادر(بوردر) داشته باشه که البته کادرش مثل موقعی باشه که دکمه معمولی هستش یعنی صاف باشه و بدون هیچ زدگیه
هم بدون بوردر رسم کنم
میشه راهنمایی کنید
از دیروز درگیر این موضوع هستم

mmbguide
دوشنبه 28 فروردین 1396, 11:32 صبح
می تونید در ابتدا یک Rectangle تعریف کنید و مقدارش هممون ClientSize باشه و بعد از اون در یک مستطیل جدید بصورت (newRectangle.Inflate(-3, -3 ابعاد مستطیل مورد نظر که قرار دایره درونش رسم بشه را بزرگتر و یا کوچکتر کنی. درضمن میتونی مقادیر افزایش و یا کاهش را بصورت یک Property در اختیار EndUser قرار بدی.

negar.rafie
دوشنبه 28 فروردین 1396, 11:52 صبح
ممنون
ولی نتونستم بنویسم

mmbguide
دوشنبه 28 فروردین 1396, 12:46 عصر
ابتدا یک UserControl اضافه کنید.
در بخش Designer و در بالای کدها عبارت زیر را جایگزین کنید:
Inherits System.Windows.Forms.Button
در رویداد Resize کنترل کد زیر را بنویسید تا هر زمان که کاربر اندازه دکمه را خواست تغییر بدهد نسبت Width و Height کنترل ثابت بمونه تا دایره به شکل بیضی نشه:
Me.Height = Me.Width
در رویداد Paint کنترل کدهای زیر را بنویسید:

System.Drawing.Drawing2D.GraphicsPath buttonPath = new System.Drawing.Drawing2D.GraphicsPath();

Set a new rectangle to the same size as the button's //
ClientRectangle property. //
Rectangle newRectangle = this.ClientRectangle;

Decrease the size of the rectangle.//
newRectangle.Inflate(2, 2)//

Increase the size of the rectangle to include the border.//
newRectangle.Inflate(-3, -3);

Create a circle within the new rectangle.//
buttonPath.AddEllipse(newRectangle);

Set the button's Region property to the newly created //
circle region.//
this.Region = new System.Drawing.Region(buttonPath);
حالا بعد از Build کردن پروژه میتونی از این کنترل استفاده کنید.

negar.rafie
دوشنبه 28 فروردین 1396, 17:23 عصر
ممنون
ولی متوجه نشدم
;Inherits System.Windows.Forms.Button را کجا وارد کنم؟

با کد خودم راحت تر نیست؟

mmbguide
دوشنبه 28 فروردین 1396, 23:54 عصر
راه حلی که گفتم ایجاد یک کنترل هستش که میتونید به دفعات و بدون کد نویسی اضافه، در برنامه استفاده کنید. روش شما اگر که بخواهید از دکمه های گرد به تعداد زیاد در برنامه استفاده کنید خیلی کار جالبی نیست (البته به نظر من). یک نمونه برات آماده می کنم...

mmbguide
سه شنبه 29 فروردین 1396, 00:32 صبح
ابتدا یک پروژه C# ایجاد کن و بعد روی دکمه نشان داده شده در تصویر زیر کلیک کن تا تمام جزئیات Solution رو ببینی

144978

به پروژه خودت مطابق تصویر زیر یک User Control اضافه کن تا کنترل سفارشی برای خودت درست کنی

144979

مطابق تصویر زیر روی Designer کلیک کن و پس از مشاهده کدهای موجود در این بخش، عبارت نشان داده شده در کادر قرمز رنگ رو اضافه کن

144980

سپس مطابق تصویر زیر روی بخش نشان داده شده کلیک کن و کدهای نشان داده شده درکادر قرمز (در پست بالا نوشتم) رو اضافه کن

144981

حالا مطابق تصویر زیر در بخش Solution روی پروژه راست کلیک کن و پس از Built کردن پروژه، دکمه سفارشی شما همانند تصویر در سمت چپ و در ToolBox اضافه شده است. بکشید و روی فرم رها کنید و مانند یک دکمه ازش استفاده کنید

144982

درست شد؟

negar.rafie
سه شنبه 29 فروردین 1396, 03:33 صبح
ساختم و ساخته شد
ولی بازم همون مشکل موجود بودن بوردر در بالا و راست اینجا هم هست
ولی انگار مال شما نداره
مشکل کجاست؟

mmbguide
سه شنبه 29 فروردین 1396, 11:01 صبح
فایلی رو که کار کردی زیپ کن برام بفرست

negar.rafie
سه شنبه 29 فروردین 1396, 16:15 عصر
اینم سورس
خواهشا کمک کنید
خیلی کارم گیر کرده

mmbguide
سه شنبه 29 فروردین 1396, 19:17 عصر
مشکل کارت در استفاده از دستور newRectangle.Inflate است. شما دوبار در برنامه ای که ساختی استفاده کردی بار اول اعداد داخلش 2 (مثبت = افزایش) هستش و خط بعدی -3 (منفی = کاهش). اما میزان کاهش کم هستش

نمونه کدهای من در بالا فقط -2 داشت. شما باید از یک عدد منفی استفاده کنید تا مرز دایر از محیط دکمه کمی کوچکتر بشه. پس تنها یکبار از newRectangle.Inflate و با مقدار منفی استفاده کن و نتیجه را بگو

mmbguide
سه شنبه 29 فروردین 1396, 19:20 عصر
نتیجه اصلاح فایل خودتون

144997

negar.rafie
سه شنبه 29 فروردین 1396, 22:24 عصر
ممنون
شد
حالا ی سوال
چطور میتونیم از حالت فلت درش بیاریم؟
یعنی یکم دکمه برجسته بشه و از از حالت لیبل بودن خارج بشه

mmbguide
سه شنبه 29 فروردین 1396, 23:28 عصر
واسه این کار میتونی با استفاده از مباحث گرافیک در دات نت زمینه های متفاوت که به ظاهر برجسته دیده میشند را برای خودت ایجاد کنی و یا یک تصویر رو در ناحیه دایره ای شکل که بوجود آوردی رسم کنی و البته میتونی انتخاب تصور رو بصورت یک Property در کنترلی که درست کردی قرار بدی تا براحتی در زمان کار با این دکمه یک تصویر دلخواه برای خودت انتخاب کنی.

البته اگر دنبال دردسر کمتر می گردی میتونی به کدهای بالا در رویداد OnPaint یک دایره رسم کنی که اطراف دکمه یک خط وجود داشته باشه مثل تصویر زیر : (پیشنهاد میکنم تمام مواردی که به دکمه داری اضافه میکنی رو بصورت Property در اختیار End User قرار بده)

144999

mmbguide
سه شنبه 29 فروردین 1396, 23:31 عصر
البته اگر کمی حوصله کنی میتونی برای حالت های MouseOver, MouseClick و حالت نرمال دکمه یک رنگ در نظر بگیری

negar.rafie
چهارشنبه 30 فروردین 1396, 11:43 صبح
ممنون
اگر وقت دارید میشه کدشو بنویسید؟
چون من زیاد با موارد گرافیکی اشنا نیستم
اگر هم که نه
ممنون از راهنمایی هایی که انجام دادید

mmbguide
چهارشنبه 30 فروردین 1396, 18:35 عصر
برای دایره اطراف دکمه یکی دو روز دیگه میتونم کاری کنم ولی بحث کار با رنگ ها و گرادیان های رنگ به لحاظ اینکه خیلی سلیقه ای هستش باید خودتون زحمت بکشید. البته کدهای آماده زیادی میتونید در اینترنت پیدا کنید...

negar.rafie
جمعه 01 اردیبهشت 1396, 23:17 عصر
سلام
برای خط دور دکمه تونستید کاری کنید؟

Mahmoud.Afrad
جمعه 01 اردیبهشت 1396, 23:54 عصر
نمونه زیر رو ببینید.
برای border یک دایره معمولی باید رسم کنید البته در هر رویداد میتونید رنگ و اندازه رو تغییر بدید.
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Windows.Forms;

public class RoundedButton : Button
{
enum ButtonState
{
Normal,
MouseEnter,
GotFocus,
Pushed
}

private ButtonState _state;
private ushort _borderWidth;
private Color _backColorMouseEnterState;
private Color _borderColorNormalState;
private Color _borderColorGotFocusState;
private Color _backColorDisableState;
private Color _backColorPushedState;

public sealed override Color BackColor
{
get { return base.BackColor; }
set { base.BackColor = value; }
}

public Color BackColorMouseEnterState
{
get { return _backColorMouseEnterState; }
set { _backColorMouseEnterState = value; }
}

public Color BorderColorNormalState
{
get { return _borderColorNormalState; }
set
{
if (_borderColorNormalState != value)
{
_borderColorNormalState = value;
Invalidate();
}
}
}

public Color BorderColorGotFocusState
{
get { return _borderColorGotFocusState; }
set { _borderColorGotFocusState = value; }
}

public Color BackColorDisableState
{
get { return _backColorDisableState; }
set { _backColorDisableState = value; }
}

public Color BackColorPushedState
{
get { return _backColorPushedState; }
set { _backColorPushedState = value; }
}

public ushort BorderWidth
{
get { return _borderWidth; }
set
{
if (_borderWidth != value)
{
_borderWidth = value;
Invalidate();
}
}
}

public RoundedButton()
{
BackColor = Color.FromArgb(125, 192, 255);
BackColorMouseEnterState = Color.FromArgb(180, 219, 255);
BackColorPushedState = Color.FromArgb(64, 162, 255);
BackColorDisableState = Color.FromArgb(214, 214, 214);

BorderWidth = 5;
BorderColorNormalState = Color.FromArgb(47, 154, 255);
BorderColorGotFocusState = Color.FromArgb(0, 121, 235);
}

protected override void OnGotFocus(EventArgs e)
{
_state = ButtonState.GotFocus;
base.OnGotFocus(e);
}

protected override void OnLostFocus(EventArgs e)
{
_state = ButtonState.Normal;
base.OnLostFocus(e);
}

protected override void OnMouseEnter(EventArgs e)
{
_state = ButtonState.MouseEnter;
base.OnMouseEnter(e);
}

protected override void OnMouseLeave(EventArgs e)
{
_state = ButtonState.Normal;
base.OnMouseLeave(e);
}

protected override void OnMouseDown(MouseEventArgs mevent)
{
if (mevent.Button == MouseButtons.Left)
{
_state = ButtonState.Pushed;
}
base.OnMouseDown(mevent);
}

protected override void OnMouseUp(MouseEventArgs mevent)
{
if (mevent.Button == MouseButtons.Left)
{
_state = ButtonState.MouseEnter;
}
base.OnMouseUp(mevent);
}

protected override void OnKeyDown(KeyEventArgs kevent)
{
if (kevent.KeyCode == Keys.Space)
{
_state = ButtonState.Pushed;
}
base.OnKeyDown(kevent);
}

protected override void OnKeyUp(KeyEventArgs kevent)
{
if (kevent.KeyCode == Keys.Space)
{
_state = ButtonState.GotFocus;
}
base.OnKeyUp(kevent);
}

protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
e.Graphics.InterpolationMode = InterpolationMode.High;
e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

using (GraphicsPath path = new GraphicsPath())
{
path.AddEllipse(0, 0, Width, Height);
DrawBackground(e.Graphics, path);
DrawBorder(e.Graphics, path);
DrawText(e.Graphics);
}
}

private void DrawText(Graphics g)
{
using (StringFormat stringFormat = new StringFormat())
{
stringFormat.Alignment = StringAlignment.Center;
stringFormat.LineAlignment = StringAlignment.Center;
g.DrawString(Text, Font, new SolidBrush(ForeColor), this.ClientRectangle , stringFormat);
}
}

private void DrawBorder(Graphics g, GraphicsPath path)
{
using (Pen pen = _state == ButtonState.GotFocus ? new Pen(BorderColorGotFocusState, BorderWidth) : new Pen(BorderColorNormalState, BorderWidth))
{
g.DrawPath(pen, path);
}
}

private void DrawBackground(Graphics g, GraphicsPath path)
{
Region = new Region(path);
Color backColorToDraw =
_state == ButtonState.MouseEnter
? BackColorMouseEnterState
: (Enabled
? BackColor
: BackColorDisableState);
g.FillRegion(new SolidBrush(backColorToDraw), Region);
}
}