How can I create button with solid border(3d), like picture below on C# winforms?
Panel <
If you don't care about how thick the border is, you can use the following code. (I choose my checkbox' appearance as button, and I like it raised when not checked and sunken when checked)
private void checkbox_paint(object sender, PaintEventArgs e)
{
CheckBox myCheckbox = (CheckBox)sender;
Rectangle borderRectangle = myCheckbox.ClientRectangle;
if (myCheckbox.Checked)
{
ControlPaint.DrawBorder3D(e.Graphics, borderRectangle,
Border3DStyle.Sunken);
}
else
{
ControlPaint.DrawBorder3D(e.Graphics, borderRectangle,
Border3DStyle.Raised);
}
}
Just in case you don't know how to use this code: All you need to do is choose your button/checkbox in your designer, then go to the Properties window and choose the Events tab (click the Thunderbolt). Find the event called Paint and type your event handler's name without the parenthesis in box next to it (such as checkbox_paint). In the code window that pops up afterwards fill in your code. Then you are all set.
You can customize the Button
control this way have thick 3d borders:
FlatStyle
to be Flat
FlatApperanace
set BorderSize
to 0
FlatApperanace
set MouseOverBackColor
to ControlLight
Then handle Paint
event and using ControlPaint.DrawBorder draw a thick 3d border:
private void button1_Paint(object sender, PaintEventArgs e)
{
ControlPaint.DrawBorder(e.Graphics, button1.ClientRectangle,
SystemColors.ControlLightLight, 5, ButtonBorderStyle.Outset,
SystemColors.ControlLightLight, 5, ButtonBorderStyle.Outset,
SystemColors.ControlLightLight, 5, ButtonBorderStyle.Outset,
SystemColors.ControlLightLight, 5, ButtonBorderStyle.Outset);
}
And here is the result:
Adding to Reza's post (thanks Reza!) ... you could get a bit fancier and invert the 3D effect when the button is down:
private bool blnButtonDown = false;
private void button_Paint(object sender, PaintEventArgs e)
{
if (blnButtonDown == false)
{
ControlPaint.DrawBorder(e.Graphics, (sender as System.Windows.Forms.Button).ClientRectangle,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Outset,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Outset,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Outset,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Outset);
}
else
{
ControlPaint.DrawBorder(e.Graphics, (sender as System.Windows.Forms.Button).ClientRectangle,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Inset,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Inset,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Inset,
System.Drawing.SystemColors.ControlLightLight, 2, ButtonBorderStyle.Inset);
}
}
private void button_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
blnButtonDown = true;
(sender as System.Windows.Forms.Button).Invalidate();
}
private void button_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
blnButtonDown = false;
(sender as System.Windows.Forms.Button).Invalidate();
}