C# 輸入兩點並劃出直線(X、Y只顯示-10~10) for 大偉
使用者輸入兩點座標,並畫出直線(X、Y只顯示-10~10)。
執行結果。
參考答案。
專案下載位置:檔案名稱為CSharp_DrawLine
執行結果。
參考答案。
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 CSharp_DrawLine
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//----textbox事件----
foreach (Control ctrl in Controls)
{
if (ctrl.GetType().Name == "TextBox")
{
ctrl.Enter += TextBox_Enter;
ctrl.MouseClick += TextBox_Enter;
}
}
}
//----選到textbox時,選取全部文字
private void TextBox_Enter(object sender, EventArgs e)
{
TextBox tb = sender as TextBox;
tb.SelectAll();
}
float x0, x1, y0, y1;
float ratio_x, ratio_y;
float wid, hei;
Bitmap bmp;
Graphics g;
Pen pen;
SolidBrush brush;
private void draw_btn_Click(object sender, EventArgs e)
{
try
{
//----畫筆顏色----
pen = new Pen(Color.Black);
brush = new SolidBrush(pen.Color);
//----取得picturebox寬度與高度----
wid = pictureBox1.Width;
hei = pictureBox1.Height;
//----是否有上一次的圖片,如果有就清除----
if (pictureBox1.Image != null)
pictureBox1.Image = null;
if (bmp != null)
bmp.Dispose();
//----轉換使用者輸入的資料----
x0 = float.Parse(x0_tb.Text);
y0 = float.Parse(y0_tb.Text);
x1 = float.Parse(x1_tb.Text);
y1 = float.Parse(y1_tb.Text);
//----計算放大倍率----
ratio_x = (wid - 50) / 20;
ratio_y = (hei - 50) / 20;
//----開新的Bitmap----
bmp = new Bitmap((int)wid, (int)hei);
//----使用上面的Bitmap畫圖----
g = Graphics.FromImage(bmp);
//----清除Bitmap為某顏色----
g.Clear(Color.White);
//----更改原點位置----
g.TranslateTransform(pictureBox1.Width / 2, pictureBox1.Height / 2);
//----畫坐標軸----
g.DrawLine(pen, -1000, 0, 1000, 0);//x軸
g.DrawLine(pen, 0, -1000, 0, 1000);//y軸
g.DrawString("X", this.Font, brush, wid / 2 - 20, 20);
g.DrawString("Y", this.Font, brush, 20, -hei / 2);
g.DrawLine(pen, wid / 2, 0, wid / 2 - 10, 5);//x軸箭頭
g.DrawLine(pen, wid / 2, 0, wid / 2 - 10, -5);
g.DrawLine(pen, 0, -hei / 2, 5, -hei / 2 + 10);//y軸箭頭
g.DrawLine(pen, 0, -hei / 2, -5, -hei / 2 + 10);
for (int i = -10; i <= 10; i++)//畫X Y軸座標位置
{
g.DrawLine(pen, i * ratio_x, -5, i * ratio_x, 5);
g.DrawString(i.ToString().PadLeft(2, ' '), this.Font, brush, i * ratio_x - 9, 10);
g.DrawLine(pen, -5, i * ratio_y, 5, i * ratio_y);
if (i != 0)
g.DrawString(i.ToString(), this.Font, brush, 15, i * ratio_y - 8);
}
//----換顏色----
pen = new Pen(Color.Red);
brush = new SolidBrush(pen.Color);
//----畫線----
g.DrawLine(pen, x0 * ratio_x, -y0 * ratio_y, x1 * ratio_x, -y1 * ratio_y);
//----畫兩點----
g.FillEllipse(brush, new RectangleF(x0 * ratio_x - 2.5f, -y0 * ratio_y - 2.5f, 5, 5));
g.FillEllipse(brush, new RectangleF(x1 * ratio_x - 2.5f, -y1 * ratio_y - 2.5f, 5, 5));
//----釋放Graphics資源----
g.Dispose();
//----將Bitmap顯示在Picture上
pictureBox1.Image = bmp;
}
catch (Exception x)
{
MessageBox.Show(x.Message);//錯誤視窗
}
finally
{
GC.Collect();//清除垃圾
}
}
}
}
專案下載位置:檔案名稱為CSharp_DrawLine

留言
張貼留言