ĐẠI HỌC MỎ ĐỊA CHẤT
KHOA CÔNG NGHỆ THÔNG TIN
Bài tập lớn môn học
Đồ Họa Máy Tính
Đề tài: Xây dựng chương trình vẽ đồ họa hai chiều
Nhóm sinh viên thực hiện Giảng viên hướng dẫn
Ngô Thị Liên
Phạm Thị Ngân
Vũ Thị Thắm
Phạm Đức Thịnh
0921050120
0921050275
0921050065
0921050154
TS. Nguyễn Quang Khánh
Mục Lục
Page 1
I. Lời giới thiệu
Sự phát triển của khoa học, kĩ thuật, nghệ thuật, kinh doanh và công nghệ luôn
luôn phụ thuộc vào khả năng truyền đạt thông tin của chúng ta, hoặc thông qua các bit dữ
liệu lưu trữ trong microchip hoặc thông qua giao tiếp bằng tiếng nói. Câu châm ngôn từ
xa xưa “một hình ảnh có giá trị hơn cả vạn lời" hay "trăm nghe không bằng một thấy"
cho thấy ý nghĩa rất lớn của hình ảnh trong việc chuyển tải thông tin. Hình ảnh bao giờ
cũng được cảm nhận nhanh và dễ dàng hơn, đặc biệt là trong trường hợp bất đồng về
ngôn ngữ. Do đó không có gì ngạc nhiên khi mà ngay từ khi xuất hiện máy tính, các nhà
nghiên cứu đã cố gắng sử dụng nó để phát sinh các ảnh trên màn hình. Trong suốt gần 50
năm phát triển của máy tính, khả năng phát sinh hình ảnh bằng máy tính của chúng ta đã
đạt tới mức mà bây giờ hầu như tất cả các máy tính đều có khả năng đồ họa.Đồ họa máy
tính là một trong những lĩnh vực lí thú nhất và phát triển nhanh nhất của tin học. Ngay từ
khi xuất hiện, đồ họa máy tính đã có sức lôi cuốn mãnh liệt, cuốn hút rất nhiều người ở
nhiều lĩnh vực khác nhau như khoa học, nghệ thuật, kinh doanh, quản lí, Tính hấp dẫn
và đa dạng của đồ họa máy tính có thể được minh họa rất trực quan thông qua việc khảo
sát các ứng dụng của nó.
Ngày nay, đồ họa máy tính được sử dụng trong rất nhiều lĩnh vực khác nhau như
công nghiệp, thương mại, quản lí, giáo dục, giải trí, … Số lượng các chương trình đồ họa
ứng dụng thật khổng lồ và phát triển liên tục.Trong lĩnh vực công nghiệp,CAD(computer-
Page 2
aided design) đã được sử dụng hầu hết trong việc thiết kế các cao ốc, ô tô, máy bay, tàu
thủy, tàu vũ trụ, máy tính,…Trong lĩnh vực giải trí,nghệ thuật, đồ họa máy tính giúp ta
tạo ra các chương trình trò chơi,các kĩ xảo điện ảnh cho các nhà làm phim,hay ngay chính
giao diện đồ họa đã làm nâng cao khả năng giao tiếp giữa người và máy tính.
Để có thể làm được những ứng dụng đồ họa hữu ích cho cuộc sống,trước hết
chúng ta cần phải có một nền tảng vững chắc về lập trình đồ họa.Có rất nhiều ngôn ngữ
hỗ trợ lập trình đồ họa máy tính,mỗi ngôn ngữ được xây dưng trên những thư viện đồ họa
riêng,có những thế mạnh riêng.Và khi nói về lập trình đồ họa,chúng ta không thể không
nói đến ngôn ngữ lập trình C#,một ngôn ngữ rất mạnh trong lĩnh vực này.Với mục đích
nghiên cứu,tìm hiểu và mang đến cho những ai muốn tìm hiều về lập trình đồ họa một tài
liệu thiết thực,nhóm chúng em đã xây dựng chương trình vẽ đồ họa hai chiều . Vì là lần
thời gian làm bài tương đối ngắn, kiến thức còn hạn chế nên chúng em không tránh khỏi
sai sót.Chúng em mong thầy xem xét và góp ý cho tài liệu này.Chúng em chân thành cảm
ơn.
II. Nội dung báo cáo
1)Thông tin các thành viên trong nhóm
STT Họ và Tên MSSV Điện thoại Email
1 Ngô Thị Liên 0921050120
2 Phạm Thị Ngân 0921050275 01696884092
3 Vũ Thị Thắm 0921050065 01649711431
4 Phạm Đức Thịnh 0921050154 01656100343
2)Bảng phân chia công việc
STT
Họ và tên sinh
viên thực hiện
Nội dung thực hiện
1 Ngô Thị Liên - Thiết kế giao diện.
- Tìm hiểu thuật toán,ứng dụng vẽ các đối tượng đồ
họa 2 chiều
2 Phạm Thị Ngân - Tìm hiểu thuật toán,ứng dụng vẽ các đối tượng đồ
họa 2 chiều .
- Tester.
3 Vũ Thị Thắm - Tìm hiểu, xây dựng chức năng biến hình cho các đối
Page 3
tượng đồ họa.
- Tổng hợp,viết tài liệu
4 Phạm Đức Thịnh - Tổng hợp, hoàn thiện các chức năng vẽ đồ họa cơ
sở.
- Bắt và xử lý sự kiện trên form.
- Xây dựng thư viện hình, cung cấp chức năng cho
người dùng thao tác với thư viện hình.
- Gom nhóm và phân rã các đối tượng đồ họa.
3) Chức năng được xây dựng trong chương trình
a) Chức năng trong chương trình
- Cho người dùng tự vẽ các đối tượng đồ họa hai chiều trên giao diện của chương
trình:
o Vẽ đối tượng đường thẳng, đường gấp khúc.
o Vẽ đối tượng đường tròn, eclipse, cung tròn.
o Vẽ hình chữ nhật, hình đa giác.
- Cho phép người dùng thay đổi các thuộc tính của đối tượng:
o Đổi đường viền, màu viền.
o Tăng độ rộng của kích thước đường viền.
o Cho phép người dùng tô màu những hình có đường khép kín (hình tròn,
đa giác, eclipse).
- Cho phép người dùng lưu trữ bản vẽ dạng bitmap, mở đối tượng bản vẽ định
dạng bitmap.
- Cho phép người dùng sử dụng thư viện hình có sẵn trong chương trình, ngoài ra
còn có thể thêm các đối tượng vào thư viện hình.
- Có các chức năng biến hình cho các đối tượng đồ họa
o Phép tịnh tiến đối tượng đồ họa
o Phép thay đổi tỷ lệ của đối tượng đồ họa.
o Phép quay đối tượng theo tâm 0 hoặc theo tâm bất kỳ.
o Phép biến dạng hình theo trục x, trục y.
Page 4
b) Lưu đồ thuật toán
- Thuật toán Bresenham để vẽ đường thẳng
- Thuật toán MidPoint để vẽ đường tròn
Page 5
4) Giới thiệu chức năng đặc biệt trong chương trình
- Cho phép người dùng tạo một đối tượng đồ họa bất kỳ từ các đối tượng cơ sở
sau đó lưu vào thư viện hình của chương trình.
- Tạo các thư viện hình có sẵn các đối tượng (hình sao, mũi tên,…).
- Cho phép người dùng sử dụng các đối tượng có sẵn trong thư viện.
- Cho phép chọn các thuộc tính của bút vẽ (độ rộng của bút, kiểu đường viền của
bút vẽ, màu của bút vẽ,…).
- Lưu các đối tượng đã vẽ,mở các đối tượng đồ họa có sẵn.
- Khi vẽ các đối tượng đồ họa,cho phép xem lại các đối tượng cơ sở đã vẽ, có thể
xóa các đối tượng bất kỳ trong đó.
5) Môi trường và ngôn ngữ đã sử dụng
- Sử dụng môi trường visual studio 2010 để xây dựng chương trình.
- Sử dụng ngôn ngữ lập trình C#.
6) Cài đặt chương trình
a) Giao diện của chương trình
- Giao diện chính của chương trình:
- Giao diện kết quả khi vẽ đối tượng đường thẳng,đường gấp khúc
Page 6
- Giao diện kết quả khi vẽ đường cong, đường tròn, ellipse
- Giao diện khi vẽ đa giác
Page 7
- Giao diện khi gom nhóm các đối tượng, tạo thành hình phức hợp, lưu vào thư
viện đối tượng của chương trình
b) Cài đặt chương trình
b.1. Cài đặt thuật toán vẽ các đối tượng đồ họa 2 chiều
b.1.1. Đối tượng đường thẳng
class DrawLine : DrawObject
{
public DrawLine(Point _start)
{
point.Add(_start);
point.Add(_start);
}
public DrawLine(Point _start, Point _end)
{
point.Add(_start);
point.Add(_end);
}
public override void Update(Point p, Graphics g, Bitmap d)
{
point[1] = p;
Page 8
s.X = Math.Min(point[0].X, point[1].X);
s.Y = Math.Min(point[0].Y, point[1].Y);
e.X = Math.Max(point[0].X, point[1].X);
e.Y = Math.Max(point[0].Y, point[1].Y);
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
g.DrawLine(pen, point[0], point[1]);
if (selected) Select(g);
}
//Thuat toan Bresenham: />%E1%BA%ADt_Bresenham_v%E1%BA%BD_%C4%91o%E1%BA%A1n_th%E1%BA%B3ng
public void Draw(Graphics g, Bitmap drawArea)
{
int x0 = point[0].X, y0 = point[0].Y;
int x1 = point[1].X, y1 = point[1].Y;
int dX = Math.Abs(x1 - x0);
int dY = Math.Abs(y1 - y0);
int sX, sY;
if (x0 < x1) sX = 1; else sX = -1;
if (y0 < y1) sY = 1; else sY = -1;
int err = dX - dY;
while (x0 != x1 || y0 != y1)
{
drawArea.SetPixel(x0, y0, pen.Color);
int e2 = 2 * err;
if (e2 > -dY)
{
err -= dY;
x0 += sX;
}
if (e2 < dX)
{
err += dX;
y0 += sY;
}
}
}
}
b.1.2. Đối tượng hình tròn
class DrawCircle : DrawObject
{
private int r;
public DrawCircle(Point _o)
{
point.Add(_o);
Page 9
r = 0;
}
public DrawCircle(Point _o, int _r)
{
point.Add(_o);
r = _r;
}
public override void Update(Point p, Graphics g, Bitmap d)
{
int dX = p.X - point[0].X;
int dY = p.Y - point[0].Y;
r = (int)Math.Sqrt((double)(dX * dX + dY * dY));
s.X = point[0].X - r;
s.Y = point[0].Y - r;
e.X = point[0].X + r;
e.Y = point[0].Y + r;
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
Rectangle rec = new Rectangle();
rec.X = point[0].X - r;
rec.Y = point[0].Y - r;
rec.Width = r * 2;
rec.Height = r * 2;
if (fill != Brushes.Transparent) g.FillEllipse(fill, rec);
g.DrawEllipse(pen, rec);
if (selected) Select(g);
}
//Thuat toan MidPoint xem trong sach
public void Draw(Graphics g, Bitmap drawArea)
{
int x = 0, y = r;
Put8Pixel(x, y, drawArea);
int p = 1 - r; //5/4 - r;
while (x < y)
{
if (p < 0) p += 2 * x + 3;
else
{
p += 2 * (x - y) + 5;
y ;
}
x++;
Put8Pixel(x, y, drawArea);
}
}
private void Put8Pixel(int x, int y, Bitmap drawArea)
{
Page 10
int oX = point[0].X, oY = point[0].Y;
drawArea.SetPixel(oX + x, oY + y, pen.Color);
drawArea.SetPixel(oX + y, oY + x, pen.Color);
drawArea.SetPixel(oX + y, oY - x, pen.Color);
drawArea.SetPixel(oX + x, oY - y, pen.Color);
drawArea.SetPixel(oX - x, oY - y, pen.Color);
drawArea.SetPixel(oX - y, oY - x, pen.Color);
drawArea.SetPixel(oX - y, oY + x, pen.Color);
drawArea.SetPixel(oX - x, oY + y, pen.Color);
}
}
b.1.3. Đối tượng vẽ Ellipse
class DrawEllipse : DrawObject
{
public DrawEllipse(Point _start)
{
point.Add(_start);
point.Add(_start);
}
public DrawEllipse(Point _start, Point _end)
{
point.Add(_start);
point.Add(_end);
}
public override void Update(Point p, Graphics g, Bitmap d)
{
s = point[0];
e = point[1] = p;
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
Rectangle rec = new Rectangle();
rec.X = Math.Min(point[0].X, point[1].X);
rec.Y = Math.Min(point[0].Y, point[1].Y);
rec.Width = Math.Abs(point[0].X - point[1].X);
rec.Height = Math.Abs(point[0].Y - point[1].Y);
if (fill != Brushes.Transparent) g.FillEllipse(fill, rec);
g.DrawEllipse(pen, rec);
if (selected) Select(g);
}
}
b.1.4. Đối tượng vẽ đa giác
class DrawPolygon : DrawObject
{
public DrawPolygon(Point _start)
Page 11
{
point.Add(_start);
point.Add(_start);
s = e = _start;
}
public DrawPolygon(List<Point> _p)
{
point = _p;
s = e = _p[0];
for (int i = 1; i < _p.Count; i++)
{
if (_p[i].X < s.X) s.X = _p[i].X;
if (_p[i].Y < s.Y) s.Y = _p[i].Y;
if (_p[i].X > e.X) e.X = _p[i].X;
if (_p[i].Y > e.Y) e.Y = _p[i].Y;
}
}
public void AddPoint(Point _point)
{
point[point.Count - 1] = _point;
point.Add(_point);
if (_point.X < s.X) s.X = _point.X;
if (_point.Y < s.Y) s.Y = _point.Y;
if (_point.X > e.X) e.X = _point.X;
if (_point.Y > e.Y) e.Y = _point.Y;
}
public override void Update(Point p, Graphics g, Bitmap d)
{
point[point.Count - 1] = p;
Bitmap drawArea = (Bitmap)d.Clone();
Draw(drawArea);
g.DrawImage(drawArea, new Point(0, 0));
}
public override void Draw(Bitmap drawArea)
{
Graphics g = Graphics.FromImage(drawArea);
if (fill != Brushes.Transparent) g.FillPolygon(fill, point.ToArray());
g.DrawPolygon(pen, point.ToArray());
if (selected) Select(g);
}
}
b.2. Code chức năng cho phép kéo thả để vẽ các đối tượng
Khi bắt đầu vào chương trình, bắt đầu chọn các đối tượng muốn sử dụng (đường
thẳng, đường gấp khúc,đường tròn,đường elipse, đa giác,…) trên menu chính của
chương trình.
Khung vẽ đối tượng là một picturebox, thao tác vẽ các đối tượng trên khung này.
Bắt đầu lấy tọa độ đầu của các đối tượng:
Page 12
private void SelectTool(Tool select)
{
btnLine.CheckState = CheckState.Unchecked;
btnRectangle.CheckState = CheckState.Unchecked;
btnBLine.CheckState = CheckState.Unchecked;
btnPolygon.CheckState = CheckState.Unchecked;
btnCircle.CheckState = CheckState.Unchecked;
btnArc.CheckState = CheckState.Unchecked;
btnEllipse.CheckState = CheckState.Unchecked;
if (tool != select)
{
tool = select;
pnlDraw.Cursor = Cursors.Cross;
}
else
{
tool = Tool.None;
pnlDraw.Cursor = Cursors.Default;
}
switch (tool)
{
case Tool.Line:
btnLine.CheckState = CheckState.Checked;
break;
case Tool.Rectangle:
btnRectangle.CheckState = CheckState.Checked;
break;
case Tool.BLine:
btnBLine.CheckState = CheckState.Checked;
break;
case Tool.Polygon:
btnPolygon.CheckState = CheckState.Checked;
break;
case Tool.Circle:
btnCircle.CheckState = CheckState.Checked;
break;
case Tool.Arc:
btnArc.CheckState = CheckState.Checked;
break;
case Tool.Ellipse:
btnEllipse.CheckState = CheckState.Checked;
break;
}
}
else
{
DrawBLine curBLine = (DrawBLine)objectList.Last();
curBLine.AddPoint(e.Location);
}
}
Page 13
else if (drawing)
{
DrawBLine curBLine = (DrawBLine)objectList.Last();
curBLine.point.RemoveAt(curBLine.point.Count - 1);
Graphics g = pnlDraw.CreateGraphics();
curBLine.Update(curBLine.point.Last(), g, drawArea);
DoneDraw("BLine");
drawing = false;
}
break;
case Tool.Polygon:
//Chọn tạo độ ban đầu để Vẽ đa giác
if (e.Button == MouseButtons.Left)
{
if (!drawing)
{
objectList.Add(new DrawPolygon(e.Location));
drawing = true;
}
else
{
DrawPolygon curPolygon = (DrawPolygon)objectList.Last();
curPolygon.AddPoint(e.Location);
}
}
else if (drawing)
{
DrawPolygon curPolygon = (DrawPolygon)objectList.Last();
curPolygon.point.RemoveAt(curPolygon.point.Count - 1);
Graphics g = pnlDraw.CreateGraphics();
curPolygon.Update(curPolygon.point.Last(), g, drawArea);
DoneDraw("Polygon");
drawing = false;
}
break;
case Tool.Circle:
//Chọn tạo độ ban đầu để Vẽ dg tròn
if (!drawing) objectList.Add(new DrawCircle(e.Location));
else DoneDraw("Circle");
drawing = !drawing;
break;
case Tool.Arc:
if (!drawing)
{
objectList.Add(new DrawArc(e.Location));
drawing = true;
}
else
{
DrawArc curArc = (DrawArc)objectList.Last();
if (!curArc.adjushAngle)
{
curArc.adjushAngle = true;
curArc.lastX = e.X;
Page 14
}
else
{
curArc.adjushAngle = false;
DoneDraw("Arc");
drawing = false;
}
}
break;
case Tool.Ellipse:
//Chọn tạo độ ban đầu để Vẽ elipse
if (!drawing) objectList.Add(new DrawEllipse(e.Location));
else DoneDraw("Ellipse");
drawing = !drawing;
break;
}
}
Sau đó thực hiện thao tác kéo thả chuột để vẽ đối tượng
private void pnlDraw_MouseMove(object sender, MouseEventArgs e)
{
lblCoordinate.Text = e.X + "x" + e.Y;
if (drawing)
{
switch (tool)
{
case Tool.Line:
DrawLine newLine = (DrawLine)objectList.Last();
newLine.Update(e.Location, drawGraphic, drawArea);
break;
case Tool.Rectangle:
DrawRectangle newRectangle = (DrawRectangle)objectList.Last();
newRectangle.Update(e.Location, drawGraphic, drawArea);
break;
case Tool.BLine:
DrawBLine newBLine = (DrawBLine)objectList.Last();
newBLine.Update(e.Location, drawGraphic, drawArea);
break;
case Tool.Polygon:
DrawPolygon newPolygon = (DrawPolygon)objectList.Last();
newPolygon.Update(e.Location, drawGraphic, drawArea);
break;
case Tool.Circle:
DrawCircle newCircle = (DrawCircle)objectList.Last();
newCircle.Update(e.Location, drawGraphic, drawArea);
break;
case Tool.Arc:
DrawArc newArc = (DrawArc)objectList.Last();
if (newArc.adjushAngle)
{
Page 15
newArc.angle = Math.Abs(360 - Math.Abs(newArc.lastX - e.X)*2);
}
newArc.Update(e.Location, drawGraphic, drawArea);
break;
case Tool.Ellipse:
DrawEllipse newEllipse = (DrawEllipse)objectList.Last();
newEllipse.Update(e.Location, drawGraphic, drawArea);
break;
}
}
if (e.Button == System.Windows.Forms.MouseButtons.Left && tool == Tool.None
&& lstObject.SelectedItems.Count > 0)
{
for (int i = 0; i < lstObject.SelectedItems.Count; i++)
{
DrawObject a = (DrawObject)objectList[lstObject.SelectedItems[i].Index];
if (a.GetType().Name != "DrawGroup")
{
for (int j = 0; j < a.point.Count; j++)
{
Point p = a.point[j];
p.X += e.X - curPos.X;
p.Y += e.Y - curPos.Y;
a.point[j] = p;
}
}
else
{
DrawGroup d = (DrawGroup)a;
d.Move(e.X - curPos.X, e.Y - curPos.Y);
}
a.s.X += e.X - curPos.X;
a.s.Y += e.Y - curPos.Y;
a.e.X += e.X - curPos.X;
a.e.Y += e.Y - curPos.Y;
curPos = e.Location;
}
lblTest.Text = (e.X - curPos.X).ToString();
RefreshDraw();
}
else
{
lblTest.Text = "false";
}
}
Thực hiện vẽ các đối tượng khi nhấn chuột phải:
private void DoneDraw(string type)
{
ListViewItem newItem = new ListViewItem(type);
newItem.SubItems.Add(DateTime.Now.ToString());
lstObject.Items.Add(newItem);
drawArea = new Bitmap(background);
foreach (DrawObject d in objectList) d.Draw(drawArea);
Page 16
SelectTool(Tool.None);
pnlDraw.Cursor = Cursors.Default;
}
b.3. Chức năng nâng cao cho phép gom nhóm các đối tượng, tạo thư viện hình
b.3.1. Nhóm các đối tượng cơ sở
public void SaveLibrary(string alias, string title)
{
int id = lstObject.SelectedItems[0].Index;
DrawGroup group = (DrawGroup)objectList[id];
FileStream file = new FileStream(@"lib\" + alias + ".lib",
FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter writer = new StreamWriter(file, Encoding.Unicode);
writer.WriteLine(title);
writer.WriteLine(group.objects.Count.ToString());
for (int i = 0; i < group.objects.Count; i++)
{
string row = group.objects[i].GetType().Name + ";";
for (int j = 0; j < group.objects[i].point.Count; j++)
{
row += group.objects[i].point[j].X + "," +
group.objects[i].point[j].Y + ";";
}
writer.WriteLine(row.Substring(0, row.Length - 1));
}
writer.Close();
file.Close();
LoadLibrary();
}
private void mnuGroup_Click(object sender, EventArgs e)
{
List<DrawObject> objects = new List<DrawObject>();
for (int i = objectList.Count - 1; i >= 0; i )
{
if (lstObject.Items[i].Selected)
{
objectList[i].selected = false;
if (lstObject.Items[i].Text == "Group")
{
DrawGroup curGroup = (DrawGroup)objectList[i];
objects.AddRange(curGroup.objects);
}
else objects.Add(objectList[i]);
objectList.RemoveAt(i);
lstObject.Items.RemoveAt(i);
}
}
DrawGroup group = new DrawGroup(objects);
objectList.Add(group);
DoneDraw("Group");
RefreshDraw();
}
Page 17
Lưu đối tượng vào thư viện hình:
private void mnuSaveGroup_Click(object sender, EventArgs e)
{
SaveLibrary slForm = new SaveLibrary(this);
slForm.Show();
}
Xóa các đối tượng vừa gom nhóm:
private void mnuDelete_Click(object sender, EventArgs e)
{
for (int i = objectList.Count - 1; i >= 0; i )
{
if (lstObject.Items[i].Selected)
{
objectList.RemoveAt(i);
lstObject.Items.RemoveAt(i);
}
}
RefreshDraw();
}
b.3.2. Thay đổi các thuộc tính của đối tượng đồ họa
Thay đổi độ rộng của bút vẽ:
private void cboBorderWidth_SelectedIndexChanged(object sender, EventArgs e)
{
int selectedId = lstObject.SelectedItems[0].Index;
objectList[selectedId].pen.Width = int.Parse(cboBorderWidth.Text);
RefreshDraw();
}
Thay đổi màu của bút vẽ:
private void picBorderColor_Click(object sender, EventArgs e)
{
int selectedId = lstObject.SelectedItems[0].Index;
clrPicker.ShowDialog();
objectList[selectedId].pen.Color = picBorderColor.BackColor =
clrPicker.Color;
RefreshDraw();
}
Thay đổi đường viền của bút vẽ ( vẽ bằng đường nét liền, nét đứt, dotted):
private void cboBorderType_SelectedIndexChanged(object sender, EventArgs e)
{
int selectedId = lstObject.SelectedItems[0].Index;
switch (cboBorderType.SelectedIndex)
{
case 0:
objectList[selectedId].pen.DashStyle = DashStyle.Solid;
break;
case 1:
Page 18
objectList[selectedId].pen.DashStyle = DashStyle.Dash;
break;
case 2:
objectList[selectedId].pen.DashStyle = DashStyle.Dot;
break;
}
RefreshDraw();
}
Đổ màu cho các đối tượng là hình khép kín:
private void picFillColor_Click(object sender, EventArgs e)
{
int selectedId = lstObject.SelectedItems[0].Index;
clrPicker.ShowDialog();
objectList[selectedId].fill.Color = picFillColor.BackColor = clrPicker.Color;
RefreshDraw();
}
b.4. Gọi chức năng khi có sự kiện xảy ra
private void btnEllipse_Click(object sender, EventArgs e)
{
SelectTool(Tool.Ellipse);
}
private void btnArc_Click(object sender, EventArgs e)
{
SelectTool(Tool.Arc);
}
private void btnPolygon_Click(object sender, EventArgs e)
{
SelectTool(Tool.Polygon);
}
private void btnLine_Click(object sender, EventArgs e)
{
SelectTool(Tool.Line);
}
private void btnRectangle_Click(object sender, EventArgs e)
{
SelectTool(Tool.Rectangle);
}
private void btnBLine_Click(object sender, EventArgs e)
{
SelectTool(Tool.BLine);
}
private void btnCircle_Click(object sender, EventArgs e)
{
SelectTool(Tool.Circle);
}
Page 19
7) Danh sách thư viện và tài liệu tham khảo
Bài giảng đồ họa máy tính – GV. Nguyễn Quang Khánh.
Giáo trình đồ họa máy tính. Thầy Dương Anh Đức, Lê Đình Huy. Khoa công nghệ
thông tin, Trường ĐH Khoa học tự nhiên.
Giáo trình đồ họa vi tính. Thầy Nguyễn Quốc Cường, Hoàng Đức Hải. Nhà xuất
bản giáo dục.
Giáo trình kỹ thuật đồ họa. Thầy Lê Tuấn Hùng, Huỳnh Quyết Thắng. Đại Học
Bách Khoa Hà Nội.
Page 20