c# bringtofront() and senttoback() not working - c#

I am new to c# and I'm trying to understand z-index concept. So far I have a simple form created using ConsoleApplication project in visual studio. There are 3 cs files. Here's the code:
In Algorithm.cs (inherited from UI.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
public class Algorithm : UI
{
private Timer refresh = new Timer();
//Ball settings
private const int offset = 25;
private const int rate = 200;
private int ball_bounding_box_x_coord;
private int ball_bounding_box_y_coord;
private int x;
private int y;
private const int width = 50;
private const int height = 50;
Brush brush = new SolidBrush(Color.Blue);
public bool isStartClicked = false;
Button test = new Button();
public Algorithm()
{
test.Text = "test";
test.Location = new Point(0, 800);
test.Size = new Size(100, 50);
test.TabIndex = 0;
bottom.Controls.Add(test);
test.BringToFront();
ball_bounding_box_x_coord = middle.Size.Width / 2 - width / 2;
ball_bounding_box_y_coord = middle.Size.Height / 2 - height / 2;
middle.Paint += new PaintEventHandler(Draw);
start.Click += new EventHandler(Start);
}
private void Calculate()
{
Graphics g = middle.CreateGraphics();
//g.FillEllipse(brush, )
}
private void Draw(object sender, PaintEventArgs e)
{
e.Graphics.FillEllipse(brush, ball_bounding_box_x_coord , ball_bounding_box_y_coord , width, height);
}
public void Start(object sender, EventArgs e)
{
MessageBox.Show("Button clicked");
}
}
In UI.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing;
public class UI : Form
{
//Window settings
private const int WINDOW_WIDTH = 1600;
private const int WINDOW_HEIGHT = 900;
private Panel top = new Panel();
public Panel middle = new Panel();
public Panel bottom = new Panel();
private Label title = new Label();
//Text box for degree input
private Label degree_input_label = new Label();
private TextBox degree_input = new TextBox();
public double input;
//Label to display x and y coordinates of the ball
public Label ball_x_coord = new Label();
public Label ball_y_coord = new Label();
//Buttons
public Button start = new Button();
private Button quit = new Button();
public UI()
{
//total height of 3 areas != window_height????????????????
//Setup window form
this.Width = WINDOW_WIDTH;
this.Height = WINDOW_HEIGHT;
this.Text = "Project 2";
//Add a badass title
title.Text = "Designed by Me";
title.AutoSize = true;
title.Location = new Point(600, 20);
title.Font = new Font(title.Font.Name, 24, FontStyle.Bold);
title.BackColor = Color.Red;
Controls.Add(title);
top.Location = new Point(0, 0);
top.Size = new Size(WINDOW_WIDTH, 80);
top.BackColor = Color.Red;
middle.Location = new Point(0, top.Location.Y + top.Size.Height);
middle.Size = new Size(WINDOW_WIDTH, 680);
middle.BackColor = Color.Cyan;
bottom.Location = new Point(0, top.Location.Y + top.Size.Height + middle.Size.Height);
bottom.Size = new Size(WINDOW_WIDTH, WINDOW_HEIGHT - top.Height - middle.Height);
bottom.BackColor = Color.Green;
degree_input_label.Text = "Enter a degree:";
degree_input_label.Location = new Point(100, bottom.Location.Y + 20);
degree_input_label.AutoSize = true;
Controls.Add(degree_input_label);
degree_input.Size = new Size(50, 50);
degree_input.Location = new Point(200, bottom.Location.Y + 20);
degree_input.Leave += new EventHandler(TextChange);
degree_input.TabIndex = 2;
Controls.Add(degree_input);
ball_x_coord.Text = "Ball X Coord";
ball_x_coord.Location = new Point(400, bottom.Location.Y + 20);
ball_x_coord.AutoSize = true;
Controls.Add(ball_x_coord);
ball_y_coord.Text = "Ball y coord";
ball_y_coord.Location = new Point(500, bottom.Location.Y + 20);
ball_y_coord.AutoSize = true;
Controls.Add(ball_y_coord);
start.Text = "Start";
start.Location = new Point(1100, bottom.Location.Y + 20);
start.Size = new Size(100, 50);
start.TabIndex = 1;
Controls.Add(start);
quit.Text = "Quit";
quit.Location = new Point(1400, bottom.Location.Y + 20);
quit.Size = new Size(100, 50);
quit.Click += new EventHandler(Quit);
Controls.Add(quit);
//ADD BACKGROUND CONTROLS
Controls.Add(top);
Controls.Add(middle);
Controls.Add(bottom);
}//end constructor
private void TextChange(object sender, EventArgs e)
{
if(degree_input.TextLength <= 0)
{
degree_input.Text = "0";
MessageBox.Show("Please enter a degree");
degree_input.Focus();
}else
{
input = double.Parse(degree_input.Text);
//MessageBox.Show(input.ToString());
}
}
void Quit(object sender, EventArgs e)
{
Application.Exit();
}
}
In Main.cs:
class Program
{
static void Main(string[] args)
{
Algorithm al = new Algorithm();
UI a = new UI();
//Application.Run(a);
Application.Run(al);
}
}
The problem I'm having is that the test button is not visible. If i remove the bottom panel and add the test button directly on the form then it is visible. Why doesn't it appear on the bottom panel even after I used bringtofront() ?

Why doesn't it appear on the bottom panel even after I used bringtofront() ?
Because you've placed it outside the visual boundary of the panel:
test.Location = new Point(0, 800);
That sets the position of the button to a horizontal offset of 0 and a vertical offset of 800. The bottom panel is only 140 pixels high, so 800 is well below the bottom of the visible area.
It's not really clear what you meant to do. Given that the window width is 1600 pixels and 800 is half that, maybe you just transposed the X and Y coordinates and meant this instead:
test.Location = new Point(800, 0);
That would place the button in the middle of the panel, aligned to the top.
Other than that, I can't imagine why if you wanted the button to be visible, you would hard-code a location for it that is not in a visible area.

Related

Windows forms - The name "dataGridView2" doesn't exist in this context

The problem is "The name "dataGridView2" doesn't exist in this context.". It only appears at the final parts of the code. Placing the object creation outside of public void menuItem1_Click fixes the problem, but then it only creates one object, I need it to create an object every time a button is pressed.
Here is the code from Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Kalkulator_Matrica
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int brojMatrice = 1;
public int dataGridCreator = 0;
public void menuItem1_Click(object sender, EventArgs e)
{
// opens form2 with new matrix
Form2 novaMatrica = new Form2();
using (var form = new Form2())
{
var result = form.ShowDialog();
if (result == DialogResult.OK)
{
int column = form.ReturnValue1;
int row = form.ReturnValue2;
//Create tab
TabPage tpage = new TabPage("Matrica " + brojMatrice);
tabControl1.TabPages.Add(tpage);
//Create data grid
DataGridView dataGridView2 = new DataGridView();
dataGridView2.ClientSize = new Size(553, 350);
dataGridView2.AllowUserToAddRows = false;
dataGridView2.AllowUserToResizeColumns = false;
dataGridView2.AllowUserToResizeRows = false;
dataGridView2.ColumnHeadersVisible = false;
dataGridView2.RowHeadersVisible = false;
dataGridView2.ColumnCount = column;
dataGridView2.RowCount = row;
this.AutoSize = true;
tpage.Controls.Add(dataGridView2); //Add grid to tab
//Create matrix name label
Label imeMatrice = new Label();
imeMatrice.Location = new Point(620, 10);
imeMatrice.Size = new Size(100, 20);
imeMatrice.Font = new Font("Microsoft Sans Serif", 15);
imeMatrice.Text = "Matrica " + brojMatrice;
tpage.Controls.Add(imeMatrice);
//Create matrix data label
Label dataMatrice = new Label();
dataMatrice.Location = new Point(637, 35);
dataMatrice.Size = new Size(100, 20);
dataMatrice.Font = new Font("Microsoft Sans Serif", 15);
dataMatrice.Text = dataGridView2.RowCount + " x " + dataGridView2.ColumnCount;
tpage.Controls.Add(dataMatrice);
//Povecamo counter za imena matrica
brojMatrice += 1;
//Create button ADD ROW
Button addRow = new Button();
addRow.Location = new Point(557, 70);
addRow.Size = new Size(107, 40);
addRow.Text = "Dodaj redak";
addRow.Click += new EventHandler(addRowClick);
tpage.Controls.Add(addRow);
//Create button REMOVE ROW
Button removeRow = new Button();
removeRow.Location = new Point(663, 70);
removeRow.Size = new Size(107, 40);
removeRow.Text = "Izbrisi redak";
removeRow.Click += new EventHandler(removeRowClick);
tpage.Controls.Add(removeRow);
//Create button ADD COLUMN
Button addColumn = new Button();
addColumn.Location = new Point(557, 110);
addColumn.Size = new Size(107, 40);
addColumn.Text = "Dodaj stupac";
addColumn.Click += new EventHandler(addColumnClick);
tpage.Controls.Add(addColumn);
//Create button REMOVE COLUMN
Button removeColumn = new Button();
removeColumn.Location = new Point(663, 110);
removeColumn.Size = new Size(107, 40);
removeColumn.Text = "Izbrisi stupac";
removeColumn.Click += new EventHandler(removeColumnClick);
tpage.Controls.Add(removeColumn);
//Sets widght of all columns
for (int i = 0; i < column; i = i + 1)
{
dataGridView2.Columns[i].Width = 25;
}
dataGridCreator = dataGridCreator + 1;
}
}
}
private void addRowClick(object sender, EventArgs e)
{
dataGridView2.RowCount = dataGridView2.RowCount + 1;
}
private void removeRowClick(object sender, EventArgs e)
{
if (dataGridView2.RowCount > 1) {
dataGridView2.RowCount = dataGridView2.RowCount - 1;
}
}
private void addColumnClick(object sender, EventArgs e)
{
dataGridView2.ColumnCount = dataGridView2.ColumnCount + 1;
for (int i = 0; i < dataGridView2.ColumnCount; i = i + 1)
{
dataGridView2.Columns[i].Width = 25;
}
}
private void removeColumnClick(object sender, EventArgs e)
{
if (dataGridView2.ColumnCount > 1)
{
dataGridView2.ColumnCount = dataGridView2.ColumnCount - 1;
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Use like below, it will create new object every time but name of the variable will be same through out the code and it accessible in the context as well.
int brojMatrice = 1;
public int dataGridCreator = 0;
DataGridView dataGridView2;
public void menuItem1_Click(object sender, EventArgs e)
{
//Create data grid
dataGridView2 = new DataGridView();
}

Using C# paint lines that span all monitors

I have a multi monitor setup and I want to paint a vertical and horizontal line as the user moves their cursor. The lines I want to paint should span all monitors. I'm not entirely sure how to adjust my form to make this possible since when i make it full screen it only maximizes to one monitor.
Do i have to make a form per monitor and send signals to each one when the cursor moves for it to repaint the line?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace fitAllScreens
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
FullScreen();
}
public void FullScreen()
{
List<int> xBounds = new List<int>() {};
List<int> yBounds = new List<int>() {};
foreach (Screen screen in Screen.AllScreens)
{
var bounds = screen.Bounds;
xBounds.Add(bounds.X);
xBounds.Add(bounds.Right);
yBounds.Add(bounds.Y);
yBounds.Add(bounds.Bottom);
}
int minX = xBounds.Min();
int maxX = xBounds.Max();
int minY = yBounds.Min();
int maxY = yBounds.Max();
Console.WriteLine(minX + " - " + maxX + " - " + minY + " - " + maxY);
}
protected override void OnMouseMove(MouseEventArgs e)
{
base.OnMouseMove(e);
Invalidate();
}
protected override void OnPaint(PaintEventArgs e)
{
var graphics = e.Graphics;
base.OnPaint(e);
// Draw ruler guides
Console.WriteLine(Cursor.Position);
var pos = this.PointToClient(Cursor.Position);
using (var pen = new Pen(Color.Red))
{
pen.DashStyle = DashStyle.Dot;
var screenBounds = Screen.PrimaryScreen.Bounds;
graphics.DrawLine(pen, pos.X, screenBounds.Y, pos.X, screenBounds.Height);
graphics.DrawLine(pen, screenBounds.X, pos.Y, screenBounds.Width, pos.Y);
}
}
}
}
I edited your code so it can fit all screens (I test it on 2 screens and it worked well).
public partial class Form1 : Form
{
int minX;
int maxX;
int minY;
int maxY;
public Form1()
{
InitializeComponent();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.FormBorderStyle = FormBorderStyle.None;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.DoubleBuffered = true;
FullScreen();
CreateCloseButtons();
}
private void CloseButtons_Click(object sender, EventArgs e)
{
Application.Exit();
}
public void FullScreen()
{
List<int> xBounds = new List<int>() { };
List<int> yBounds = new List<int>() { };
foreach (Screen screen in Screen.AllScreens)
{
var bounds = screen.WorkingArea;
xBounds.Add(bounds.X);
xBounds.Add(bounds.Right);
yBounds.Add(bounds.Y);
yBounds.Add(bounds.Bottom);
}
minX = xBounds.Min();
maxX = xBounds.Max();
minY = yBounds.Min();
maxY = yBounds.Max();
this.Location = new Point(minX, minY);
//this.Location = this.PointToClient(new Point(minX, minY));
this.Size = new Size(maxX - minX, maxY - minY);
}
protected override void OnMouseMove(MouseEventArgs e)
{
Console.WriteLine(this.Location.X + " - " + this.Location.Y);
Console.WriteLine(this.Size.Width + " - " + this.Location.Y);
base.OnMouseMove(e);
Invalidate(false);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var pos = this.PointToClient(Cursor.Position);
using (var pen = new Pen(Color.Red))
{
pen.Width = 2;
pen.DashStyle = DashStyle.Dot;
e.Graphics.DrawLine(pen, pos.X, minY, pos.X, this.Height);
e.Graphics.DrawLine(pen, minX, pos.Y, this.Width, pos.Y);
}
}
private void CreateCloseButtons()
{
Button button1 = new System.Windows.Forms.Button();
Button button2 = new System.Windows.Forms.Button();
Button button3 = new System.Windows.Forms.Button();
Button button4 = new System.Windows.Forms.Button();
button1.Click += CloseButtons_Click;
button2.Click += CloseButtons_Click;
button3.Click += CloseButtons_Click;
button4.Click += CloseButtons_Click;
//
// top right
//
button1.BackColor = System.Drawing.Color.Red;
button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
button1.ForeColor = System.Drawing.SystemColors.ButtonFace;
button1.Location = new System.Drawing.Point(0, 0);
button1.Name = "button1";
button1.Size = new System.Drawing.Size(21, 23);
button1.TabIndex = 0;
button1.Text = "X";
button1.UseVisualStyleBackColor = false;
//
// bottom left
//
button2.BackColor = System.Drawing.Color.Red;
button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
button2.ForeColor = System.Drawing.SystemColors.ButtonFace;
button2.Location = new System.Drawing.Point(0, this.Height - 23);
button2.Name = "button2";
button2.Size = new System.Drawing.Size(21, 23);
button2.TabIndex = 1;
button2.Text = "X";
button2.UseVisualStyleBackColor = false;
button2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
//
// bottom right
//
button3.BackColor = System.Drawing.Color.Red;
button3.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
button3.ForeColor = System.Drawing.SystemColors.ButtonFace;
button3.Location = new System.Drawing.Point(this.Width - 21, this.Height - 23);
button3.Name = "button3";
button3.Size = new System.Drawing.Size(21, 23);
button3.TabIndex = 2;
button3.Text = "X";
button3.UseVisualStyleBackColor = false;
button3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
//
// top right
//
button4.BackColor = System.Drawing.Color.Red;
button4.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
button4.ForeColor = System.Drawing.SystemColors.ButtonFace;
button4.Location = new System.Drawing.Point(this.Width - 21, 0);
button4.Name = "button4";
button4.Size = new System.Drawing.Size(21, 23);
button4.TabIndex = 3;
button4.Text = "X";
button4.UseVisualStyleBackColor = false;
button4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.Controls.Add(button4);
this.Controls.Add(button3);
this.Controls.Add(button2);
this.Controls.Add(button1);
}
}

