了解概念的示例图片
我正在尝试创建一个程序,允许用户输入行的开头和结尾的值,然后将其显示在图片框上。
我坚持逻辑。 目前我正在尝试将两个值从文本框传递到两个单独的函数然后传递到一个按钮,该按钮将显示行输出到图片框但已达到稳定状态
public partial class Form1 : Form
{
// Content item for the combo box
class Item
{
public string Name;
public int Value;
public Item(string name, int value)
{
Name = name; Value = value;
}
public override string ToString()
{
// Generates the text shown in the combo box
return Name;
}
}
public Form1()
{
InitializeComponent();
// Put some stuff in the combo box
shapelist.Items.Add(new Item("Line", 1));
shapelist.Items.Add(new Item("Rectangle", 2));
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// Display the Value property
Item itm = (Item)shapelist.SelectedItem;
Console.WriteLine("{0}, {1}", itm.Name, itm.Value);
}
public void readend()
{
int val = 0;
if (Int32.TryParse(txtEnd.Text, out val))
{
//parse was successful
}
else
{
MessageBox.Show("Input string cannot be parsed to an integer");
}
}
public void readstart()
{
int val = 0;
if (Int32.TryParse(txtstart.Text, out val))
{
//parse was successful
}
else
{
MessageBox.Show("Input string cannot be parsed to an integer");
}
}
答案 0 :(得分:0)
让我帮助你。
少数事情:
1.您不需要这些功能来实现最终目标:comboBox1_SelectedIndexChanged
,readstart
和readend
;也许是为了您的理解和调试。
1.我将在您的设置中再添加一个按钮并将其命名为“清除”,以清除图形,仅用于演示。
1. Item
你不需要一个完整的课程。只需使用enum
有了这些东西,下面的代码可以帮助你
public partial class Form1 : Form {
bool setToPaint = false;
int startVal, endVal;
ArtifactType selectedArtifact;
public Form1() {
InitializeComponent();
shapelist.Items.AddRange(Enum.GetValues(typeof运算(ArtifactType))OfType()ToArray的()); shapelist.SelectedIndex = 0;
pictureBox1.Paint += PictureBox1_Paint;
}
private void PictureBox1_Paint(object sender, PaintEventArgs e) {
if (setToPaint) {
if (selectedArtifact == ArtifactType.Line)
e.Graphics.DrawLine(Pens.Black, startVal, 100, endVal, 100);
else if (selectedArtifact == ArtifactType.Rectangle)
e.Graphics.DrawRectangle(Pens.Black, startVal, startVal, endVal - startVal, 100);
}
}
private void Draw_Click(object sender, EventArgs e) {
int.TryParse(txtStart.Text, out startVal);
int.TryParse(txtEnd.Text, out endVal);
selectedArtifact = (ArtifactType)shapelist.SelectedItem;
setToPaint = true;
pictureBox1.Invalidate();
}
private void Clear_Click(object sender, EventArgs e) {
setToPaint = false;
pictureBox1.Invalidate();
}
}
enum ArtifactType { None, Line, Rectangle }
<强>解释强>:
Draw
时,您希望捕获控件的输入并进行一些验证等。这些捕获的输入需要存储到某些成员变量中。Paint
的{{1}}事件。这是你真正绘制形状的地方。PictureBox
,然后转到Draw按钮单击处理程序。前3行将输入捕获到私有变量中。这是您可能需要验证并在失败时挽救的地方。一切都有效后,我们Paint
。这是我们用来确保仅根据要求绘制形状的标志。一旦我们点击清除,该标志将被还原。启用标志后,我们必须强制控件重新绘制其表面,因此将渲染绘制逻辑。这是通过setToPaint = true
调用pictureBox1.Invalidate()
标记和setToPaint
图片框,以便系统再次渲染它,这次它将跳过绘制我们的形状。Invalidate
处理程序中,我们所有的代码都在标志内。这就是我们如何将渲染与标志相关联。在PictureBox.Paint
内部,我们只需根据捕获的私有变量绘制我们想要的形状。您应该确保为此图形创建请求的if
(宽度和颜色),并将Pen
和start
值适当地链接到形状希望这可以帮助您了解这是如何完成的