Lớpcửasổ Chương trình gồm lớp cua_so và lớp stack + Lớpcửasổ Thuộc tính gồm: char *noidung; // Trỏ đến vùng nhớ chứa nội dung // soạn thảo trên cửasổ int cao,rong ; // Chiều cao và chiều rộng cửasổ int mau; // mau = 16*mau_nen + mau_chu int ra_mh; // Cho biết cửasổ đã được đưa ra màn hình chưa? int posx,posy; // Vị trí trên trái củacửasổ trên màn hình word *pluu; // Trỏ đến vùng nhớ chứa nội dung // phần màn hình bị cửasổ đè lên Phương thức gồm: cua_so(); cua_so(int c,int r,byte mau_nen, byte mau_chu); int push(int x,int y); // Đưa cửasổ ra màn hình tại (x,y) // cho phép soạn thảo trên cửasổ // Bấm F6 chuyển sang cửasổ khác // Bấm ESC kết thúc void pop(); // Tháo gỡ cửasổ và khôi phục màn hình int get_ra_mh(); + Lớp stack (dùng để quản lý một dẫy cửa sổ) Thuộc tính gồm: int max; //Số cửasổ cực đại có thể quản lý int num; //Số cửasổ hiện có trong stack cua_so **pcs; //Con trỏ trỏ đến vùng nhớ chứa //địa chỉ của các đối tượng cua_so Phương thức gồm: stack(); stack(int max_cs); int accept(cua_so *cs,int x,int y); //Đưa một cửasổ //vào stack, nó sẽ hiện lên màn hình void del(); // Loại cửasổ khỏi stack, nó sẽ bị xoá // khỏi màn hình Nội dung chương trình: + Đầu tiên hiện cửasổ thứ nhất nền GREEN chữa WHITE. Có thể soạn thảo trên đó. 504 + Nếu bấm ESC kết thúc chương trình, nếu bấm F6 thì hiện thêm cửasổ thứ hai nền CYAN chữ MAGENTA. Có thể soạn thảo trên đó. + Nếu bấm ESC kết thúc chương trình, nếu bấm F6 thì hiện thêm cửasổ thứ ba nền RED chữ YELLOW. Có thể soạn thảo trên đó. + Đang ở một cửa sổ, nếu bấm ESC thì kết thúc chương trình, nếu bấm F6 thì hiện cửasổ tiếp theo (theo thứ tự vòng quanh: 1 -> 2 -> 3 -> 1). Chương trình sử dụng phương pháp truy nhập trực tiếp bộ nhớ màn hình trình bầy trong chương 9. // CT10_01.CPP // lop cua_so #include <stdio.h> #include <conio.h> #include <dos.h> #include <alloc.h> typedef unsigned int word; typedef unsigned char byte; struct kt_word { word kt; }; struct kt_byte { byte ma, mau; }; union ky_tu { struct kt_byte h; struct kt_word x; }; typedef union ky_tu far *VP; VP vptr=(VP)MK_FP(0xb800,0); // Vi tri x,y tren man hinh #define VPOS(x,y) (VP)(vptr + ((y)-1)*80+(x)-1) class cua_so { private: char *noidung; int cao, rong; int mau; // mau = 16*mau_nen + mau_chu int ra_mh; int posx,posy; 506 word *pluu; public: cua_so(); cua_so(int c,int r,byte mau_nen, byte mau_chu); int push(int x,int y); void pop(); int get_ra_mh(); }; cua_so::cua_so() { cao=rong=mau=ra_mh=posx=posy=0; noidung=NULL; pluu=NULL; } cua_so::cua_so(int c,int r,byte mau_nen, byte mau_chu) { cao=c; rong=r; mau= 16*mau_nen+mau_chu; ra_mh=posx=posy=0; noidung = (char*)malloc(cao*rong); for (int i=0;i<cao*rong;++i) noidung[i]=32; pluu= (word*)malloc(2*cao*rong); } int cua_so::push(int x,int y) { word *p= pluu; char *pnd=noidung; VP ptr; int i,j; // Luu man hinh if (ra_mh==0) { ra_mh=1; posx=x;posy=y; for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j) { ptr=VPOS(i,j); *p=ptr->x.kt; ++p; } } // Hien noi dung dang soan thao tren cuaso for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j) { ptr=VPOS(i,j); ptr->h.mau=mau; ptr->h.ma=*pnd; ++pnd; } // Soan thao int xx=posx,yy=posy,ch1,ch2; while (1) { gotoxy(xx,yy); if ((ch1=getch())==0) ch2=getch(); if (ch1==27)break; // ESC Ket Thuc Soan Thao else if (ch1==0&&ch2==64)break; //F6 else if (ch1==13) { ++yy; xx=posx; if(yy>=posy+cao) break; } else if (ch1!=0) { ptr=VPOS(xx,yy); ptr->h.ma=ch1; ++xx; if (xx>=posx+rong) {++yy; xx=posx;} if (yy>=posy+cao) break; } else if (ch2==72||ch2==80||ch2==75||ch2==77) { if (ch2==72) yy--; else if (ch2==80) ++yy; else if (ch2==75) --xx; else ++xx; if (xx<posx) xx=posx; if (xx>=posx+rong) {++yy; xx=posx;} if (yy<posy) yy=posy; if (yy>=posy+cao) break; } } // Luu ket qua soan thao pnd=noidung; for (i=posx;i<=posx+rong-1;++i) 508 for (j=posy;j<=posy+cao-1;++j) { ptr=VPOS(i,j); *pnd=ptr->h.ma; ++pnd; } if (ch1==0&&ch2==64) return 0; //F6 else return 1; } void cua_so::pop() // Khoi phuc vung nho bi cuaso chiem { if (ra_mh==0) return; ra_mh=0; word *p=pluu; VP ptr; int i,j; for (i=posx;i<=posx+rong-1;++i) for (j=posy;j<=posy+cao-1;++j) { ptr=VPOS(i,j); ptr->x.kt=*p; ++p; } } int cua_so::get_ra_mh() { return ra_mh; } //class stack class stack { private: int max,num; cua_so **pcs; public: stack(); stack(int max_cs); int accept(cua_so *cs,int x,int y); void del(); }; stack::stack() { max=num=0; pcs=NULL; 510 } stack::stack(int max_cs) { max=max_cs; num=0; pcs=(cua_so**)malloc(max*sizeof(cua_so*)); for (int i=0;i<max;++i) pcs[i]=NULL; } int stack::accept(cua_so *cs,int x,int y) { int gt; if (num==max)return 0; if (!cs->get_ra_mh()) { pcs[num]=cs; ++num; } gt=cs->push(x,y); return gt; } void stack::del() { if (num==0) return; --num; pcs[num]->pop(); pcs[num]=NULL; } main() { int ch; cua_so w1(10,40,GREEN,WHITE), w2(12,42,CYAN,MAGENTA), w3(14,44,RED,YELLOW); stack s(4); clrscr(); while(1) { ch=s.accept(&w1,5,5); if(ch==1)break; ch=s.accept(&w2,8,8); if(ch==1)break; ch=s.accept(&w3,11,11); if(ch==1)break; } s.del(); s.del(); s.del(); } . Lớp cửa sổ Chương trình gồm lớp cua_so và lớp stack + Lớp cửa sổ Thuộc tính gồm: char *noidung; // Trỏ đến vùng nhớ chứa nội dung // soạn thảo trên cửa. Đưa cửa sổ ra màn hình tại (x,y) // cho phép soạn thảo trên cửa sổ // Bấm F6 chuyển sang cửa sổ khác // Bấm ESC kết thúc void pop(); // Tháo gỡ cửa sổ và