Custom MessageBox with custom-defined Buttons [duplicate]

I am doing C# application, and I want to change the style of a message box. Is it possible or not?
Example: change button style, fore color, etc.
You can't restyle the default MessageBox as that's dependant on the current Windows OS theme, however you can easily create your own MessageBox. Just add a new form (i.e. MyNewMessageBox) to your project with these settings:
FormBorderStyle FixedToolWindow
ShowInTaskBar False
StartPosition CenterScreen
To show it use myNewMessageBoxInstance.ShowDialog();. And add a label and buttons to your form, such as OK and Cancel and set their DialogResults appropriately, i.e. add a button to MyNewMessageBox and call it btnOK. Set the DialogResult property in the property window to DialogResult.OK. When that button is pressed it would return the OK result:
MyNewMessageBox myNewMessageBoxInstance = new MyNewMessageBox();
DialogResult result = myNewMessageBoxInstance.ShowDialog();
if (result == DialogResult.OK)
{
// etc
}
It would be advisable to add your own Show method that takes the text and other options you require:
public DialogResult Show(string text, Color foreColour)
{
lblText.Text = text;
lblText.ForeColor = foreColour;
return this.ShowDialog();
}
MessageBox::Show uses function from user32.dll, and its style is dependent on Windows, so you cannot change it like that, you have to create your own form
Here is the code needed to create your own message box:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyStuff
{
public class MyLabel : Label
{
public static Label Set(string Text = "", Font Font = null, Color ForeColor = new Color(), Color BackColor = new Color())
{
Label l = new Label();
l.Text = Text;
l.Font = (Font == null) ? new Font("Calibri", 12) : Font;
l.ForeColor = (ForeColor == new Color()) ? Color.Black : ForeColor;
l.BackColor = (BackColor == new Color()) ? SystemColors.Control : BackColor;
l.AutoSize = true;
return l;
}
}
public class MyButton : Button
{
public static Button Set(string Text = "", int Width = 102, int Height = 30, Font Font = null, Color ForeColor = new Color(), Color BackColor = new Color())
{
Button b = new Button();
b.Text = Text;
b.Width = Width;
b.Height = Height;
b.Font = (Font == null) ? new Font("Calibri", 12) : Font;
b.ForeColor = (ForeColor == new Color()) ? Color.Black : ForeColor;
b.BackColor = (BackColor == new Color()) ? SystemColors.Control : BackColor;
b.UseVisualStyleBackColor = (b.BackColor == SystemColors.Control);
return b;
}
}
public class MyImage : PictureBox
{
public static PictureBox Set(string ImagePath = null, int Width = 60, int Height = 60)
{
PictureBox i = new PictureBox();
if (ImagePath != null)
{
i.BackgroundImageLayout = ImageLayout.Zoom;
i.Location = new Point(9, 9);
i.Margin = new Padding(3, 3, 2, 3);
i.Size = new Size(Width, Height);
i.TabStop = false;
i.Visible = true;
i.BackgroundImage = Image.FromFile(ImagePath);
}
else
{
i.Visible = true;
i.Size = new Size(0, 0);
}
return i;
}
}
public partial class MyMessageBox : Form
{
private MyMessageBox()
{
this.panText = new FlowLayoutPanel();
this.panButtons = new FlowLayoutPanel();
this.SuspendLayout();
//
// panText
//
this.panText.Parent = this;
this.panText.AutoScroll = true;
this.panText.AutoSize = true;
this.panText.AutoSizeMode = AutoSizeMode.GrowAndShrink;
//this.panText.Location = new Point(90, 90);
this.panText.Margin = new Padding(0);
this.panText.MaximumSize = new Size(500, 300);
this.panText.MinimumSize = new Size(108, 50);
this.panText.Size = new Size(108, 50);
//
// panButtons
//
this.panButtons.AutoSize = true;
this.panButtons.AutoSizeMode = AutoSizeMode.GrowAndShrink;
this.panButtons.FlowDirection = FlowDirection.RightToLeft;
this.panButtons.Location = new Point(89, 89);
this.panButtons.Margin = new Padding(0);
this.panButtons.MaximumSize = new Size(580, 150);
this.panButtons.MinimumSize = new Size(108, 0);
this.panButtons.Size = new Size(108, 35);
//
// MyMessageBox
//
this.AutoScaleDimensions = new SizeF(8F, 19F);
this.AutoScaleMode = AutoScaleMode.Font;
this.ClientSize = new Size(206, 133);
this.Controls.Add(this.panButtons);
this.Controls.Add(this.panText);
this.Font = new Font("Calibri", 12F, FontStyle.Regular, GraphicsUnit.Point, ((byte)(0)));
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.Margin = new Padding(4);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.MinimumSize = new Size(168, 132);
this.Name = "MyMessageBox";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = FormStartPosition.CenterScreen;
this.ResumeLayout(false);
this.PerformLayout();
}
public static string Show(Label Label, string Title = "", List<Button> Buttons = null, PictureBox Image = null)
{
List<Label> Labels = new List<Label>();
Labels.Add(Label);
return Show(Labels, Title, Buttons, Image);
}
public static string Show(string Label, string Title = "", List<Button> Buttons = null, PictureBox Image = null)
{
List<Label> Labels = new List<Label>();
Labels.Add(MyLabel.Set(Label));
return Show(Labels, Title, Buttons, Image);
}
public static string Show(List<Label> Labels = null, string Title = "", List<Button> Buttons = null, PictureBox Image = null)
{
if (Labels == null) Labels = new List<Label>();
if (Labels.Count == 0) Labels.Add(MyLabel.Set(""));
if (Buttons == null) Buttons = new List<Button>();
if (Buttons.Count == 0) Buttons.Add(MyButton.Set("OK"));
List<Button> buttons = new List<Button>(Buttons);
buttons.Reverse();
int ImageWidth = 0;
int ImageHeight = 0;
int LabelWidth = 0;
int LabelHeight = 0;
int ButtonWidth = 0;
int ButtonHeight = 0;
int TotalWidth = 0;
int TotalHeight = 0;
MyMessageBox mb = new MyMessageBox();
mb.Text = Title;
//Image
if (Image != null)
{
mb.Controls.Add(Image);
Image.MaximumSize = new Size(150, 300);
ImageWidth = Image.Width + Image.Margin.Horizontal;
ImageHeight = Image.Height + Image.Margin.Vertical;
}
//Labels
List<int> il = new List<int>();
mb.panText.Location = new Point(9 + ImageWidth, 9);
foreach (Label l in Labels)
{
mb.panText.Controls.Add(l);
l.Location = new Point(200, 50);
l.MaximumSize = new Size(480, 2000);
il.Add(l.Width);
}
int mw = Labels.Max(x => x.Width);
il.ToString();
Labels.ForEach(l => l.MinimumSize = new Size(Labels.Max(x => x.Width), 1));
mb.panText.Height = Labels.Sum(l => l.Height);
mb.panText.MinimumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), ImageHeight);
mb.panText.MaximumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), 300);
LabelWidth = mb.panText.Width;
LabelHeight = mb.panText.Height;
//Buttons
foreach (Button b in buttons)
{
mb.panButtons.Controls.Add(b);
b.Location = new Point(3, 3);
b.TabIndex = Buttons.FindIndex(i => i.Text == b.Text);
b.Click += new EventHandler(mb.Button_Click);
}
ButtonWidth = mb.panButtons.Width;
ButtonHeight = mb.panButtons.Height;
//Set Widths
if (ButtonWidth > ImageWidth + LabelWidth)
{
Labels.ForEach(l => l.MinimumSize = new Size(ButtonWidth - ImageWidth - mb.ScrollBarWidth(Labels), 1));
mb.panText.Height = Labels.Sum(l => l.Height);
mb.panText.MinimumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), ImageHeight);
mb.panText.MaximumSize = new Size(Labels.Max(x => x.Width) + mb.ScrollBarWidth(Labels), 300);
LabelWidth = mb.panText.Width;
LabelHeight = mb.panText.Height;
}
TotalWidth = ImageWidth + LabelWidth;
//Set Height
TotalHeight = LabelHeight + ButtonHeight;
mb.panButtons.Location = new Point(TotalWidth - ButtonWidth + 9, mb.panText.Location.Y + mb.panText.Height);
mb.Size = new Size(TotalWidth + 25, TotalHeight + 47);
mb.ShowDialog();
return mb.Result;
}
private FlowLayoutPanel panText;
private FlowLayoutPanel panButtons;
private int ScrollBarWidth(List<Label> Labels)
{
return (Labels.Sum(l => l.Height) > 300) ? 23 : 6;
}
private void Button_Click(object sender, EventArgs e)
{
Result = ((Button)sender).Text;
Close();
}
private string Result = "";
}
}

