B.Phần Trình bày I.Giới thiệu chương trình Chương trình của chúng tôi là một chương trình vẽ hình đơn giản tương tự như chương trình Paint của hệ điều hành window bao gồm nhiều chức năn
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
-@ -ĐỒ ÁN CUỐI KỲ MÔN:LẬP TRÌNH TRÊN WINDOW.
TÊN ĐỒ ÁN:CHƯƠNG TRÌNH PAINT
Giáo Viên hướng dẫn:Ngô Thanh Hùng
Trang 2Mục Lục
A.Mở đầu 3
B.Phần trình bày 3
I.Giới thiệu chương trình 3
II Cấu trúc chương trình 3
1.Các thành phần của chương trình .3
2.Chức năng của các thành phần chính 3
III.Giao diện chương trình 4
1.Form chính 4
2.Form Help 5
IV.Ý tưởng và code 5
1.Ý tưởng………5
2.Code(Class)……….5
a.khung.cs……… ……6
b.draw.cs………8
c.pen.cs………13
d.tool.cs………13
e.Property.cs………14
f.Help.cs (Class xử lí của form Help) ……… 16
g.SaveDraw.cs……….……….16
h.Form1.cs (class xử lí của form1) ……….17
V.Cách Sử dụng……… 50
1.Thao tác cơ bản (New ,Open,Save,Chọn công cụ )……… 50
2.Những thao tác vẻ hình……… 51
C.Kết luận ……… 52
Trang 3A.Mở đầu
Trong môn học lập trình C trên windows chúng tôi chon đề tài paint vì chúng tôi muốn viết chương trình chỉnh sửa ảnh với nhiều tính năng mới,giao diện đẹp,dễ sử dụng hơn so với các chương trình paint hiện tại.
B.Phần Trình bày
I.Giới thiệu chương trình
Chương trình của chúng tôi là một chương trình vẽ hình đơn giản tương tự như chương trình Paint của hệ điều hành window bao gồm nhiều chức năng ,như vẽ vecto,vẽ một số khối hình học đơn giản cắt hình vẽ text,xem ảnh và vẽ trên nền một bức ảnh có sẳn.
II Cấu trúc của chương trình
+New dùng để tạo một trang vẽ mới
+Open để mở một bức ảnh và làm việc trên bức ảnh đó
+Save và Save As dùng để lưu ra ảnh với định dạng mặc định và tùy chọn +Exit để thoát chương trình.
-Edit
+Undo dùng để quay lui lại bước xử lí trước
+Redo dùng để đảo ngược lại bước Undo
+Các Menu Zoom in,Zoom out,Zoom dùng để phóng to,thu nhỏ tùy ý
b.ToolStrip
+New
+Save
+Open
Trang 4-Cho phép trình diễn hình ảnh mà bạn lựa chọn
Ngoài ra,bạn còn sử dụng cái công cụ ở GroupBox Tool(Rắc màu,xóa,lấy màu, 1
số hình vẽ hình học cơ bản,…) Đồng thời bạn có thể lựa chọn màu sắc tùy ý bạn
ở GroupBox Color Để có được 1 hình ảnh mà bạn mong muốn
e.TextBox Sử dụng để nhập text cho công cụ vẻ text.
f.Statustrip nằm ở lề dưới của chương trình.Hiển thị kích thước hình đang vẻ,tọa độ chuột và trạng thái Zoom.
III.Giao diện chương trình
Chương trình được viết bằng ngôn ngữ C# trên môi trường Visual Studio 2008 Giao diện chương trình bao gồm 2 form,
1.Form chính tên là form1.Form1 bao gồm những thành phần sau:
Menu chứa các menu cho người dung thao tác như new,mơ
file,lưu file Zoom,Undo,Redo.
ToolStripMenu có tác dụng như menu nhưng hiển thị dưới dạng
Button cho người dùng dể sử dụng.
Vùng vẻ chính là nơi để thục hiện các thao tác vẻ
Toolbar chứa các công cụ vẻ như vẻ hình khối,vẻ text,cắt hình,lấy
màu
ColorBar dùng để chọn màu vẻ
PropertyGid hiển thị thông tin ảnh
Trang 5 StatusTrip hiển thị tọa độ chuột,kích thước vùng vẻ và trạng thái
Zoom
2.Form Help(vào menu Help>Information để hiển thị form help)
IV.Ý Tưởng Chính và Code
1.Ý tưởng
Đầu tiên ta ta tạo một PictureBox làm vùng vẽ phụ Tác dụng là tạo cho người dùng giao diện vẽ thử nghiệm trước khi dưa thao tác vẽ đó vẽ vào vùng vẽ chính.
Ta tạo một lớp draw có tác dụng làm cho PictureBox nói trên có nền trong xuốt , có thể di chuyển được trên vùng vẽ chính khi người dùng cần Lớp này còn có tác dụng thay đổi Size của PictureBox nói trên Đồng thời thay đổi Size của hình mà người dùng vẽ
Lớp draw này còn xác định vị trí và kích cỡ của ảnh vẽ trên PictureBox tương ứng dưới vùng vẽ chính
Vùng vẽ chính được dựng lên bởi lớp pen Lớp này được thừa kế lớp
PictureBox và được bổ xung nhiều phương thức vẽ bởi hàm vehinh() Ngoài ra lớp này đươc bổ xung nhiều hàm khác như laymau(), velai(),vetheotoado() ,tanghinh() ,
Hàm vehinh() này ban đầu vẽ hình trên vùng vẽ phụ Và khi nhận được dấu hiệu kết thúc thì hàm mới vẽ vào vùng vẽ chính đồng thời lưu lại thao tác vẽ đó
Form1.cs (class xử lí của form1)
Help.cs (Class xử lí của form Help)
Program.cs (mặc định)
Trang 6public void vekhung(Form1 form)
{
Graphics g = form.panel4.CreateGraphics();
Pen a = new Pen(Color.Black, 4);
x.X = form.ptmain.Location.X + form.ptmain.Size.Width / 2;x.Y = form.ptmain.Location.Y + form.ptmain.Size.Height;
y.X = form.ptmain.Location.X + form.ptmain.Size.Width;
y.Y = form.ptmain.Location.Y + form.ptmain.Size.Height / 2;z.X = form.ptmain.Location.X + form.ptmain.Size.Width;
z.Y = form.ptmain.Location.Y + form.ptmain.Size.Height;
form.Invalidate();
g.DrawLine(a, x.X + 2, x.Y + 2, x.X - 2, x.Y + 2);
g.DrawLine(a, y.X + 2, y.Y + 2, y.X + 2, y.Y - 2);
g.DrawLine(a, z.X + 2, z.Y + 2, z.X + 2, z.Y - 2);
if (form.ptmain.Width > form.panel4.Width){
form.hScrollBar1.Visible = true;form.hScrollBar1.Maximum = form.ptmain.Width - form.panel4.Width + 115;
form.hScrollBar1.LargeChange = 110;
}
if (form.ptmain.Height > form.panel4.Height){
form.vScrollBar1.Visible = true;form.vScrollBar1.Maximum = form.ptmain.Height - form.panel4.Height + 115;
form.vScrollBar1.LargeChange = 110;
}}
#endregion
Hàm kiemtra() :
Trang 7 Hàm này có tác dụng kiểm tra xem chuột có nằm ở vùng kéo dãn không nếu có thì xẽ thay đổi hình dạng chuột
#region kiểm tra chuột co Move vào điểm co dãn nêu có thì đổi cursors
public void kiemtra(object sender, MouseEventArgs e, Form1 form1) {
if (e.X > (x.X - 20) && e.X < (x.X + 20) && e.Y < (x.Y + 10) && e.Y > (x.Y - 10))
if (e.Y > (y.Y - 20) && e.Y < (y.Y + 20) && e.X < (y.X + 10)
&& e.X > (y.X - 10))
#region khi chuột Move vào điểm co dãn và mousedows thì khéo dãn
public void keo(object sender, MouseEventArgs e, Form1 form1)
Trang 8form1.ptmain.Width += e.X - form1.ptmain.Size.Width - form1.ptmain.Location.X;
form1.ptmain.Height += e.Y - form1.ptmain.Size.Height - form1.ptmain.Location.Y;
#region hàm tạo hình chữ nhật và picturebox vẽ
public void taorectangle(object sender, MouseEventArgs e, Form1 form, pen ptmain)
{
if (form.mouseptmain == true)
{
Trang 9Rectangle tam = new Rectangle();
Point tam2 = new Point();
Graphics g = Graphics.FromImage(form.ptve.Image);
Pen t = new Pen(Color.Black, 2);
g.DrawImage(ptmain.Image, 0, 0, tam, GraphicsUnit.Pixel); g.DrawRectangle(t, new Rectangle(0, 0, form.ptve.Width, form.ptve.Height));
g.DrawLine(t, form.ptve.Width / 2, form.ptve.Height - 3, form.ptve.Width / 2, form.ptve.Height);
g.DrawLine(t, form.ptve.Width - 3, form.ptve.Height / 2, form.ptve.Width, form.ptve.Height / 2);
g.DrawLine(t, form.ptve.Width - 3, form.ptve.Height - 2, form.ptve.Width, form.ptve.Height - 2);
Trang 10dãn Nếu có thì thay đổi hình dạng con chuộtpublic void kiemtra(object sender, MouseEventArgs e, Form1 form, pen ptmain) {
if (e.X > (form.ptve.Width / 2) - 5 && e.X < (form.ptve.Width / 2)+ 5 && e.Y > form.ptve.Height-5)
if (e.Y > (form.ptve.Height / 2) - 5 && e.Y <
(form.ptve.Height / 2) + 5 && e.X > (form.ptve.Width-5))
Rectangle tam = new Rectangle();
Point tam2 = new Point();
tam2.X = rec.X - 5;
Trang 11if (form.ptve.Width > 0 && form.ptve.Height > 0)
if (form.ptve.Width > 0 && form.ptve.Height > 0)
Trang 12#region di chuyển picturebox
public void dichuyen(object sender, MouseEventArgs e, Form1 form,penptmain)
y.X += (e.X - form.mousedownptve.X);
y.Y += (e.Y - form.mousedownptve.Y);
Rectangle tam = new Rectangle();
Point tam2 = new Point();
Graphics g = Graphics.FromImage(form.ptve.Image);
Pen t = new Pen(Color.Black, 2);
g.DrawImage(ptmain.Image, 0, 0, tam, GraphicsUnit.Pixel);
Trang 13g.DrawRectangle(t, new Rectangle(0, 0, form.ptve.Width, form.ptve.Height));
g.DrawLine(t, form.ptve.Width / 2, form.ptve.Height - 3, form.ptve.Width / 2, form.ptve.Height);
g.DrawLine(t, form.ptve.Width - 3, form.ptve.Height / 2, form.ptve.Width, form.ptve.Height / 2);
g.DrawLine(t, form.ptve.Width - 3, form.ptve.Height - 2, form.ptve.Width, form.ptve.Height - 2);
Hàm velai() la hàm ve lại những thao tác vẽ được lưu trong biến luu.
Các hàm vehinhtheotoado(), racmau() , tanghinh() la các hàm phụ chợ cho hàm vẽ hình
d.Tool.cs
Đây là lớp khởi tạo về false của các tool trong form1.cs
public tool() { }
#region cac tool vẽ
public void refreshtool(Form1 form)
Trang 14form.p1.BorderStyle = BorderStyle.None;
form.p2.BorderStyle = BorderStyle.None;
form.p3.BorderStyle = BorderStyle.None;
form.p4.BorderStyle = BorderStyle.None;
}
public void refreshtbd(Form1 form)
{
form.ptbd1.BorderStyle = BorderStyle.None;
form.ptbd2.BorderStyle = BorderStyle.None;
form.ptbd3.BorderStyle = BorderStyle.None;
}
public void refreshpt(Form1 form)
{
form.pt1.BorderStyle = BorderStyle.None;
form.pt2.BorderStyle = BorderStyle.None;
form.pt3.BorderStyle = BorderStyle.None;
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private Color color;
Trang 15public Color Color
{
get { return color; }
set { color = value; }
}
private Point Location;
public Point Location1
{
get { return Location; }
set { Location = value; }
}
private int with;
public int With
{
get { return with; }
set { with = value; }
}
private int height;
public int Height
{
get { return height; }
set { height = value; }
}
private int netve;
public int Netve
{
get { return netve; }
set { netve = value; }
}
private Image image;
public Image Image
{
get { return image; }
set { image = value; }
Trang 16public GraphicsPath path = new GraphicsPath();
public Pen p = new Pen(Color.Black, 3);
Trang 17public Brush br = Brushes.Black;
public Image saveim = new Bitmap(557, 408);
public int vepen = 1,npoin=0;
public Rectangle rec;
public Point[] poin =new Point[100000];
public Size size;
sự kiện chuột với pannel4 :
Đây là nơi bắt sự kiện và thực thi thao tác làm thay đổi kích thước của vùng vẽ chính
#region sự kiện chuột với pannel4
private void panel4_MouseDown(object sender, MouseEventArgs e)
Trang 18 Đây là nơi bắt sự kiện và thực thi việc di chuyển, thay đổi kích thước vùng vẽ thử mà vẫn giữ nền trong suốt ,…
#region sự kiện với ptve
private void ptve_MouseDown(object sender, MouseEventArgs e)
dr.kiemtra(sender, e, this, pe);
dr.keo(sender, e, this, pe);
Trang 19}
#endregion
sự kiện ptmain :
Đây là vùng bắt sự kiện chính đối với vùng vẽ chính Tác dung
từ những sự kiện đó gọi các hàm vẽ hình để thực hiện thao tác vẽ của người dung
#region sự kiện ptmain
private void sukien(pen picture)
{
picture.MouseDown += new MouseEventHandler(mousedown_pt);
picture.MouseMove += new MouseEventHandler(mousemove_pt);
picture.MouseUp += new MouseEventHandler(mouseup_pt);
picture.DoubleClick += new EventHandler(doubleclick_pt);
if (tlaymau.Checked == false && tmouse.Checked == false && tracmau.Checked == false && txoa.Checked == false)
Trang 20Size(image.Width, image.Height);
pe.luu.sd[pe.luu.n].rec = new Rectangle(0, 0, pe.Width, pe.Height);
pe.luu.n++;
pe.n = pe.luu.n;
Trang 21}
}
break;
case DialogResult.No:
pe.Image = new Bitmap(557, 408);
Size(image.Width, image.Height);
pe.luu.sd[pe.luu.n].rec = new Rectangle(0, 0, pe.Width, pe.Height);
Trang 22pe.luu.sd[pe.luu.n].saveim = new Bitmap(pe.Width, pe.Height);
#region các hàm filedialog mở và lưu file
private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
switch (MessageBox.Show("Bạn có muốn lưu file không", "Thông Báo",MessageBoxButtons.YesNoCancel))
Trang 23pe.Image = new Bitmap(image.Width,
Size(image.Width, image.Height);
pe.luu.sd[pe.luu.n].rec = new Rectangle(0, 0, pe.Width, pe.Height);
case DialogResult.No:
pe.Image = new Bitmap(557, 408);
Size(image.Width, image.Height);
pe.luu.sd[pe.luu.n].rec = new Rectangle(0, 0, pe.Width, pe.Height);
Trang 24pe.luu.sd[pe.luu.n] = new savedr();
pe.luu.sd[pe.luu.n].saveim = new Bitmap(pe.Width, pe.Height);
SaveFileDialog a = new SaveFileDialog();
a.Filter = "file (*.gif)|*.gif|file (*.jpg)|*.jpg|file (*.png)|
Trang 25switch (MessageBox.Show("Bạn có muốn lưu file không", "Thông Báo",MessageBoxButtons.YesNoCancel))
case DialogResult.No:
pe.Image = new Bitmap(557, 408);
case DialogResult.No:
pe.Image = new Bitmap(557, 408);
Trang 26Size(image.Width, image.Height);
pe.luu.sd[pe.luu.n].rec = new Rectangle(0, 0, pe.Width, pe.Height);
case DialogResult.No:
pe.Image = new Bitmap(557, 408);
Size(image.Width, image.Height);
pe.luu.sd[pe.luu.n].rec = new Rectangle(0, 0, pe.Width, pe.Height);
Trang 27pe.luu.sd[pe.luu.n] = new savedr();
pe.luu.sd[pe.luu.n].saveim = new Bitmap(pe.Width, pe.Height);
Trang 29private void tlucgiac_Click(object sender, EventArgs e) {
Trang 33private void trec_Click(object sender, EventArgs e) {
Trang 35p1.BorderStyle = BorderStyle.Fixed3D;
but = new Pen(but.Color, ktnetve);
p2.BorderStyle = BorderStyle.Fixed3D;
but = new Pen(but.Color, ktnetve);
p3.BorderStyle = BorderStyle.Fixed3D;
but = new Pen(but.Color, ktnetve);
}
Trang 36private void p4_Click(object sender, EventArgs e)
{
ktnetve = 12;
tl.refreshtkc(this);
p4.BorderStyle = BorderStyle.Fixed3D;
but = new Pen(but.Color, ktnetve);
Tác vụ chính là xác định người dùng chọn tool màu nào?
#region tool màu
private void Black_Click(object sender, EventArgs e)
Trang 37but = new Pen(color.BackColor, ktnetve);
Trang 39but = new Pen(color.BackColor, ktnetve);
co = new SolidBrush(color.BackColor);
Trang 40but = new Pen(color.BackColor, ktnetve);
co = new SolidBrush(color.BackColor);
}
}
#endregion
font chữ
Tác vụ chính là xác định người dùng chọn font chữ kiểu nào?
#region font chu
private void toolStripComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
font = new Font(toolStripComboBox1.Text,
int.Parse(toolStripComboBox3.Text), fontstyle, GraphicsUnit.Point, ((byte)(0)));
font = new Font(toolStripComboBox1.Text,
int.Parse(toolStripComboBox3.Text), fontstyle, GraphicsUnit.Point, ((byte)(0)));
font = new Font(toolStripComboBox1.Text,
int.Parse(toolStripComboBox3.Text), fontstyle, GraphicsUnit.Point, ((byte)(0)));
textBox1.Font = font;
}
private void toolStripButton11_Click(object sender, EventArgs e)
Trang 41font = new Font(toolStripComboBox1.Text,
int.Parse(toolStripComboBox3.Text), fontstyle, GraphicsUnit.Point, ((byte)(0)));
10%-#region phong to thu nho
private void toolStripButton3_Click(object sender, EventArgs e) {
if (hesonhan < 30 && pe.luu.n != 0)