Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Chơng 8
Màn hình và cửa sổ - Đồ hoạ - âm thanh
8.1. Quản lý màn hình và cửa sổ
8.1.1. Màn hình kiểu văn bản
Hàm chọn kiểu màn hình văn bản:
void textmode(int mode);
Trong đó:
Ký hiệu
Giá trị mode
Mốt văn bản
LASTMODE
-1
trớc đó
BW40
0
đen trắng 40 cột
C40
1
16 màu, 40 cột
BW40
2
đen trắng 80 cột
C80
3
16 màu, 80 cột
MONO
7
đơn sắc 80 cột
Ví dụ chọn mốt 16 màu 80 cột:
textmode(C80);
Chú ý: Các ký hiệu trong bảng trên đã đợc định nghĩa trong tệp
conio.h. Màn hình ở mốt văn bản bao gồm 25 dòng.
8.1.2. Đặt mầu nền, mầu chữ
Đặt mầu nền cho màn hình (cửa sổ hiện hành):
void textbackground(int color);
Đặt mầu chữ:
void textcolor(int color);
Bảng sau đây cho biết các thông tin về màu (các hằng số về màu chứa
trong trong tệp conio.h và graphis.h).
98
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Ký hiệu
Mầu
Giá trị color
Mầu nền, chữ
BLACK
đen
0
cả hai
BLUE
xanh da trời
1
cả hai
GREEN
xanh lá cây
2
cả hai
CYAN
xanh lơ
3
cả hai
RED
đỏ
4
cả hai
MAGENTA
tím
5
cả hai
BROWN
nâu
6
cả hai
LIGHGRAY
xám nhạt
7
cả hai
DACKGRAY
xám sẫm
8
màu chữ
LIGHGBLUE
xanh nhạt
9
màu chữ
LIGHGREEN
xanh nhạt
10
màu chữ
LIGHTCYAN
xanh nhạt
11
màu chữ
LIGHTRED
đỏ nhạt
12
màu chữ
LIGHTMAGENTA
tím nhạt
13
màu chữ
YELLOW
vàng
14
màu chữ
WHITE
trắng
15
màu chữ
Ví dụ: Đặt chữ màu trắng trên nền xanh da trời.
textcolor(WHITE);
// hoặc textcolor(15);
textbackground(BLUE); // hoặc textbackground(1);
8.1.3. Xây dựng cửa sổ
Cửa sổ là một hình chữ nhật trên màn hình. Để tạo một cửa sổ hãy dùng
lệnh sau:
void window(int x1, int y1, int x2, int y2);
Hàm này sẽ tạo một cửa sổ có toạ độ góc trái bên trên là (x1, y1), toạ độ
góc phải bên dới là (x2, y2) và đa con trỏ màn hình về góc trái trên (toạ độ
0, 0) của cửa sổ mới đợc tạo ra. Chú ý rằng x2 >= x1, y2 >= y1.
Hàm chuyển con trỏ màn hình tới một điểm (x, y):
99
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
void gotoxy(int x, int y);
Hàm xoá màn hình hay cửa sổ:
void clrscr(void);
Hàm trả về toạ độ x (ngang) của con trỏ trong cửa sổ hiện hành:
int wherex(void);
Hàm trả về toạ độ y (dọc) của con trỏ trong cửa sổ hiện hành:
int wherey(void);
Ví dụ chơng trình 8.1:
# include <conio.h>
void main()
{
textmode(C80);
textbackground(CYAN);
window(1,1,80,25);
clrscr();
textbackground(RED);
window(30, 10, 50, 15);
clrscr();
textcolor(YELLOW);
cprintf("%s", "Happy new year...");
getch();
}
8.2. Đồ hoạ
8.2.1. Khởi động hệ thống đồ hoạ của C
Các tệp điều khiển đồ hoạ của C thờng đợc đặt trong th mục
C:\TC\BGI, đó là các tệp *.BGI, *.CHR ... Các hàm và các hằng số đồ họa
đợc đặt trong tệp graphics.h.
Mục đích của việc khởi động hệ thống đồ hoạ là xác lập các thiết bị đồ
hoạ, mốt đồ hoạ sẽ sử dụng. Để khởi động đồ hoạ ta dùng hàm:
void initgraph(int *driver, int *mode, char *path);
Trong đó:
driver : là thiết bị điều khiển đồ hoạ.
mode : là mốt đồ hoạ.
100
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
path : đờng dẫn của th mục chứa các tệp điều khiển đồ hoạ.
Ví dụ: Giả sử máy tính có màn hình VGA, các tệp tin đồ hoạ nằm trong
th mục C:\TC\BGI, ta có thể khởi động hệ thống đồ hoạ nh sau:
int driver = VGA;
int mode = VGAHI;
initgraph(&driver, &mode, C:\TC\BGI);
Các thông tin về điều khiển đồ hoạ của C hay xem trong các referent C.
Khởi động hệ thống đồ hoạ tự động: gán hằng DETECT cho driver của
initgraph().
Ví dụ:
int driver = DETECT;
int mode;
initgraph(driver, mode, C:\TC\BGI);
Khi đó sẽ khởi tạo đồ hoạ theo kiều và độ phân giải cao nhất có thể.
Trong trờng hợp này hãy dùng hàm getmaxx() và getmaxy() để xác định
kích thớc màn hình đồ hoạ đang sử dụng.
Sau khi thực hiện xong công việc đồ hoạ, ta nên đóng chế độ đồ hoạ lại
để khỏi làm ảnh hởng đến một số việc khác bằng hàm:
void closegraph(void);
8.2.2. Lỗi đồ hoạ
Để phát hiện lỗi đồ hoạ, hãy dùng hàm:
int graphresult(void);
Nếu việc khởi động hệ thống đồ hoạ thành công thì hàm graphresult()
trả về giá trị 0. Để biết đó là lỗi gì hãy dùng hàm:
char *grapherrormsg(int n);
trong đó n là mã lỗi do hàm graphresult trả về.
Ví dụ ta có thể dùng đoạn chơng trình nh sau để bắt lỗi đồ hoạ:
...
int error = graphresult();
if (error)
101
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
{
printf(grapherrormsg(error));
exit(1);
}
else
{
... // thực hiện công việc đồ hoạ
}
Ví dụ: chơng trình 8.2.
#include
#include
#include
#include
<graphics.h>
<stdio.h>
<conio.h>
void main()
{
int driver = DETECT, mode, error;
initgraph(&driver,&mode, "C:\\TC\\BGI");
error = graphresult();
printf("\nGia tri so cua man hinh: %d", driver);
if (error)
{
printf("\nLoi do hoa:%s",grapherrormsg(error));
exit(1);
}
else
{
setcolor(14);
// mầu nét vẽ
setbkcolor(1);
// mầu nền
//vẽ đờng tròn tâm ở giữa màn hình,bán kính=50
circle(getmaxx()/2, getmaxy()/2, 50);
}
getch();
closegraph();
}
8.2.3. Các hàm đồ hoạ
Đặt mầu nền:
void setbkcolor(int color);
102
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Đặt mầu đờng vẽ:
void setcolor(int color);
Chọn kiểu tô và màu tô:
void setfillstyle(int patten, int color);
Các giá trị của color xem trong mục 8.1.2.
Các giá trị của patten xem trong bảng sau:
Tên hằng
Giá trị
Mô tả kiểu tô
EMPTY_FILL
0
Tô bằng mầu nền
SOLID_FILL
1
Tô bằng đờng nét liền
LINE_FILL
2
Tô bằng - - -
LTSLASH_FILL
3
Tô bằng ///
SLALL_FILL
4
Tô bằng /// đậm
BKSLASH_FILL
5
Tô bằng \\\ đậm
LTBKSLASH_FILL
6
Tô bằng \\\
HATCH_FILL
7
Tô bằng đờng gạch bóng nhạt
XHATCH_FILL
8
Tô bằng đờng gạch bóng chữ thập
INTERLEAVE_FILL
9
Tô bằng đờng đứt quãng
WIDE_DOT_FILL
10
Tô bằng dấu chấm tha
CLOSE_DOT_FILL
11
Tô bằng dấu chấm mau
Kiểu tô và mầu tô đợc sử dụng trong các hàm pieslice, fillpoly, bar,
bar3d và floodfill ta sẽ xem sét sau.
Chọn giải mầu:
Để thay đổi giải màu đã đợc định nghĩa trong bảng ở mục 8.1.2 ta
dùng hàm:
void setpalette(int color1, int color2);
Ví dụ câu lệnh:
setpalette(0, LIGHTCYAN);
sẽ đổi mầu đầu tiên trong bảng mầu ở mục 8.1.2 thành mầu xanh lơ nhạt, các
mầu khác không bị ảnh hởng.
103
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Xác định giải mầu hiện hành:
voi getpalette(struct palettetype * palette);
ở đây palettetype là kiểu đã đợc định nghĩa trớc nh sau:
#define MAXCOLORS 15
struct palettetype
{
unsgned char size;
unsigned char colors[MAXCOLORS+1];
};
Trong đó:
size là số lợng màu trong palette.
colors là mảng chứa mầu có chỉ số chạy từ 0 tới size-1.
Hàm getcolor trả về mầu đã xác định trớc đó bằng hàm setcolor
Hàm getbkcolor trả về màu đã xá định trớc đó bằng hàm setbkcolor.
Hàm getmaxcolor trả về mầu cực đại thuộc giải mầu đang có hiệu lực.
Trên 256 K EGA, hàm này luôn cho giá trị 15.
8.2.4. Vẽ và tô màu
Vẽ điểm:
void putpixel(int x, int y, int color);
Vẽ một điểm tại toạ độ (x, y) theo màu xác định bởi color.
Vẽ đờng tròn:
void circle(int x, int y, int r);
Vẽ một đờng tròn với tâm tại điểm (x, y) và bán kính là r.
Vẽ cung tròn:
void arc(int x, int y, int gd, int gc, int r);
Vẽ cung tròn có tâm là (x, y), góc đầu là gđ, góc cuối là gc và bán kính
là r.
Vẽ ellipse:
104
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
void ellipse(int x, int y, int gd, int gc, int a, int b);
Vẽ đờng ellipse có tâm tại (x, y), góc đầu là gd, góc cuối là gc, bán
trục ngang là a, bán trục đứng là b.
Vẽ hình quạt:
void pieslice(int x, int y, int gd, int gc, int r);
Vẽ hình quạt có tâm tại (x, y), góc đầu là gd, góc cuối là gc, bán kính là
r.
Vẽ đờng gấp khúc và đa giác:
Muốn vẽ đờng gấp khúc đi qua n điểm (x1, y1), (x2, y2), ... (xn, yn),
trớc hết phải đa các toạ độ vào mảng a kiểu int, tức là gán x1 cho a[0], y1
cho a[1], ..., xn cho a[n-1], yn cho a[n] . Sau đó gọi hàm:
drawpoly(n, a);
Nếu (xn, yn) trùng với (x1, y1) thì nhận đợc đờng gấp khúc khép kín.
Vẽ đa giác:
fillpoly(n, a);
Vẽ và tô màu một đa giác có đỉnh làcác điểm (x1, y1), ..., (xn, yn). a là
ma trận chứa toạ độ các điểm nh trên.
Vẽ đờng thẳng:
void line(int x1, int y1, int x2, int y2);
Vẽ đờng thảng từ điểm (x1, y1) tới điểm (x2, y2) không làm thay đổi
vị trí con trỏ.
void lineto(int x, int y);
Vẽ đờng thảng từ điểm hiện tại tới điểm có toạ độ (x, y) và chuyển con
trỏ tới điểm (x, y).
void linerel(int dx, int dy);
Vẽ đờng thẳng từ điểm hiện tại (x, y) tới điểm (x+dx, y+dy) và chuyển
con trỏ tới vị trí mới.
Hàm chuyển con trỏ:
void moveto(int x, int y);
Chuyển con trỏ tới điểm (x, y).
105
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Vẽ hình chữ nhật
void rectangle(int x1, int y1, int x2, int y2);
Vẽ hình chữ nhật có các cạnh song song với cá cạnh của màn hình. Tọa
độ trên trái là (x1, y1) và tọa độ dới phải là (x2, y2).
void bar(int x1, int y1, int x2, int y2);
Vẽ và tô màu hình chữ nhật.
void bar3d(int x1, int y1, int x2, int y2, int depth, int top);
Vẽ và tô mầu khối chữ nhật. Tham số depth ấn định số điểm ảnh trên bề
sâu của khối ba chiều, tham số top có thể nhận giá trị 1 (TOPON) hoặc 0
(TOPOFF) xác định khối chữ nhật là có nắp hay không.
Chọn kiểu đờng vẽ:
void setlinestyle(int linestyle, int patten, int thickness);
Hàm này tác động đến nét vẽ của các hàm/thủ tục: line, lineto,
rectangle, drawpoly, circle ... Cho phép ấn định 3 yếu tố của đờng vẽ là
dạng, bề dày và mầu tự tạo.
Các giá trị có thể của tham số linestyle:
Hằng
Giá trị
Dạng nét vẽ
SOLID_LINE
0
Nét liền
DOTTED_LINE
1
Nét chấm
CENTER_LINE
2
Nét chấm gạch
DASHED_LINE
3
Nét gạch
USERBIT
4
Mẫu tự tạo
Bề dầy do tham số thickness ấn định, các giá trị có thể là:
NORM_WIDTH = 1
bề dầy bình thờng.
NORM_WIDTH = 3
bề dầy gấp ba.
Mẫu tự tạo: Nếu tham số thứ nhất là USERBIT_LINE thì có thể tạo ra
mẫu đờng thảng bằng tham số patten, ví dụ đoạn chơng trình:
int patten = 0x1010;
setlinestyle(USERBIT_LINE, patten, NORM_WIDTH);
106
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
line(0, 0, 100, 200);
Giá trị patten trong hệ 16 là 0x1010 còn trong hệ 2 là:
0001
000
0001
0000
Chỗ nào có bit 1 điểm sẽ sáng, bit 0 làm tắt điểm ảnh.
8.2.4. Cửa sổ Wiewport
Khái niệm:
Viewport là một vùng chữ nhật trên màn hình đồ hoạ, nó tựa nh
window trong textmode. Để thiết lập Viewport ta dùng hàm:
void setviewport(int x1, int y1, int x2, int y2, int clip);
Trong đó (x1, y1) là tọa độ góc trên trái, (x2, y2) là toạ độ góc dới
phải. Các tham số này phải thoả mãn:
0 <= x1 <= x2
0 <= y1 <= y2.
Tham số clip có thể nhận một trong hai giá trị:
clip = 1 không cho phép vẽ ra ngoài viewport.
clip = 0 cho phép vẽ ra ngoài viewport.
Sau khi thiết lập viewport, ta có hệ toạ độ mới mà góc trên bên trái của
viewport sẽ có toạ độ là (0, 0).
Xác nhận Viewport hiện hành:
Để xác nhận viewport hiện hành ta dùng hàm:
void getviewsettings(struct viewporttype *vp);
ở đây kiểu viewporttype đã đợc định nghĩa nh sau:
struct viewport
{
int left, top, right, bottom;
int clip;
};
Xoá Viewport:
Để xoá một viewport ta dùng hàm:
107
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
void clearviewport(void);
Xoá màn hình và đa con trỏ về (0, 0) của màn hình:
void cleardevice(void);
Khi thực hiện hàm này sẽ xoá mọi thứ trên màn hình.
Toạ độ âm dơng:
Nhờ Viewport ta có thể viết các chơng trình đồ hoạ theo toạ độ âm
dơng. Muốn vậy ta thiết lập viewport sao cho tâm tuyệt đối của màn hình là
góc trên bên trái của viewport và cho tham số clip = 0 để có thể vẽ ra ngoài
giới hạn của viewport. Đoạn trình sau thực hiện công việc trên:
int xc = getmaxx()/2, yc = getmaxy()/2;
setviewport(xc, yc, 2*xc, 2*yc, 0);
Nh vậy màn hình sẽ đợc chia thành 4 phần với toạ độ âm dơng nh
sau:
Phần t trái trên :
x âm, y âm.
Phần t trái dới :
x âm, y dơng.
Phần t phải trên :
x dơng, y âm.
Phần t phải dới:
x dơng, y dơng.
Ví dụ chơng trình 8.3 : Vẽ đồ thị hàm sinX.
#
#
#
#
#
#
include <graphics.h>
include <conio.h>
include
include <math.h>
define TYLEX 20
define TYLEY 80
void main()
{
int driver = DETECT, mode, xc, yc;
initgraph(&driver, &mode, "c:\\tc\\bgi");
if (graphresult() != 0) exit(1);
xc = getmaxx()/2; yc = getmaxy()/2;
108
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
setviewport(xc, yc, xc*2, yc*2, 0);
setcolor(YELLOW);
setbkcolor(BLUE);
// Ve cac truc toa do
line(-xc, 0, xc, 0);
line(xc-10, -5, xc, 0);
line(xc-10, 5, xc, 0);
// truc x
// mui ten tren truc x
// mui ten duoi truc x
line(0, -yc, 0, yc);
line(-5, -yc+10, 0, -yc);
line( 5, -yc+10, 0, -yc);
// truc y
// mui ten trai truc y
// mui ten phai truc y
outtextxy(5, 5, "0,0");
outtextxy(xc-10, 10, "X");
outtextxy(15, -yc+5, "Y");
// Ve ham sin(x)
int x, y, i;
for (i=-400; i<=400; i++)
{
x = (2*M_PI*i*TYLEX/200);
y = (sin(2*M_PI*i/200)*TYLEY);
putpixel(x, y, YELLOW);
}
getch();
closegraph();
}
8.2.5. Xử lý văn bản trên màn hình đồ hoạ
Hiển thị chuỗi ký tự:
void outtext(char *s);
Hàm này hiển thị chuỗi s tại vị trí con trỏ.
void outtextxy(int x, int y, char *s);
Hàm này hiển thị chuỗi s tại toạ độ (x, y).
109
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Fonts chữ:
Các fonts nằm trong các tệp .CHR, để chọn và nạp font hãy dùng hàm:
void settextstyle(int font, int direction, int size);
Tham số font để nhận kiểu chữ và có nhận một trong các giá trị sau:
Hằng
Giá trị
Kiểu chữ
DEFAULT_FONT
0
Mặc định
TRIPLEX_FONT
1
Triplex
SMALL_FONT
2
Nhỏ
SANS_SERIF_FONT
3
Sans Seif
GOTHIC_FONT
4
Gothic
Tham số direction xác định hớng hiển thị, nhận một trong hai giá trị
sau:
Hằng
Giá trị
Hớng hiển thị
HORIZ_DIR
0
Nằm ngang từ trái sang
phải
VERT_DIR
1
Thẳng đứng từ dới lên.
Tham số size là hệ số phóng đại, nhận giá trị từ 1 tới 10.
Vị trí hiển thị:
Hàm settextjustify cho phép ấn định nơi hiển thị văn bản so với vị trí
của con trỏ hay với toạ độ (x, y) của outtextxy. Hàm có dạng nh sau:
void settextjustify(int horiz, int vert);
Tham số horiz có thể nhận một trong các giá trị sau:
Hằng
Giá trị
Kiểu hiển thị
LEFT_TEXT
0
Văn bản hiện bên phải con trỏ
CENTER_TEXT
1
Chỉnh tâm văn bản theo vị trí
con trỏ
RIGHT_TEXT
2
Văn bản hiện bên trái con trỏ
110
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
Tham số vert có thể nhận một trong các giá trị sau:
Hằng
Giá trị
Kiểu hiển thị
BOTTOM_TEXT
0
Văn bản hiện bên trên con trỏ
CENTER_TEXT
1
Chỉnh tâm văn bản theo vị trí
con trỏ
TOP_TEXT
2
Văn bản hiện bên dới con trỏ
Ví dụ:
settextjustify(1, 1);
ottextxy(100, 100, ABC);
Kết quả là điểm (100, 100) sẽ nằm giữa chữ B.
8.2.6. Cắt dán hình, tạo ảnh chuyển động
Hàm unsigned imagesize(int x1, int y1, int x2, int y2) trả về số byte cần
thiết để lu trữ ảnh trong phạm vi hình chữ nhật (<x1, y1>, <x2, y2>).
Hàm void *malloc(unsigned n) trả về con trỏ trỏ tới vùng nhớ n byte
mới đợc cấp phát.
Hàm void getimage(int x1, int y1, int x2, int y2, void *bitmap) sao
chép các điểm ảnh của hình chữ nhật (<x1, y1>, <x2, y2>) và các thông
tin về bề rộng chiều cao của hình chữ nhật vào vùng nhớ do bitmap trỏ
tới. Vùng nhớ và và biến bitmap cho bởi hàm malloc, độ lớn của vùng
nhớ đợc xác định bằng hàm imagesize.
Hàm void putimage(int x, int y, void *bitmap, int copymode) để sao
lu ảnh trong vùng nhớ bitmap ra màn hình tại điểm (x, y). Tham số
copymode xác định kiểu sao chép ảnh, nó có thể nhận các giá trị sau:
Hằng
Giá trị
Kiểu hiển thị
COPY_PUT
0
Sao chép nguyên si.
XOR_PUT
1
Các điểm ảnh trong bitmap kết hợp với
các điểm ảnh trên màn hình bằng phép
XOR
111
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
OR_PUT
2
Các điểm ảnh trong bitmap kết hợp với
các điểm ảnh trên màn hình bằng phép
OR
AND_PUT
3
Các điểm ảnh trong bitmap kết hợp với
các điểm ảnh trên màn hình bằng phép
AND
NOT_PUT
4
Các điểm ảnh xuất hiện trên màn hình
đảo ngợc (NOT) với ảnh trong bitmap
Chú ý: Nếu dùng XOR_PUT để chép hình, rồi lặp lại câu lệnh đó thì
hình sẽ bị xoá và màn hình trở lại nh cũ. Kỹ thuật này dùng để tạo ccác
hình ảnh chuyển động.
Tạo ảnh chuyển động:
Nguyên tắc tạo ảnh giống nh phim hoạt hình:
- Vẽ một hình.
- Để trễ một thời gian xác định.
- Xoá hình đó.
- Vẽ hình tiếp theo.
- Để trễ một thời gian xác định.
...
Vẽ hình:
- Cách 1: Vẽ lại hình ở các vị trí khác nhau.
- Cách 2: Lu ảnh vào một vùng nhớ, rồi đa ảnh ra màn hình
ở các vị trí khác nhau.
Xoá ảnh:
- Cách 1: Dùng hàm cleardevice.
- Cách 2: Dùng hàm putimage (mode XOR_PUT) để xếp
chồng lên ảnh cần xoá.
- Cách 3: Lu trạng thái màn hình vảo một nơi nào đó, vẽ ảnh,
đa trạng thái cũ màn hình ra đè lên ảnh vừa vẽ.
Ví dụ1 : Cắt dán ảnh.
112
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
// Minh hoa cat dan anh
#include <conio.h>
#include <graphics.h>
#include <alloc.h>
void main()
{
int drive = DETECT, mode;
initgraph(&drive, &mode, "c:\\tc\\bgi");
bar(0, 0, getmaxx(), getmaxy());
unsigned size = imagesize(10, 20, 30, 40);
char *p = (char*)malloc(size);
getimage(10, 20, 30, 40, p);
getch();
cleardevice();
putimage(getmaxx()/2, getmaxy()/2, p, COPY_PUT);
getch();
closegraph();
}
Ví dụ 2: ảnh chuyển động.
//Chuong trinh ve duong Archimedian
#
#
#
#
include <conio.h>
include <graphics.h>
include <math.h>
define K 2
void archimed()
{
double goc = 0.0, f, xc, yc;
xc = getmaxx() / 2; yc = getmaxy() / 2;
setviewport(xc, yc, 2*xc, 2*yc, 0);
setbkcolor(BLUE);
while (!kbhit())
{
f = K * goc;
putpixel(f * cos(goc), f * sin(goc), YELLOW);
goc += 0.001;
}
}
113
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
void main()
{
int drive = DETECT, mode;
initgraph(&drive, &mode, "c:\\tc\\bgi");
archimed();
getch();
closegraph();
}
Ví dụ 3: Vẽ trái bóng chuyển động.
// Ve_Bong_Chuyen_Dong;
# include <conio.h>
# include <graphics.h>
# include <dos.h>
const r = 20, step = 5;
int x, y;
void Vebong(int color)
{ setcolor(color);
setfillstyle(SOLID_FILL, color);
fillellipse(x, y, r, r);
}
void main()
{ int drive = DETECT, mode;
initgraph(&drive, &mode, "c:\\tc\\bgi");
x = r;
y = getmaxy()/2;
setbkcolor(BLUE);
do
{ Vebong(BLUE);
x = x + step;
if (x>=getmaxx()-r-step) x = r;
Vebong(YELLOW);
delay(120);
}
while (!kbhit());
closegraph();
}
Ví dụ 4: ảnh chuyển động.
114
§¹i häc Th¸i Nguyªn-Tr−êng §HSP. Khoa To¸n-Tin
NguyÔn M¹nh §øc – Ng«n ng÷ lËp tr×nh C++
// Minh hoa mot trai bong nay
#include <conio.h>
#include <graphics.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
double x, y, omega, k, theta, a ;
double quydao(double x)
{ return a*fabs(sin(omega*x+theta))*exp(-k*x);}
void main()
{ int drive = DETECT, mode;
initgraph(&drive, &mode, "c:\\tc\\bgi");
line(0, getmaxy()-96, getmaxx(), getmaxy()-96);
setbkcolor(BLUE);
randomize();
do
{ x = 0.0;
omega = M_PI-0.1;
k = random(50) / 100;
theta = M_PI/(random(20)+1);
a = random(100) + 250;
do
{ setfillstyle(SOLID_FILL, BLUE);
setcolor(BLUE);
fillellipse(x*100, getmaxy()-100-y, 4, 4);
x+=0.001;
y = quydao(x);
setfillstyle(SOLID_FILL, YELLOW);
setcolor(BLUE);
fillellipse(x*100, getmaxy()-100-y, 4, 4);
delay(2);
k += 0.0001;
}
while (!kbhit() && x*100}
while (!kbhit());
getch();
closegraph();
}
115
Đại học Thái Nguyên-Trờng ĐHSP. Khoa Toán-Tin
Nguyễn Mạnh Đức Ngôn ngữ lập trình C++
8.3. Âm thanh
8.3.1. Tạo âm thanh trong Turbo C
Công cụ cơ bản để tạo âm thanh là các hàm:
void sound(unsigned frequency);
Phát âm thanh có tần số là frequency (Hertz).
viod nosound(void);
Tắt âm thanh.
void delay(int n);
Tạm dừng trong n mili giây.
void sleep(int n);
Buộc máy dừng trong n mili giây.
Các hàm trên nằm trong tệp dos.h .
Bằng cách sử dụng khéo léo các hàm sound, delay và nosound chúng ta
có thể tạo ra các âm thanh kỳ thú, các bản nhạc kỳ diệu.
8.3.2. Ví dụ
# include <dos.h>
void main()
{
sound(150);
delay(500);
nosound();
}
116