How do I properly add a custom control to another custom control so that it will render in a form?

I've created a custom control in C#. A highly-simplified version of it is shown below:
class WellControl : Control
{
Pen circlePen = new Pen(Color.Black, 5);
Brush wellShader = new SolidBrush(Color.BlueViolet);
Brush wellBlanker = new SolidBrush(Color.LightGray);
public WellControl(int wellNum)
{
InitializeComponent();
}
private void DrawWell()
{
using (Graphics well = this.CreateGraphics())
{
this.Size = new Size(WellSize, WellSize);
if (this.selected)
{
well.FillEllipse(wellShader, ellipseCoords);
}
else
{
well.FillEllipse(wellBlanker, ellipseCoords);
}
well.DrawEllipse(circlePen, ellipseCoords);
using (Font wellNumberFont = new Font("Arial", 14, FontStyle.Bold))
{
well.DrawString(WellNum.ToString(), wellNumberFont, Brushes.Black, new Point(13, 13));
}
}
}
private void WellPaintEventHandler(object sender, EventArgs e)
{
DrawWell();
}
private void InitializeComponent()
{
this.SuspendLayout();
this.Paint += new System.Windows.Forms.PaintEventHandler(WellPaintEventHandler);
this.ResumeLayout();
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
//dispose all the custom stuff
}
}
}
When I add it to a form, it renders properly (again, simplified example):
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
for (int i = 0; i < 4; i++)
{
WellControl newWell = new WellControl(i + 1);
newWell.Location = new Point(15, 50 * i);
newWell.Size = new System.Drawing.Size(45, 45);
this.Controls.Add(newWell);
}
}
}
I have another custom control, "Plate", which is intended to hold many "Wells". The code intended to draw the wells evenly across the plate probably sucks right now but I'm just trying to see something:
class PlateControl : Control
{
Pen blackPen = new Pen(Color.Black, 3);
public PlateControl()
{
this.Size = new Size(600, 800);
List<WellControl> plateWells = new List<WellControl>();
int column = 1;
int row = 0;
for (int i = 1; i <= 96; i++)
{
column = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(i / 8)));
row = i % 8;
WellControl newWell = new WellControl(i + 1);
newWell.Name = "wellControl" + i;
newWell.Location = new Point(column * 50, row * 50);
newWell.Size = new System.Drawing.Size(45, 45);
newWell.TabIndex = i;
newWell.WellSize = 45;
plateWells.Add(newWell);
newWell.Visible = true;
}
InitializeComponent();
}
private void InitializeComponent()
{
this.SuspendLayout();
this.Paint += new System.Windows.Forms.PaintEventHandler(PlatePaintEventHandler);
this.ResumeLayout();
}
private void DrawPlate()
{
using (Graphics plate = this.CreateGraphics())
{
Point topLeft = new Point(0, 0);
Point topRight = new Point(600, 0);
Point bottomRight = new Point(600, 400);
Point bottomLeft = new Point(0, 400);
plate.DrawLine(blackPen, topLeft, topRight);
plate.DrawLine(blackPen, topRight, bottomRight);
plate.DrawLine(blackPen, bottomRight, bottomLeft);
plate.DrawLine(blackPen, bottomLeft, topLeft);
}
}
private void PlatePaintEventHandler(object sender, EventArgs e)
{
DrawPlate();
}
}
If I add this control to a Winform using this.Controls.Add(new PlateControl()), the rectangle renders, but not the WellControls I added to the PlateControl in the constructor loop. What am I doing incorrectly?
You need to add List of WallControl to plate control.
public PlateControl()
{
this.Size = new Size(600, 800);
List<WellControl> plateWells = new List<WellControl>();
int column = 1;
int row = 0;
for (int i = 1; i <= 96; i++)
{
column = Convert.ToInt32(Math.Ceiling(Convert.ToDecimal(i / 8)));
row = i % 8;
WellControl newWell = new WellControl(i + 1);
newWell.Name = "wellControl" + i;
newWell.Location = new Point(column * 50, row * 50);
newWell.Size = new System.Drawing.Size(45, 45);
newWell.TabIndex = i;
newWell.WellSize = 45;
plateWells.Add(newWell);
newWell.Visible = true;
}
this.Controls.AddRange(plateWells.ToArray());
InitializeComponent();
}

