Như đã trình bày ở trên, một đối tượng của lớp Bitmap sẽ trình bày một ảnh như là
một tập hợp các pixel, trong khi xử lý ảnh số ta thường thao tác xử lý ảnh dựa trên các
pixel này, để lấy thông tin của một điểm ảnh ta dùng phương thức GetPixel, để thiết
lập một điểm ảnh (pixel) cho ảnh ta sử dụng SetPixel.
78 trang |
Chia sẻ: nguyenlam99 | Lượt xem: 1196 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ thuật lập trình – Chương 2: Lập trình hướng đối tượng trong C++, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ép cộng chuỗi
• Phép so sánh chuỗi
• Phép vào/ra
Phép gán chuỗi “=”
Cú pháp phép gán chuỗi là tương tự cú pháp gán các đối tượng cơ bản:
= ;
Ví dụ:
String s1(12), s2;
s2 = s1;
thì chuỗi s2 cũng chứa hai phần tử như s1 {‘1’, ‘2’}.
Lưu ý:
• Có thể gán trực tiếp các đối tượng cơ bản cho chuỗi:
String myStr = 12; // myStr có hai phần tử{‘1’, ‘2’}
• Nhưng phép gán lại có độ ưu tiên thấp hơn phép toán học:
String myStr = 12+1.5; // tương đương myStr = 13.5
Phép cộng chuỗi “+” và “+=”
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
71
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Phép cộng chuỗi sẽ nối chuỗi thứ hai vào sau chuỗi thứ nhất, kết quả cũng là một
chuỗi:
= + ;
+= ;
Ví dụ:
String s1(12), s2(3);
s1+= s2;
thì s1 sẽ có ba phần tử kí tự{‘1’, ‘2’, ‘3’}.
Phép so sánh chuỗi
Các phép so sánh chuỗi đều là các phép toán hai ngôi, trả về kết quả ở dạng bool
(true/false):
• Phép so sánh lớn hơn “>”: chuỗi_1 > chuỗi_2;
• Phép so sánh lớn hơn hoặc bằng “>=”: chuỗi_1 >= chuỗi_2;
• Phép so sánh nhỏhơn “<”: chuỗi_1 < chuỗi_2;
• Phép so sánh nhỏhơn hoặc bằng “<=”: chuỗi_1 <= chuỗi_2;
• Phép so sánh bằng “==”: chuỗi_1 == chuỗi_2;
• Phép so sánh khác (không bằng) “!=”: chuỗi_1 != chuỗi_2;
Lưu ý:
• Phép so sánh chuỗi thực hiện so sánh mã ASCII của từng kí tự ởhai chuỗi theo
thứtự
tương ứng cho đến khi có sựkhác nhau đầu tiên giữa hai kí tự.
• Phép so sánh là phép so sánh dựa trên từ điển, có phân biệt chữhoa và
chữthường.
Ví dụ:
“12” < “a”; // có giá trị đúng
“a” <= “A”; // có giá trịsai
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
72
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Phép vào/ra
• Phép xuất ra “<<”: cout << biến_chuỗi;
• Phép nhập vào “>>”: cin >> biến_chuỗi;
Ví dụ:
String s(“hello!”);
cout << s;
sẽ in ra màn hình dòng chữ“hello!”.
c. Phương thức
Lớp chuỗi có một số phương thức cơ bản:
• Lấy chiều dài chuỗi
• Tìm một chuỗi con
• Thêm một chuỗi con
• Xoá một chuỗi con
• Chuyển kiểu kí tự
Lấy chiều dài chuỗi
Cú pháp:
.length();
trả về chiều dài của chuỗi (số lượng phần tử kí tự trong chuỗi).
Ví dụ:
String s(“hello!”);
cout << s.length();
sẽ in ra màn hình độ dài chuỗi s là 6.
Tìm một chuỗi con
Cú pháp:
.find(, , );
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
73
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Trong đó:
• Tham số thứ nhất là chuỗi con cần tìm.
• Tham số thứ hai là vị trí để bắt đầu tìm, mặc định là bắt đầu tìm từ phần tử có
chỉ số 0.
• Tham số thứ ba chỉ ra cách so khớp có phân biệt chữ hoa với chữ thường:
SM_IGNORE là không phân biệt, SM_SENSITIVE là có phân biệt.
• Phương thức này trả về kết quả dạng bool, tương ứng là có tìm thấy hay không.
Ví dụ:
s.find(“12”, 0, SM_IGNORE);
sẽ tìm trong chuỗi s xem có sự xuất hiện của chuỗi “12” hay không, vị trí bắt đầu tìm
là 0, với cách tìm không phân biệt chữ hoa chữ thường.
Thêm một chuỗi con
Cú pháp:
.insert(, );
Trong đó:
• Tham số thứ nhất là vịtrí chỉ số mà tại đó, chuỗi con sẽ được chèn vào
• Tham số thứ hai là chuỗi con cần chèn, chuỗi con này cũng có thể là một kí tự.
Ví dụ:
s.insert(0, “12”);
sẽ chèn vào đầu chuỗi s một chuỗi con có hai phần tử “12”.
Xoá một chuỗi con
Cú pháp:
.delete(, );
Trong đó:
• Tham số thứ nhất là vị trí bắt đầu xoá chuỗi con
• Tham số thứ hai là độ dài chuỗi con bị xoá, giá trị mặc định là 1.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
74
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Ví dụ:
s.delete(0, 2);
sẽ xoá hai kí tự đầu của chuỗi s.
Chuyển kiểu kí tự
• Đổi chuỗi thành các kí tự hoa: .toUpper();
• Đổi chuỗi thành các kí tự thường: .toLower();
Ví dụ:
s.toUpper(); // chuyển chuỗi s thành kí tự hoa
s.toLower(); // chuyển chuỗi s thành kí tự thường
Ví dụ áp dụng
#include
#include
#include
void main(){
clrscr();
String myStr;
int function;
do{
clrscr();
cout << “CAC CHUC NANG:” << endl;
cout << “1: Cong them mot chuoi” << endl;
cout << “2: Chen them mot chuoi” << endl;
cout << “3: Xoa di mot chuoi” << endl;
cout << “4: Tim mot chuoi con” << endl;
cout << “5: Chuyen thanh chu hoa” << endl;
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
75
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
cout << “6: Chuyen thanh chu thuong” << endl;
cout << “7: Xem noi dung chuoi” << endl;
cout << “8: Xem chieu dai chuoi” << endl;
cout << “9: Thoat!” << endl;
cout << “=====================================” <<
endl;
cout << “Chon chuc nang: ” << endl;
cin >> function;
switch(function){
case ‘1’: // Thêm vào cuối
String subStr;
cout << “Chuoi them vao: ”;
cin >> subStr;
myStr += subStr;
break;
case ‘2’: // Chèn vào chuỗi
String subStr;
int position;
cout << “Chuoi them vao: ”;
cin >> subStr;
cout << “Vi tri chen:”;
cin >> position;
myStr.insert(position, subStr);
break;
case ‘3’: // Xoá đi một chuỗi con
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
76
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
int position, count;
cout << “Vi tri bat dau xoa:”;
cin >> position;
cout << “Do dai xoa:”;
cin >> count;
myStr.delete(position, count);
break;
case ‘4’: // Tìm chuỗi con
String subStr;
int position;
cout << “Chuoi con can tim:”;
cin >> subStr;
cout << “Vi tri bat dau tim:”;
cin >> position;
if(myStr.find(position, subStr))
cout << “Co xuat hien!” << endl;
else
cout << “Khong xuat hien!” << endl;
break;
case ‘5’: // Chuyển thành chữhoa
myStr.toUpper();
cout << myStr << endl;
break;
case ‘6’: // Chuyển thành chữthường
myStr.toLower();
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
77
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
cout << myStr << endl;
break;
case ‘7’: // Duyệt
cout << “Noi dung chuoi:” << endl;
cout << myStr << endl;
break;
case ‘8’: // Duyệt
cout << “Chieu dai chuoi:”
<< myStr.length() << endl;
break;
}while(function != ‘9’);
return;
}
2.5.4 Lớp ngăn xếp và hàng đợi
2.5.4.1 Lớp ngăn xếp
Lớp ngăn xếp (stack) cũng là một loại lớp vật chứa, nó chứa các phần tử cùng
kiểu, không bắt buộc phải phân biệt nhau nhưng có phân biệt về thứ tự: các thao tác
thêm phần tử và lấy phần tử ra đều được thực hiện ở một đầu ngăn xếp. Phần tử nào
được thêm vào trước thì sẽ bị lấy ra sau.
Muốn dùng lớp Stack phải dùng chỉ thị đầu tệp:
#include
a. Hàm khởi tạo
Lớp Stack có hai cách khởi tạo:
• Khởi tạo không tham số:
Stack biến_ngăn_xếp;
• Khởi tạo bằng một ngăn xếp khác, có cùng kiểu phần tử:
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
78
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Stack biến_ngăn_xếp(Stack);
Trong đó:
• T: là kiểu của các phần tử chứa trong ngăn xếp. T có thể là các kiểu cơ bản, cũng có
thể là các kiểu phức tạp do người dùng tự định nghĩa.
Ví dụ:
Stack myStack;
là khai báo một biến myStack, chứa các phần tử có kiểu cơ bản int.
b. Toán tử
Lớp Stack chỉ dùng đến các toán tử gán “=” và toán tử so sánh bằng “==”:
• Phép gán “=”:
= ;
Dùng để gán hai đối tượng ngăn xếp.
• Phép so sánh bằng “==”:
== ;
Dùng để kiểm tra xem hai đối tượng ngăn xếp có bằng nhau hay không. Kết quả trả về
có kiểu bool (true/false).
c. Phương thức
Thêm một phần tử:
.push(T);
sẽ thêm một phần tử có kiểu T vào đỉnh ngăn xếp.
Lấy một phần tử:
.pop();
sẽ trả về phần tử đang nằm ở đỉnh ngăn xếp.
Kiểm tra tính rỗng:
.empty();
sẽ trả về kết quả kiểu bool, tương ứng với trạng thái của ngăn xếp có rỗng hay không.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
79
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Kích thước ngăn xếp:
.size();
sẽ trả về số lượng các phần tử hiện đang có mặt trong ngăn xếp.
Ví dụ áp dụng
#include
#include
#include
#include
void main(){
clrscr();
Stack myStack;
char strIn[250];
cout << “Nhap chuoi: ”;
cin >> strIn; // Nhập chuỗi kí tựtừbàn phím
for(int i=0; i<strlen(strIn); i++) // Đặt vào ngăn xếp
myStack.push(strIn[i]);
while(!myStack.empty()) // Lấy ra từngăn xếp
cout << myStack.pop();
return;
}
2.5.4.2 Lớp hàng đợi
Lớp hàng đợi (queue) cũng là một loại lớp vật chứa, nó chứa các phần tử cùng
kiểu, không bắt buộc phải phân biệt nhau nhưng có phân biệt về thứ tự: các thao tác
thêm phần tử được thực hiện ở một đầu, các thao tác lấy phần tử ra được thực hiện ở
một đầu còn lại của hàng đợi. Phần tử nào được thêm vào trước thì sẽ bị lấy ra trước.
Muốn dùng lớp Queue phải dùng chỉ thị đầu tệp:
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
80
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
#include
a. Hàm khởi tạo
Lớp Queue có hai cách khởi tạo:
• Khởi tạo không tham số:
Queue biến_hàng_đợi;
• Khởi tạo bằng một hàng đợi khác, có cùng kiểu phần tử:
Queue biến_hàng_đợi(Queue);
Trong đó:
• T: là kiểu của các phần tử chứa trong hàng đợi. T có thể là các kiểu cơ bản,
cũng có thể là các kiểu phức tạp do người dùng tự định nghĩa.
Ví dụ:
Queue myQueue;
là khai báo một biến myQueue, chứa các phần tử có kiểu cơ bản int.
b. Toán tử
Lớp Queue chỉ dùng đến các toán tử gán “=” và toán tử so sánh bằng “==”:
• Phép gán “=”:
= ;
Dùng để gán hai đối tượng hàng đợi.
• Phép so sánh bằng “==”:
== ;
Dùng để kiểm tra xem hai đối tượng hàng đợi có bằng nhau hay không. Kết quả trả về
có kiểu bool (true/false).
c. Phương thức
• Thêm một phần tử:
.push(T);
sẽ thêm một phần tử có kiểu T vào cuối hàng đợi.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
81
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
• Loại một phần tử:
.pop();
sẽ trảvề phần tử đang nằm ở đỉnh đầu hàng đợi.
• Kiểm tra tính rỗng:
.empty();
sẽ trả về kết quả kiểu bool, tương ứng với trạng thái của hàng đợi có rỗng hay không.
• Kích thước hàng đợi:
.size();
sẽ trả về số lượng các phần tử hiện đang có mặt trong hàng đợi.
Ví dụ áp dụng
#include
#include
#include
void main(){
clrscr();
Queue myQueue;
int function;
do{
clrscr();
cout << “CAC CHUC NANG:” << endl;
cout << “1: Them mot tien trinh vao hang doi” << endl;
cout << “2: Dua mot tien trinh trinh vao thuc hien” << endl;
cout<<“3: Xem tat ca cac tien trinh trong hang doi”<< endl;
cout << “5: Thoat!” << endl;
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
82
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
cout << “========================================”
<< endl;
cout << “Chon chuc nang: ” << endl;
cin >> function;
switch(function){
case ‘1’: // Thêm vào hàng đợi
int maso;
cout << “Ma so tien trinh vao hang doi: ”;
cin >> maso;
myQueue.push(maso);
break;
case ‘2’: // Lấy ra khỏi hàng đợi
cout << “Tien trinh duoc thuc hien: ” << myQueue.pop() << endl;
break;
case ‘3’: // Duyệt hàng đợi
Queue::iterator i;
for(i=myQueue.begin(); i<myQueue.end(); i++)
cout << myQueue[i] << “ ”;
break;
}while(function != ‘5’);
return;
}
2.5.5 Lớp danh sách liên kết
Lớp danh sách liên kết (List) cũng là một kiểu lớp vật chứa, nó chứa các phần tử
cùng kiểu, có tính đến thứ tự. Muốn sử dụng lớp List của thư viện C++, phải khai báo
chỉ thị đầu tệp:
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
83
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
#include // Dành riêng cho lớp List
hoặc:
#include // Dùng chung cho các lớp vật chứa
a. Hàm khởi tạo
Lớp List có ba kiểu khởi tạo:
• Khởi tạo không tham số:
List biến_danh_sách;
• Khởi tạo tửmột danh sách cùng kiểu:
List biến_danh_sách(List);
• Khởi tạo từmột mảng các phần tử:
List biến_danh_sách(T* , int );
Trong đó:
• T: là kiểu của các phần tử chứa trong danh sách liên kết. T có thể là các kiểu cơ
bản, cũng có thể là các kiểu phức tạp do người dùng tự định nghĩa.
Ví dụ:
List myList;
sẽ khai báo một danh sách liên kết myList, các phần tử của nó có kiểu cơ bản int.
b. Toán tử
Toán tửgán “=”
Cú pháp:
= ;
sẽ copy toàn bộ các phần tử của vào .
Toán tử so sánh bằng “==”
Cú pháp:
= ;
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
84
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
sẽ trả về một giá trị kiểu bool, tương ứng với việc hai danh sách này có bằng nhau hay
không.
Việc so sánh được tiến hành trên từng phần tử ởvịtrí tương ứng nhau.
Lưu ý:
• Ngoài ra còn có các phép toán so sánh khác cũng có thểthực hiện trên danh sách: <,
>, =, !=.
c. Phương thức
Thêm một phần tử vào danh sách
Cú pháp:
.insert(, );
.push_front();
.push_back();
Trong đó:
• Phương thức thứ nhất chèn một phần tử vào một vị trí bất kì của danh sách, vị
trí chèn được chỉ ra bởi tham số thứ nhất.
• Phương thức thứ hai chèn một phần tử vào đầu danh sách
• Phương thức thứ ba chèn một phần tử vào cuối danh sách.
Ví dụ:
List myList;
myList.push_front(7);
sẽ chèn vào đầu danh sách myList một phần tử có giá trị là 7.
Xoá đi một phần tử
Cú pháp:
.erase();
.pop_front();
.pop_back();
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
85
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Trong đó:
• Phương thức thứ nhất xóa một phần tử ở một vị trí bất kì của danh sách, vị trí
xoá được chỉ ra bởi tham số thứ nhất.
• Phương thức thứ hai xoá một phần tử ở đầu danh sách
• Phương thức thứ ba xoá một phần tử ở cuối danh sách.
Ví dụ:
List myList;
cout << myList.pop_front();
sẽ in ra màn hình phần tử đầu của danh sách myList.
Kiểm tra tính rỗng của danh sách
Cú pháp:
.empty();
trả về giá trị bool, tương ứng với trạng thái hiện tại của biến danh sách là rỗng hay
không.
Xem kích thước danh sách
Cú pháp:
.size();
Ví dụ:
cout << myList.size();
sẽ in ra màn hình kích cỡ (số lượng các phần tử) của danh dách.
Xem nội dung một phần tử
Cú pháp:
.get();
.next();
Trong đó:
• Phương thức thứ nhất trả về phần tử ở vị trí hiện tại của con chạy
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
86
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
• Phương thức thứ hai trả về phần tử tiếp theo, và con chạy cũng di chuyển sang
phần tử đó.
Ví dụ:
List myList;
cout << myList.get();
sẽ in ra màn hình nội dung phần tử thứ nhất của danh sách myList.
Ví dụ áp dụng – Quản lý nhân viên văn phòng.
#include
#include
#include
#include
typedef struct{
char name[25]; // Tên nhân viên
int age; // Tuổi nhân viên
float salary; // Lương nhân viên
} Employee;
void main(){
clrscr();
List myList;
int function;
do{
clrscr();
cout << “CAC CHUC NANG:” << endl;
cout << “1: Them mot nhan vien” << endl;
cout << “2: Xoa mot nhan vien” << endl;
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
87
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
cout << “3: Xem tat ca cac nhan vien trong phong” << endl;
cout << “5: Thoat!” << endl;
cout << “=======================================” <<
endl;
cout << “Chon chuc nang: ” << endl;
cin >> function;
switch(function){
case ‘1’: // Thêm vào ds
int position;
Employee employee;
cout << “Vi tri can chen: ”;
cin >> position;
cout << “Ten nhan vien: ”;
cin >> employee.name;
cout << “Tuoi nhan vien: ”;
cin >> employee.age;
cout << “Luong nhan vien: ”;
cin >> employee.salary;
myList.insert(position, employee);
break;
case ‘2’: // Lấy ra khỏi ds
int position;
cout << “Vi tri can xoa: ”;
cin >> position;
Employee result = myList.erase(position);
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
88
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
if(result != NULL){
cout << “Nhan vien bi loai: ” endl;
cout << “Ten: ” << result.name << endl;
cout << “Tuoi: ” << result.age << endl;
cout << “Luong: ” << result.salary << endl;
}
break;
case ‘3’: // Duyệt ds
cout << “Cac nhan vien cua phong:” << endl;
Employee result = myList.front();
do{
cout << result.name << “ ”
<< result.age << “ ”
<< result.salary << endl;
result = myList.next();
}while(result != NULL);
break;
}while(function != ‘5’);
return;
}
Chương 4: Xử lý đồ họa căn bản
4.1. Winform căn bản
4.1.1. Giới thiệu căn bản về ứng dụng winform với C++ .Net
Lập trình winform là một trong những cách phát triển ứng dụng phổ biến nhất hiện
nay. Ứng dụng winform có thể xem như là một tập hợp các form, mỗi form lại gồm
các control cần thiết (ô nhập văn bản, danh sách lựa chọn, nút bấm, tab) nhằm tạo
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
89
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
một giao diện người dùng thân thiện nói cách khác là nơi hiển thị và tiếp nhận các
thông tin tương tác giữa người sử dụng và chương trình. Các form này có thể hoạt
động độc lập hoặc có quan hệ tương tác với nhau. Đa số các ứng dụng trên desktop
windows là các ứng dụng winform (phần mềm office, windows media player, các phần
mềm quản lý).
Form ví dụ gồm một số control (điều khiển) căn bản
Ngày nay việc phát triển một ứng ứng dụng winform trở lên cực kỳ dễ dàng thông
qua bộ công cụ Visual Studio cụ thể trong tài liệu này tôi đề cập tới bộ Visual Studio
2010, và tất nhiên đi kèm với nó là nền tảng .Net vô cùng mạnh mẽ, ngày càng được
nâng cấp, cải tiến qua từng phiên bản với sự hỗ trợ của gã khổng lồ Microsoft.
Như đã nói ở trên, một ứng dụng winform là tập hợp của các form. Mỗi form trong
ứng dụng lại chứa các control, form được chia làm 2 phần:
- Phần Designer: hiển thị form và các control hay nói cách khác đây chính là phần
giao diện của chương trình.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
90
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Form Designer đơn giản của form Đăng Nhập
- Phần Code Behind: phần code xử lý cho các sự kiện, các tương tác của người dùng.
Lập trình winform cũng có thể xem như là một hình thức của lập trình hướng sự
kiện vì tất cả mọi hành động, tương tác của người dùng được chương trình tiếp nhận
và xử lý thông qua các sự kiện. Form và các control đều được hỗ trợ rất nhiều sự kiện
cho lập trình viên dễ dàng sử dụng, điều khiển chúng trong ứng dụng. Một form được
chúng ta tạo ra là một lớp được kế thừa từ lớp Windows::Forms::Form chính vì vậy
khi chúng ta tạo ra một form nó đã kế thừa rất nhiều thuộc tính và phương thức từ lớp
Form, và tất nhiên đi kèm không thể thiếu với nó là các sự kiện. Một số sự kiện, thuộc
tính này có thể được tìm thấy trong khung Properties (chọn form click chuột phải,
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
91
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
chọn properties hoặc chọn form nhấn F4). Bảng dưới đây liệt kê một số thuộc tính và
sự kiện thông dụng của form:
Thuộc tính Ý nghĩa
Name Tên form
Text Tiêu đề form
AcceptButton Thiết lập nút được nhấn khi ta nhấn phím Enter
CancelButton Tthiết lập nút được nhấn khi ta nhấn phím Esc
BackColor Thiết lập màu nền cho form
BackgroundImage Thiết lập hình nền cho form
Icon Thiết lập icon cho form
Opacity Thiết lập độ mờ của form
ShowIcon Có cho phép hiện icon của form hay không
ShowInTaskar Có hiện biểu tượng form tại thanh taskbar hay không
Size Thiết lập kích thước của form
StartPosition Thiết lập vị trí khi form khởi chạy
WindowState Thiết lập trạng thái của form khi khởi chạy
Sự kiện Ý nghĩa
Activited Định nghĩa phương thức sẽ được thực hiện khi form được
activited
Click Định nghĩa phương thức sẽ được thực hiện khi form được
click
KeyDown Định nghĩa phương thức sẽ được thực hiện khi ta nhấn một
phím
KeyPress Định nghĩa phương thức sẽ được thực hiện khi ta nhấn một
phím và nhả ra
KeyUp Định nghĩa phương thức sẽ được thực hiện khi ta nhả một
phím
Load Định nghĩa phương thức sẽ được thực hiện khi người sử dụng
gọi tới form, và form được hiện ra
Các bước cơ bản tạo một ứng dụng winform
- Tạo mới một Project
Bước 1: Vào menu File -> New->Project
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
92
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Bước 2: Hộp thoại New Project xuất hiện, tại ô Recent Tamplate chọn Visaul C++, tiếp
theo chọn Windows Form Application, đặt tên cho Project tại ô Name và nhấn OK
Kết quả sẽ được một Project bao gồm 1 form mặc định tên là Form1 như hình dưới.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
93
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
- Thêm một form mới vào Project
Bước 1: Tại khung Solution Explorer click chuột phải vào tên project → Add →
New Item
Hộp thoại Add New Item hiện ra click chọn Windows Form, đặt tên cho form và nhấn
Add
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
94
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
- Chọn form chạy đầu tiên khi bắt đầu ứng dụng
Như ta đã biết, trong một ứng dụng sẽ có thể có nhiều form và chúng ta có thể
chọn một form bất kỳ trong số đó là form khởi động ứng dụng tức là form đó sẽ
chạy đầu tiên khi ứng dụng của ta được bắt đầu, để làm được điều đó chúng ta thực
hiện như sau:
Tại khung Solution Explorer, tìm đến thư mục Source Files, mở file
ten_project_.cpp, tìm tới dòng Application::Run(gcnew Form1()); thay Form1
bằng tên form muốn chạy đầu tiên.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
95
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
96
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
4.1.2. Một số điều khiển cơ bản
- Button: là điều khiển cho phép người dùng click để thực hiện một
hành động, với điều khiển này ta thường quan tâm nhất tới sự kiện click và thuộc
tính text. Để viết hàm xử lý cho sự kiện click của button, tại cửa sổ desinger của
form ta click đúp vào button, Visual studio sẽ chuyển tới cửa sổ viết code xử lý cho
sự kiện click vào button, để viết cho các sự kiện khác của button ta tham khảo cửa
sổ Properties.
- CheckBox: điều khiển cho phép người dùng tích chọn
một số điều kiện. Trong một nhóm các checkbox chúng ta có thể chọn cùng lúc
nhiều checkbox.
- ComboBox: hiển thị một danh sách xổ xuống các dọng dữ liệu
cho phép người dùng lựa chọn, chỉ được lựa chọn một dòng và có thể nhập liệu
như textbox
- Label: điều khiển dùng để hiển thị nhãn văn bản
- PictureBox: điều khiển cho phép người dùng hiển thị
hình ảnh trên form
- RadioButton: tương tự checkbox tuy nhiên trong một
nhóm chỉ có một radiobutton được lựa chọn
- TextBox: điều khiển cho người dùng nhập liệu văn bản, thuộc tính
cần quan tâm nhất là Name và Text.
- Panel: là một khung để chứa các điều khiển khác, hoặc có thể là một vùng để vẽ
- ColorDialog: hộp thoại cho phép người dùng chọn màu sắc
- FontDialog: hộp thoại cho phép người dùng chọn font chữ
- OpenFileDialog: hộp thoại hỗ trợ người dùng duyệt mở các file trong máy tính
- SaveFileDialog: hộp thoại hỗ trợ người dùng lưu một file từ ứng dụng vào máy
tính
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
97
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
4.2. Tổng quan về đồ họa trong winform
Trong phần 4.1 chúng ta đã được làm quen với winform và các điều khiển căn
bản trên winform. Trong phần này, chúng ta sẽ đi sâu hơn về đồ họa trong winform,
làm thế nào để vẽ được các đối tượng đồ họa (điểm, đoạn thẳng, hình tròn, hình chữ
nhật...), hình ảnh, văn bảnlên form.
.Net framwork sử dụng một giao diện lập trình ứng dụng (API) được nâng cấp
lên từ Windows Graphics Device Interface (GDI) gọi à GDI+. GDI+ cung cấp một thư
viện các lớp cho phép chúng ta làm việc với các đối tượng đồ họa hai chiều như là các
đối tượng hình học cơ bản, hiển thị văn bản, hình ảnh và in ấn. Tuy nhiên, mặc dù GDI
+ được cải thiện nhiều so với GDI ban đầu, nhưng nó vẫn chỉ là một thư viện đồ họa
hai chiều đơn giản, không có các tính năng cao cấp như diễn hoạt hay các hiệu ứng ba
chiều.
GDI+ cung cấp các chức năng xử lý các đối tượng đồ họa thông qua các
NameSpace sau:
1. System::Drawing cung cấp các chức năng vẽ căn bản
2. System::Drawing::Drawing2D cung cấp các chức năng cao cấp hơn cho việc
thao tác với các đối tượng đồ họa 2D
3. System::Drawing::Imaging cung cấp các phương thức làm việc với ảnh
4. System::Drawing::Text cung cấp các phương thức làm việc với văn bản
5. System::Drawing::Printing giúp xử lý in ấn
4.3. Làm quen với các đối tượng đồ họa
4.3.1. NameSpace System::Drawing
NameSpace System::Drawing cung cấp cách thức truy cập tới các chức năng
đồ họa căn bản trong GD+. Dưới đây là bảng liệt kê danh sách các lớp chính trong
namespace này:
Tên lớp Mô tả
Bitmap Làm việc với một bitmap. Lớp này có thể làm việc với nhiều
định dạng ảnh khác nhau như: BMP, GIF, và JPG
Brush Lớp này được sử dụng để tô màu cho hình
Color Lớp màu sắc
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
98
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Font Thao tác với font chữ
Graphics Đây sẽ là lớp thực hiện mọi thao tác đồ họa
Icon Làm việc với một biểu tượng (icon)
Pen Sử dụng để vẽ hình ( hình rỗng chưa tô màu)
Point 2 lớp được sử dụng để thao tác với điểm
Rectangle Thao tác với hình chữ nhật
Region Thao tác với một vùng
Size Trình bày một kích thước
StringFormat Giúp làm việc với các thông tin trình bày văn bản
TextureBrush Tương tự lớp Brush tuy nhiên nó sử dụng hình ảnh để tô màu
4.3.2. Lớp Graphics
Khi cần vẽ lên một form chúng ta cần phải xem xét tới rất nhiều vấn đề. Ví dụ
như, vẽ cái gì, vẽ màu như thế nào? Nó sẽ được hiển thị trên loại thiết bị nào? Màu
sắc, độ phân giải của thiết bị ra sao?... Tuy nhiên không cần quá lo lắng vì GD+ đã
giúp bạn giải quyết được các vấn đề đó thông qua lớp Graphics, lớp này sẽ đại diện
như một vùng vẽ lý tưởng cho chúng ta. Lớp Graphics cung cấp rất nhiều thao tác hỗ
trợ chúng ta trong việc vẽ (trình bày) và hiển thị các đối tượng đồ họa (điểm, đường,
đa giác...).
Tạo một đối tượng Graphics: Một đối tượng Graphics được tạo ra mà không sử dụng
bất kì phương thức khởi tạo nào của lớp Graphics, mà nó sẽ sử dụng phương thức tạo
hoặc thuộc tính của các đối tượng mà nó được gắn vào. Vì một đối tượng Graphics
được tạo ra luôn phải được gắn với một đối tượng nào đó. Ví dụ như gắn với một
form, một panel, pictureboxnghĩa là khi tạo ra một đối tượng Graphics thì chúng ta
cần phải chỉ ra được rằng đối tượng này sẽ thực hiện việc vẽ của nó tại đâu.
Tạo một đối tượng gắn với form:
Graphics^ pg = myForm->CreateGraphics();
Tạo một đối tượng mà nó sẽ vẽ trên một panel:
Graphics^ pg = myPanel->CreateGraphics();
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
99
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
4.3.3. Vẽ
Các thao tác vẽ cơ bản được thực hiện bằng cách sử dụng các đối tượng Pen (bút vẽ)
và đối tượng Brush (cọ tô màu). Trong khi các đối tượng Pen được sử dụng để vễ
đường và các đường nét bao quay một hình thì các đối tượng Brush dùng để tô màu
cho phần trong của các hình đó.
Đối tượng Pen
Cách tạo một đối tượng Pen căn bản
// Tạo một bút màu đen với độ rộng nét vẽ là 1pixel (mặc định)
Pen^ pen1 = gcnew Pen(Color::Black);
// Tạo một bút màu đỏ với động rộng nét vẽ là 2pixel
Pen^ pen2 = gcnew Pen(Color::Red, 2.0);
Ta thấy việc tạo ra 2 bút ở ví dụ trên có sử dụng một tham số để định nghĩa màu vẽ
cho chúng, ở 2 ví dụ trên ta sử dụng thuộc tính tĩnh để thể hiện 2 màu đỏ và đen, bạn
có thể tùy chỉnh màu sắc của đối tượng này bằng cách sử dụng đối tượng thuộc lớp
Color.
Đối tượng Brush
Có rất nhiều loại cọ tô màu khác nhau, tất cả chúng đều kế thừa từ lớp Brush.
Trong đó, loại cọ SolidBrush là loại cọ đơn giản nhất, nó sẽ tiến hành tô màu vùng
được tô với màu thuần nhất (soilid color).
// tạo một cọ tô màu xanh da trời
SolidBrush^ br1 = gcnew SolidBrush(Color::Blue);
Một đối tượng thuộc lớp TextureBrush lại sử dụng một ảnh như là chất liệu để tô lên
các đối tượng cần tô. Nếu ảnh nhỏ hơn hình cần tô thì nó sẽ tiến hành tô như kiểu lát
gạch.
// tạo một TextureBrush sẽ được tô theo kiểu lát gạch
TextureBrush^ br2 = gcnew TextureBrush(gcnew Bitmap("brush.bmp"),
WrapMode::Tiled);
4.3.4. Các thao tác vẽ cơ bản
Chúng ta đã có bút vẽ, cọ tô màu, trong phần này chúng ta sẽ đi tìm hiểu về các thao
tác vẽ cơ bản. Lớp Graphics cung cấp cho chúng ta rất nhiều phương thức vẽ, bảng
dưới đây là danh sách một số phương thức vẽ phổ biến, hay sử dụng nhất.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
100
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Phương thức Mô tả
Clear Tô màu kín toàn bộ vùng vẽ
DrawClosedCurve, FillClosedCurve Vẽ và tô màu một đường cong kín
DrawCurve Vẽ đường cong
DrawEllipse, FillEllipse Vẽ và tô màu hình elip
DrawIcon Vẽ một biểu tượng
DrawImage Vẽ một hình ảnh
DrawLine Vẽ đường thẳng
DrawPolygon, FillPolygon Vẽ và tô màu đa giác
DrawRectangle, FillRectangle Vẽ và tô màu hình chữ nhật
DrawString Vẽ một chuỗi văn bản
Ví dụ:
//tạo đối tượng đồ họa
Graphics^ gr=this->CreateGraphics();
//tạo bút vẽ
Pen^ p = gcnew Pen(Color::Black);
//tạo cọ tô màu
SolidBrush^ br= gcnew SolidBrush(Color::Blue);
//vẽ đường thẳng
gr->DrawLine(p,0,0,200,200);
//vẽ hình elip
gr->DrawEllipse(p, 20, 20, 60, 80);
//tô màu hình elip
gr->FillEllipse(br,20,20,60,80);
//vẽ hình chữ nhật
gr->DrawRectangle(p,50,50,60,100);
//tô màu hình chữ nhật
gr->FillRectangle(br,100,100,60,100);
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
101
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
//vẽ một đường cong kín
PointF point1 = PointF(50.0F,50.0F);
PointF point2 = PointF(100.0F,25.0F);
PointF point3 = PointF(200.0F,5.0F);
PointF point4 = PointF(250.0F,50.0F);
PointF point5 = PointF(300.0F,100.0F);
PointF point6 = PointF(350.0F,200.0F);
PointF point7 = PointF(250.0F,250.0F);
array^ curvePoints =
{point1,point2,point3,point4,point5,point6,point7};
float tension = 1.0F;
FillMode aFillMode = FillMode::Alternate;
gr->DrawClosedCurve( p, curvePoints,tension, aFillMode);
//vẽ tập đường thẳng
//gr->DrawLines(p, curvePoints );
//vẽ đa giác
Pen^ blackPen = gcnew Pen( Color::Black,3.0f );
// Draw polygon to screen.
gr->DrawPolygon( blackPen, curvePoints );
4.4. Vẽ theo sự kiện
Trong lập trình Winform cung cấp cho chúng ta rất nhiều control khác nhau,
các control này lại được định nghĩa sẵn rất nhiều sự kiện. Vẽ theo sự kiện có thể được
hiểu là chúng ta lập trình sao cho việc vẽ gắn với một sự kiện nào đó xảy ra khi người
dùng tương tác với form và các control thông qua một hành động nào đó (bấm nút,
click chuột, nhấn phím, chọn một danh sách).
Vẽ theo sự kiện tương tác với một control (nhấn nút)
Với một nút bấm thì sự kiện thường dùng nhất là sự kiện click, ví dụ sau đây
sẽ trình bày cách vẽ theo sự kiện click của một nút bấm
Ví dụ vẽ theo sự kiện nhấn một nút bấm trên form:
Bước 1. Tạo một project C++ Windows Forms Application mới đặt tên là CppDraw.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
102
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Bước 2. Sử dụng khung Properties đổi tiêu đề form thành Drawing hoặc bất kỳ cái gì
bạn muốn, đặt kích thước form khoảng 300x300 pixels.
Bước 3. Từ khung toolbox kéo thả một button vào form, tùy chỉnh các thuộc tính cần
thiết (Name, Text, Location) cho button.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
103
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Để viết mã lệnh thực thi cho sự kiện click chuột vào nút ta chọn nút, di chuyển sang
khung Properties chọn tab event (biểu tượng hình tia sét), tại đây sẽ hiện ra một danh
sách rất nhiều các event gắn với button này, tìm tới Click và kích đúp vào đó hoặc
cách đơn giản nhất là click đúp vào nút trong form. Sau khi tiến hành thao tác như trên
VS sẽ tự sinh ra cho chúng ta một hàm (trong ví dụ này là hàm drawBtn_Click) và tất
cả những gì chúng ta viết trong hàm đó sẽ được thực thi khi nút được bấm.
private: System::Void drawBtn_Click(System::Object^ sender, System::EventArgs^
e)
{
// Tạo một đối tượng Graphics
Graphics^ pg = CreateGraphics();
// Tạo một bút vẽ
Pen^ pen1 = gcnew Pen(Color::Red);
// Vẽ một đường thẳng
pg->DrawLine(pen1, 20, 20, 100, 250);
// Hủy đối tượng Graphics
delete pg;
}
Vậy kết quả sau khi viết xong code, thực thi chương trình, ta bấm nút thì chương trình
sẽ vẽ cho chúng ta một đường thẳng màu đỏ từ tọa độ (20,20) đến (100,250)
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
104
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Chúng ta có thể thay đổi code thực thi trong hàm thành như sau:
// Tạo bút vẽ màu Blue, kích thước 3 pixel
Pen^ pen2 = gcnew Pen(Color::Blue, 3.0);
//Tạo nét vẽ kiểu nét đứt
pen2->DashStyle = Drawing2D::DashStyle::DashDotDot;
//Vẽ một đoạn thẳng với bút vừa tạo từ (10,120) đến (250,60)
pg->DrawLine(pen2, 10, 120, 250, 60);
// Tạo một cọ vẽ màu đỏ
SolidBrush^ sb1 = gcnew SolidBrush(Color::Red);
//Vẽ một hình chữ nhật và tô màu cho nó bằng cọ vẽ vừa tạo (không vẽ viền)
pg->FillRectangle(sb1, 60,30, 40,40);
// Vẽ một hình chữ nhật với bút màu đỏ (viền đỏ), và trong tô màu vàng
SolidBrush^ sb2 = gcnew SolidBrush(Color::Yellow);
pg->FillRectangle(sb2, 90, 40, 45, 45);
pg->DrawRectangle(pen1, 90, 40, 45, 45);
// Vẽ một hình elip và tô màu xanh
SolidBrush^ sb3 = gcnew SolidBrush(Color::Green);
pg->FillEllipse(sb3, 30,100, 65, 50);
và kết quả sau khi click
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
105
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Vẽ theo sự kiện tương tác với chuột
Để biết được .Net cung cấp cho chúng ta những sự kiện tương tác nào với
chuột ta chọn khung Properties, chọn tab Event kéo xuống phí dưới ta sẽ nhìn thầy một
loạt các sự kiện về Mouse liên quan tới đối tượng đang được chọn bên form nghĩa là
các sự kiện của chuột này sẽ xảy ra khi ta làm hành động tương ứng với đối tượng
đang được chọn bên form (có thể là form hoặc các điều khiển trong form). Để hiểu rõ
hơn về việc vẽ theo sự kiện tương tác với chuột chúng ta sẽ đi làm một ví dụ.
Ví dụ vẽ đoạn thẳng với tọa độ phụ thuộc vào tọa độ chuột trên đối tượng:
Ta tiếp tục làm việc trên project đã được ta ra ở phần trên. Ta khai báo thêm
hai biến thành viên theo kiểu Point để lưu tọa đọ điểm đầu và điểm cuối của đoạn
thẳng.
Trong các sự kiện về chuột được liệt kê trong khung Properties có sự kiện
MouseDown xảy ra khi ta nhấn chuột và sự kiện MouseUp xảy ra khi ta nhả chuột,
chúng ta sẽ sử dụng 2 sự kiện này.
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
106
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Code thực hiện cho sự kiện MouseDown: Khi nhấn chuột ta sẽ lấy tọa độ hiện tại của
chuột trên form và gán cho điểm p1
private: System::Void Form1_MouseDown(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{
p1.X = e->X;//Tọa độ X của chuột được gán cho X của điểm p1
p1.Y = e->Y;// Tọa độ Y của chuột được gán choY của điểm p1
}
Tương tự với sự kiện MouseUp và sau khi lấy được tọa độ khi nhả chuột gán cho p2 ta
tiến hành vẽ đoạn thẳng ngay với điểm bắt đầu là p1 và kết thúc ở p2
private: System::Void Form1_MouseUp(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{
p2.X = e->X;
p2.Y = e->Y;
Graphics^ gr = CreateGraphics();
Pen^ pen1 = gcnew Pen(Color::Black);
gr->DrawLine(pen1, p1.X, p1.Y, p2.X, p2.Y);
//gr->Dispose();
delete gr;
}
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
107
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
4.5. Sử dụng màu sắc, fonts
4.5.1. Sử dụng màu sắc
Vấn đề Color (màu sắc) được trình bày trong cấu trúc
System::Drawing::Color và được tạo lên từ 4 thành phần R, G, B và A. Ba thành phần
đầu tiên đại diện cho 3 yếu tố đỏ (R), xanh lá cây (G), xanh da trời (B) của một màu
theo hệ màu RGB, các giá trị này nằm trong khoảng từ 0 đến 255. Thành phần A trình
bày độ trong suốt của màu sắc và cũng có giá trị chạy từ 0 (trong suốt hoàn toàn) đến
255 (mờ hoàn toàn). Cũng giống như Graphics, cấu trúc Color không có hàm khởi tạo.
Chúng ta có thể tạo ra một thể hiển của cấu trúc Color bằng 3 phương thức sau đây:
- FromArgb: tạo ra một Color từ tập các giá trị A, R, G, B.
// Tạo một đối tượng màu đỏ với độ trong suốt là 255 (mờ đục hoàn toàn)
Color c1 = Color::FromArgb(255, 255, 0, 0);
- FromKnownColor: tạo ra một Color từ thành phần KnownColor. Lớp Color định
nghĩa ra một số lượng rất lớn các thuộc tính để trình bày các màu sắc được định nghĩa
bởi hệ thống bao gồm một dãy các màu từ AliceBlue cho đến YellowGreen. Kiểu liệt
kê KnownColor định nghĩa một danh sách các màu trong hệ thống, nó bao gồm các
màu chuẩn được định nghĩa sẵn, chính là các màu sắc được sử dụng trong Windows
GUI như ActiveCaption và WindowText. Các giá trị màu sắc này có thể được thay đổi
nếu người dùng điều chỉnh màu sắc desktop trong Control Panel.
// Khởi tạo một màu chuẩn từ KnownColor
Color c2 = Color::FromKnownColor(KnownColor::Cornsilk);
- FromName: tạo một Color với tham số là tên màu
//Tạo một màu với tên là Blue
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
108
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Color c1 = Color::FromName( "Blue" );
//Thêm một cách nữa để tao ra một màu
Color c3 = Color::Cornsilk;
Chú ý rằng khi một màu đã được tạo ra thì không thể thay đổi giá trị của nó. Nếu cần
thay đổi một màu, bạn sẽ phải tạo ra một màu mới dựa trên một màu đã có.
Ví dụ:
// tạo ra một màu đỏ
Color c4 = Color::FromArgb(255, 255, 0, 0);
// tạo ra một màu khác dựa trên màu c4 và thay đổi thông số độ trong suốt
Color c5 = Color::FromArgb(127, c4.R, c4.G, c4.B);
Ngoài các cách sử dụng màu sắc ở trên thì trong lập trình winform còn hỗ trợ chúng ta
một cách sử dụng màu sắc rất trực quan và thuận tiện cho người sử dụng đó là sử dụng
control hộp thoại màu ColorDialog.
- Cú pháp khai báo và gọi một ColorDialog như sau:
//Khai báo
ColorDialog^ MyDialog = gcnew ColorDialog;
//Gọi nó ra
MyDialog->ShowDialog();
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
109
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
- Sau khi ColorDialog được gọi ra, người sử dụng chọn màu sắc ưng ý và nhấn ok thì
ta có thể sử dụng màu sắc vừa được chọn đó thông qua thuộc tính quan trọng nhất của
ColorDialog đó là thuộc tính: Color
Ví dụ sử dụng ColorDialog:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^
e) {
//Tạo đối tượng hộp thoại màu
ColorDialog^ MyDialog = gcnew ColorDialog;
//tạo đối tượng đồ họa trên panel1
Graphics^ gr=panel1->CreateGraphics();
//Sau khi chọn xong màu và nhấn ok sẽ thực hiện tô toàn bộ vùng vẽ theo màu chọn
if ( MyDialog->ShowDialog() ==
::System::Windows::Forms::DialogResult::OK )
{
gr->Clear(MyDialog->Color);
}
}
4.5.2. Sử dụng fonts
Trong namspace System::Drawing có cung cấp cho chúng ta lớp Font để làm
việc với font chữ. Một đối tượng của lớp Font sẽ trình bình một font với một số thuộc
tính như tên, kích cỡ hay kiểu font. Bảng dưới đây liệt kê một số thuộc tính của lớp
Font, các thuộc tính này là thuộc tính chỉ đọc (read-only) nghĩa là khi đã tạo ra đối
tượng Font với các thuộc tính được khai báo thì các thuộc tính này không thể thay đổi
được nữa.
Thuộc tính Mô tả
Bold Có giá trị True nếu style của font là in đậm (Bold)
FontFamily Trả về họ font của font hiện tại
Height Trả về độ cao
Italic Có giá trị True nếu style của font là in nghiêng (Italic)
Name Trả về tên font
Size Kích thước font
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
110
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Strikeout Trả về true nếu font có style là kiểu gạch giữa
Style Trả về thông tin kiểu (style) của font
Underline Trả về true nếu font có style là kiểu gạch chân
Unit Trả về kiểu đơn vị đo của font. Mặc định là pixels
Style của font có thể được kết hợp từ nhiều giá trị thuộc tập hợp FontStyle, nó bao gồm
Bold, Italic, Regular, Strikeout, và Underline. Một font được tạo ra có thể gồm một
hoặc nhiều Style.
Cú pháp khai báo sử dụng một font như sau:
//Khai báo một font, bạn nên khai báo rõ ràng từ NameSpace để tránh nhầm với thuộc tính
/font của Form
private: System::Drawing::Font^ font1;
//Tạo font với một style
font1 = gcnew System::Drawing::Font("Verdana", 8, FontStyle::Regular,
GraphicsUnit::Millimeter);
//Tạo font với nhiều style ta dùng dấu | để phân biệt giữa các style
font1 = gcnew System::Drawing::Font("Verdana", 8, FontStyle::Regular|FontStyle::Italic,
GraphicsUnit::Millimeter);
trong đó
- “Verdana” là tên font, có rất nhiều tên font ví dụ như “Tahoma”, “Times New
Roman”
- 8: kích cỡ font
- FontStyle::Regular: kiểu font có thể là Bold, Italic, Regular, Strikeout, và Underline
- GraphicsUnit::Millimeter: xách định đơn vị đo của font nó có thể là các giá trị: Inch,
Millimeter, Pixel.
Sau đây là ví dụ vẽ một dòng text theo sự kiện click chuột như ví dụ trước tuy nhiên
lần này ta sẽ vẽ ra một dòng text khi chuột phải được click:
private: System::Void Form1_MouseUp(System::Object^ sender,
System::Windows::Forms::MouseEventArgs^ e)
{
Graphics^ gr = CreateGraphics();
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
111
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
Pen^ pen1 = gcnew Pen(Color::Black);
//Chuột trái được click
if (e->Button == ::CppDraw::MouseButtons::Left)
{
// vẽ đoạn thẳng
p2.X = e->X;
p2.Y = e->Y;
gr->DrawLine(pen1, p1.X,p1.Y, p2.X,p2.Y);
}
//Nếu chuột phải được click
else if (e->Button == ::CppDraw::MouseButtons::Right)
{
// Vẽ text với font1, chữ màu đen, tại vị trí click chuột phải
gr->DrawString(L"Right click Text", font1, Brushes::Black, (float)e->X,
(float)e->Y);
}
delete gr;
}
Tương tự như màu sắc, đối với việc sử dụng font chữ, lập trình winform cũng hỗ trợ
chúng ta một cách sử dụng trực quan thông qua hộp thoại font
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
112
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
- Cú pháp khai báo và gọi một FontDialog như sau:
//Khai báo
FontDialog^ MyDialog = gcnew ColorDialog;
//Gọi nó ra
MyDialog->ShowDialog();
- Sau khi FontDialog được gọi ra, người sử dụng chọn font chữ và nhấn ok thì ta có thể
sử dụng font đó thông qua thuộc tính Font của ColorDialog, ngoài ra FontDigalog còn
cho phép chúng lựa chọn và sử dụng màu sắc (một số màu cơ bản).
Ví dụ sử dụng FontDialog:
//khai báo
FontDialog^ myFd=gcnew FontDialog();
//cho phép chọn màu sắc
myFd->ShowColor=true;
//tạo đối tượng đồ họa
Graphics^ gr=panel1->CreateGraphics();
tạo cọ tô màu với màu lấy từ Fontdiglog
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
113
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
SolidBrush^ br= gcnew SolidBrush(myFd->Color);
//Sau khi chọn màu xong nhấn Ok sẽ vẽ chuỗi
if ( myFd->ShowDialog() == ::System::Windows::Forms::DialogResult::OK )
{
gr->DrawString("Day la vi du ve font chu",myFd->Font,br,20,50);
}
4.6. Thao tác với hình ảnh
Để làm việc với hình ảnh chúng ta sử dụng lớp Bitmap được cung cấp sẵn trong
System::Drawing. Lớp này hỗ trợ chúng ta trong việc trình bày và thao tác với một số
định dạng ảnh như jpg, png, gif Lớp Bitmap là một bản tóm lược của GDI + bitmap, nó
bao gồm tập các dữ liệu pixel của hình ảnh và thuộc tính của nó. Một bitmap là một đối tượng
được sử dụng để làm việc với ảnh như một tập hợp các điểm ảnh (pixel). Bảng dưới đây liệt
kê một số thuộc tính và phương thức phổ biến của lớp Bitmap.
Thuộc tính Mô tả
Height Trả về chiều cao bằng của ảnh (pixel)
HorizontalResolution Trả về độ phân giải ngang (pixel/inch)
Palette Trả về hoặc thiết lập bảng màu
PhysicalDimension Trả về kích thước của ảnh
PixelFormat Trả về định dạng điểm ảnh
RawFormat Trả về định dạng ảnh
Size Trả về chiều rộng và chiều cao của ảnh (pixel)
VerticalResolution Trả về độ phân giải dọc (pixel/inch)
Width Trả về độ rộng của ảnh (pixel)
Phương thức
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
114
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
FromFile Tạo ra một ảnh từ file
FromHbitmap Tạo ra một ảnh Bitmap từ một Windows handle
FromHicon Tạo ra một ảnh Bitmap từ một Windows handle thành icon.
FromResource Tạo ra một ảnh Bitmap từ một Windows resource.
FromStream Tạo ra một ảnh Bitmap từ một data stream
GetBounds Trả về đường bao của ảnh
GetPixel Trả về một điểm ảnh ( Color)
GetThumbnailImage Tạo ảnh thumbail
IsAlphaPixelFormat
Trả về giá trị để biểu thị xem pixel có chứa thông tin alpha
hay không
LockBits Khóa một Bitmap trong bộ nhớ hệ thống
MakeTransparent Tạo độ trong suốt mặc định cho ảnh
RotateFlip Quay, lật ảnh
Save Lưu ảnh
SetPixel Thiết lập một điểm ảnh cho ảnh
SetResolution Thiết lập độ phân giải cho ảnh
UnlockBits Mở khóa ảnh này ra khỏi bộ nhớ hệ thống
Ví dụ: Vẽ một ảnh lên form
// Vẽ một ảnh của tên là ramp1.gif, ảnh này đặt cùng thư mục với file nguồn chương trình
Bitmap^ bmp = gcnew Bitmap(L"ramp1.gif");
gr->DrawImage(bmp, 10,10);//Vẽ ảnh tại vị trí 10,10
Như đã trình bày ở trên, một đối tượng của lớp Bitmap sẽ trình bày một ảnh như là
một tập hợp các pixel, trong khi xử lý ảnh số ta thường thao tác xử lý ảnh dựa trên các
pixel này, để lấy thông tin của một điểm ảnh ta dùng phương thức GetPixel, để thiết
lập một điểm ảnh (pixel) cho ảnh ta sử dụng SetPixel.
Ví dụ sau đây minh họa cho việc load một ảnh, đọc từng điểm ảnh của nó và thay
thành điểm ảnh khác:
private:
Bitmap^ image1;
void Button1_Click( System::Object^ /*sender*/, System::EventArgs^ /*e*/ )
{
Bài giảng Kỹ thuật lập trình – Ngành Truyền thông đa phương tiện
115
Bộ môn Truyền thông đa phương tiện – Trường Đại học Công nghệ thông tin và truyền thông
try
{
// Đọc ảnh từ máy tính
image1 = gcnew Bitmap( "C:\\Documents and Settings\\All Users\\"
"Documents\\My Music\\music.bmp",true );
int x;
int y;
// Duyệt toàn bộ điểm ảnh
for ( x = 0; x Width; x++ )
{
for ( y = 0; y Height; y++ )
{
Color pixelColor = image1->GetPixel( x, y );
Color newColor = Color::FromArgb( pixelColor.R, 0, 0 );
image1->SetPixel( x, y, newColor );
}
}
// Hiển thị ảnh lên picturebox
PictureBox1->Image = image1;
}
catch ( ArgumentException^ )
{
MessageBox::Show( "There was an error."
"Check the path to the image file." );
}
}
Các file đính kèm theo tài liệu này:
- bai_giang_c_p2_5107.pdf