Kỹ thuật lập trình C QUAN LY MAN HINH VA CUA SO © Trong chương này sẽ giới thiệu một số hàm dung dé quan ly man. hình màu và tạo cửa số. Bằng cách tạo nên các cửa sổ với tàu sắc khác nhau sẽ làm cho màn hình trở nên đẹp đẽ sáng sửa hơn, điều này giúp cho việc tổ chức số liệu và tổ chức hội thoại người tráy trở nên thuận tiện hơn. Tất cả các hàm quản lý tàn hình giới thiệu dưới đây đều khai báo trong tệp corio.
CHỌN KIỂU MÀN HÌNH VĂN BẢN 1. Hàm textmode Trước khi sử dụng các hàm quản lý màn hình, ta phải dùng hàm textmode để chọn kiểu màn hình văn bản. Hàm có dạng: void textmode(int mode); Ở đây mode là một biến nguyên dùng để xác định mốt văn bản định sử dụng. Dưới đây là các giá trị mà biến mode có thể nhận và nghĩa của chúng.
Ký hiệu tượng trưng Giá trịsố | Mốt văn bản video LASTMODE | -1 Mốt văn bản trước đó BW40 0 Đen trắng 40 cột C40 1 16 mau, 40 cột - BW80 2 Đen trắng 80 cột C80 3 16 màu, 80 cột MONO 7 Màn hình đơn sắc, 80 cột Chú ý 1: Các ký hiệu tượng trưng chính là các hằng đã được định nghĩa trong tệp conio. có Chú ý 2: Độc lập với các mốt văn bản được chọn, màn hình luôn luôn gồm 25 hàng. Ví dụ 1: Câu lệnh: textmode(C40); {203} Kỹ thuật lập trình C_ | h sẽ chọn mốt hiển thị văn bản 16 màu, 40 cột. Như vậy, màn hình sẽ gồm 25 hàng và 40 cột.
Mã của các màu được cho trong bảng 2. Ví dụ 2: Câu lệnh: textmode(C80); ~ 7 sé chon kiểu hiển thị văn bản 16 màu, 80 cột. Màn hình sẽ gồm 25 hàng va 80 cột. Mỗi dòng trên màn hình chứa được 80 ký tự.
Ta sẽ thấy các ký tự ở mốt C40 có bể ngang lớn hơn 2 lần các ký tự ở mốt C80. Cách xác định vị trí trên màn hình Hệ trục toạ độ trên màn hình nhận điểm ở góc trên bên trái làm điểm gốc, trục hoành là trục nằm ngang chạy từ trái sang phải, trục tung chạy từ trên xuống dưới. Như vậy, đối với màn hình 25 hàng 80 cột thì điểm (1, 1) là điểm ở góc trên bên trái, điểm (80, 1) là điểm ở góc trên bên phải, điểm (1, 25) là điểm ở góc dưới bên trái và điểm (80, 25) là điểm ở góc dưới bên phải. ĐẶT MÀU NỀN VÀ MÀU CHỮ Để đặt màu nền (màu cửa sổ) ta dùng hàm: void textbackground(int color); Để đặt màu chữ ta dùng hàm: void textcolor(int color); Trong cả hai trường hợp color là một biến nguyên chứa mã của màu (xem bảng sau) Ký hiệu tượng trưng - tise mn a hay BLACK (den) 0 Ca hai BLUE (xanh da trời) 1 Cả hai _GRBENGanh lá cây) 2 Cả hai CYAN (xanh lơ) 3 Ca hai RED (đỏ).
12 Chi cho mau chit | LIGHTMAGENTA (tim nhat) 13 | Chỉcho màu chữ YELLOW (vang) 14 Chi cho mau chit WHITE (trang) 15 Chỉ cho màu chữ Chúý 1: Muốn tạo chữ nhấp nháy ta cộng thêm 128 vào tham số màu, ví dụ lệnh textcolor(4+128) sẽ tạo đòng chữ nhấp nháp màu đỏ. Chú ¥ý 2: Các ký hiệu tượng trưng chính là các hằng được định nghĩa trong tệp conio.h và trong tệp graphis. Chúng cũng chính là tên của các màu (viết theo tiếng Anh). Chú ý 3: Các hàm trên không làm thay đổi màu sắc của các cửa số và các đòng chữ đã có từ trước trên màn hình.
Chú ýý 4: Một câu lệnh textbackground xác định một màu, đó sẽ là màu của tất cả các cửa sổ được xây dựng sau câu lệnh này và trước một câu lệnh textbackground khác. Tương tự một câu lệnh textcolor xác định một màu, đó sẽ là màu của các dòng chữ được đưa lên màn hình bằng các câu lệnh cprintf và cscanf viết sau câu lệnh textcolor này và trước một câu lệnh textcolor khác. Ví dụ 1: Các cửa sổ được xây dựng sau câu lệnh -- textbakground (RED) ; và trước một câu lệnh textbackground khác sẽ có màu đỏ. Ví dụ 2: Các dòng ký tự được đưa lên màn hình: bang.
các câu lệnh cprintf và cscanf viết sau câu lệnh textcolor (WHITE) ; và trước một câu lệnh textcolor khác sẽ có màu trắng. {205} Kỹ thuật lập trình C_ | §3. KAY DUNG CUA SO VA SU DUNG CUA SO Ham window void window(int xt, int yt, int xd, int yd); sẽ có hai tác dụng: 1 - Xây dựng một cửa sổ trên màn hình (hình chữ nhật có các cạnh song song với các cạnh của màn hình) trong đó điểm ở góc trên bên trái có toạ độ là (xt,yt) và điểm ở góc dưới bên phải có toạ độ là (xd,yd). 2 - Đưa con trỏ về vị trí góc trên bên trái của cửa sổ vừa xây dựng.
Các biến xt,yt,xd,yd cần thoả mãn điều kiện xd >= xt và yd >= yt Ví dụ 1: Ta hãy xem hai câu lệnh có tác dụng gì ? textbackground (RED) ; window (5,5,35,20); Câu lệnh thứ nhất xác định màu nền mới là màu đỏ. Các cửa sổ xây dựng sau câu lệnh này sẽ có màu đỏ. Câu lệnh thứ hai xác định một cửa sổ có điểm trên bên trái là (5,5) và điểm dưới bên phải là (35,20). Thế thì sau câu lệnh thứ hai ta có nhận ngay được một cửa sổ đỏ hay không? Câu trả lời là không.
Câu lệnh window không có chức năng xoá bỏ những gì đã có trong phạm vi cửa sổ mới mở. Muốn có màu đỏ trên cửa sổ này ta phải xoá đi tất cả những gì đang có trên cửa sổ đó. Hàm void clrscr(void); đảm nhiệm chức năng này. Ví dụ 2: Giả sử ta muốn có một màn hình cỡ 25 x 80 (25 hàng 80 cột) màu CYAN.
Giữa màn hình là một cửa sổ màu RED. Trong cửa sổ có hai dòng chữ. Dòng chữ bên trên là Chuc mung nam moi. màu YELLOW và dòng chữ dưới là Happy new year mau WHITE.
Chương trình dưới đây sẽ đáp ứng được yêu cầu nêu trên. cprintf£(“\n%l0c Chic mtng ndém mới”,'” `); /* Dòng chữ màu trắng */ textcolor (WHITE) ; gotoxy (1,4); cprintf(®\n\n310c Happy new year”,’ ); ) ` Ví dụ 3: Xét chương trình #include <stdio.h> main () { float r,c,pi=3.14; textmode (C40); /* Chon mode van bản 16 màu 40 cot */ /* Lam cho man hinh cé mau GREEN */ textbackground (GREEN); window(1,1,40,25); clrscr(); /* Tạo cửa số màu MAGENTA */ textbackground (MAGENTA) ; window(10,8,30,18); clrscr(); /* Cho hiện dòng chữ * Ban kinh = * màu YELLOW */ textcolor (YELLOW) ; cprint£f(*\n\n Ban kinh = *); '/* Chọn bán kính từ bản phím, lay r = 5 */ /* So 5 mau RED se hien len man hinh */ textcolor(RED); cscanf(*$%f“,&r); /* Tinh chu vi */ c = 2*pi*r; ¡ textcolor(WHITE); /* Cho hiện lên dòng kết qua mau WHITE */ ¬ ne gotoxy(1,4); cprintf(“\n\nChu vi= %£6.2",c); } {207} Kỹ thuật lập trình C_| $4. CÁC HÀM printf, scanf Khi màn hình đang ở chế độ văn bản ta có thể sử dụng các hàm printf, scanf, cprintf và cscanf để vào số liệu từ bàn phím và đưa kết quả ra màn hình. Điều này đã chỉ ra trong các ví dụ 2 và 3 của $3, ở đây ta muốn nói đến vài điều khác nhau giữa các hàm nói trên.
Khi sử dụng các hàm cprintf và cscanf thì các dòng ký tự hiện lên màn hình sẽ có màu xác định bởi câu lệnh textcolor gần nhất. Còn khi sử dụng các hàm printf và scanf thì qui tắc này sẽ không còn đúng nữa. Nói chung các hàm cprintf và cscanf sẽ cho một màn hình đẹp hơn so với các hàm printf và scanf. Khi dùng hàm scanf để nhập số liệu ta có thể tự do sửa chữa khi bấm sai bằng cách sử dụng các phím chức năng.
Nhưng điều này lại bị hạn chế khi dùng hàm cscanf. Để thấy rõ sự khác nhau vừa nêu, cách tốt nhất là hãy thay các hàm cprintf và cscanf bằng các hàm prinf và scanf trong các chương trình của §3, sau đó thực hiện chúng trên máy và so sánh các kết quả nhận được trên màn hình. Sự khác nhau giữa printf và cprintf: Ngoài sự khác nhau về màu hiển thị như đã nói trên, chúng còn khác nhau về phạm vi hiển thị. + Ham printf có tính toàn màn hình không phụ thuộc vào cửa số hiện tại.
Như vậy các dòng thông tin do hàm đưa ra có thể nằm ngoài cửa số nếu như cửa số quá hẹp. + Hàm cprintf chỉ làm việc trên cửa sổ hiện tại. Như vậy các dòng thông tin do hàm đưa ra chỉ có thể nằm trong cửa sổ và nếu cửa số không đủ chỗ chứa thì một số dòng sẽ bị mất. CAC HAM KHAC 1.
Ham cirscr: Xoá cửa sổ hiện hành. + Dạng hàm: void clrscr (void); + Công dụng: xoá cửa sổ hiên tại và đưa con trỏ đến góc trên bên trái của cửa sổ. Sau hàm này cửa sổ sẽ có màu xác định bởi hàm textbackground. Hàm này đã được giới thiệu và sử dụng trong các chương trình ở §3.
Hàm clreol: Xoá đến cuối dòng trong cửa sổ. + Dạng hàm: void clreol (void); + Công dụng: xoá mọi ký tự đứng sau con trỏ cho tới cuối dòng trong cửa sổ mà không làm thay đối vị trí của con trỗ. {208} Kỹ thuật lập trình C 3. Hàm delline: Xoá một dòng trong cửa số.
+ Dạng hàm: void delline (void); + Công dụng: xoá dòng của cửa số đang chứa con trỏ. Hàm gotoxy: Di chuyển con trỏ trong phạm vi cửa sổ. + Dạng hàm: void gotoxy(int x,int y); + Công dụng: dịch chuyển con trỏ đến vị trí (xy) trong cửa sổ hiện tại. Chú vs toa độ (x,y) không phải là toạ độ màn hình mà là toạ độ trong cửa sổ, ví dụ m (1,1) là điểm trên trái của cửa số.
“Chis #ý: Để đưa con trỏ tới một vi trí bất kỳ của màn hình ta có thể sử dụng chức năng thứ hai của hàm window (xem §3). Ví dụ câu lệnh: window (1,24,1,24); sẽ đưa con trỏ tới vị trí (1,24) của màn hình. Hàm wherex: Cho vị trí ngang của con trỏ trong cửa sổ. + Dạng hàm: int wherex (void); + Công dung: cho vi trí ngang (x) của con trỏ trong cửa số hiện hành.
Hàm wherey: Cho vị trí dọc của con trỏ trong cửa số. + Dạng hàm: int wherey (void) ; + Công dụng: cho vị trí doc (y) của con trỏ trong cửa sổ hiện hành. Hàm gettextinfo: Cho thông tin về kiểu hiển thị văn bản. + Dạng hàm: void gettextinfo(struct text_info *r); + Dối: r là con trỏ trỏ tới địa chỉ của một biến cấu trúc kiểu text_info được định nghĩa trong conio.