Centering OK button within a MessageBox in winforms

I am learning C#, and as a part of it I wrote small app that consists of form with two groups of buttons, two buttons each. Button for closing of app is added as well. And everything works ok. Also there is MessageBox, showing that the app is going to be closed. And here is little problem that bugs me: OK button within that MessageBox is NOT centered horizontally. I guess there is a method to align that button, but what puzzles me is why it's is not centered by default? As illustration here are screenshots:
Here is code as well:
using System;
using System.Drawing;
using System.Windows.Forms;
public class myForm : Form
{
private GroupBox gboxGrp1;
private GroupBox gboxGrp2;
private RadioButton butn1a;
private RadioButton butn1b;
private RadioButton butn2a;
private RadioButton butn2b;
private Button btnClose;
public myForm()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.btnClose = new Button();
this.gboxGrp1 = new GroupBox();
this.gboxGrp2 = new GroupBox();
this.butn1a = new RadioButton();
this.butn1b = new RadioButton();
this.butn2a = new RadioButton();
this.butn2b = new RadioButton();
//myForm
this.Text = "My Form";
this.StartPosition = FormStartPosition.CenterScreen;
this.Height = 350;
this.Width = 200;
//btnClose
this.Controls.Add(btnClose);
this.btnClose.Text = "Close";
this.btnClose.Location = new Point(60, 260);
this.btnClose.Click += new EventHandler(btnClose_Click);
//gboxgrp1
this.gboxGrp1.Location = new Point(20, 20);
this.gboxGrp1.Text = "Group Box 1";
this.gboxGrp1.Width = 150;
this.gboxGrp1.Height = 100;
//gboxgrp2
this.gboxGrp2.Text = "Group Box 2";
this.gboxGrp2.Location = new Point(20, 130);
this.gboxGrp2.Width = 150;
this.gboxGrp2.Height = 100;
//Radio buttons
this.butn1a.Text = "Radio 1a";
this.butn1a.Location = new Point(30, 30);
this.butn1a.Size = new Size(90, 15);
this.butn1b.Text = "Radio 1b";
this.butn1b.Location = new Point(30, 60);
this.butn1b.Size = new Size(90, 15);
this.butn2a.Text = "Radio 2a";
this.butn2a.Location = new Point(30, 30);
this.butn2a.Size = new Size(90, 15);
this.butn2b.Text = "Radio 2b";
this.butn2b.Location = new Point(30, 70);
this.butn2b.Size = new Size(90, 15);
//Controls
this.Controls.Add(gboxGrp1);
this.Controls.Add(gboxGrp2);
this.gboxGrp1.Controls.Add(butn1a);
this.gboxGrp1.Controls.Add(butn1b);
this.gboxGrp2.Controls.Add(butn2a);
this.gboxGrp2.Controls.Add(butn2b);
}
private void btnClose_Click(object sender, EventArgs e)
{
MessageBox.Show("Closing Application");
Application.Exit();
}
}
public class MyApp
{
public static void Main()
{
Application.Run(new myForm());
}
}
You can't restyle the default MessageBox as that's completely depends on the windows OS theme. However you could create your own message box by simply creating a new form and then call it by using newMessagebox.ShowDialog();

Categories