這是99年做畢業設計時,用BC3.2做的圖書管理程式(當年畢業設計獲優,還不錯),DOS平台,通過DOS33号中斷可以支援滑鼠操作,圖形界面(仿Window95),不過對菜單部分由于當時技術有限,僅能支援滑鼠操作,不支援快捷鍵。小圖示都是自己一點一點畫出來的(當然不是BMP位圖,那時候還沒有這個概念),現在看看這些程式感覺很親切,是以把它拿出來見見太陽:)
這是閃現螢幕
這是主界面(以上圖檔用數位相機照的,DOS下的程式,忘記怎麼截圖了)
這是主程式代碼:
//-------------------------------------------------------------------//
// 圖 書 管 理 主 程 序 //
#include "head.hpp"
#include "list.hpp"
//--------------------
#define CLS w.edit(6,56,632,420)
WIN w("圖書管理","book.tu");
char far *escr[1]={{"圖書管理系列..."}};
PROM far *p1='/0',*p2='/0';
struct date da;
int ROLE=0;
RUNFUN fun[5]={{NULL}},fun0[8]={{NULL}};
//-----查詢------------
#include "find.cpp"
//-----編目-----------
#include "index.cpp"
//-----借書------------
#include "borrow.cpp"
//-----還書------------
#include "return.cpp"
//-----幫助------------
void Help(void)
{
w.endscr("幫助...");
HELPWIN h("幫助","sdfds","help.dat");
w.endscr("圖書管理系列...");
}
//------日期-----------
#include "date.cpp"
//-----角色-----------
//#include "role.cpp"
//---設定密碼---------
#include "setcode.cpp"
//---詳細資訊---------
#include "allmess.cpp"
//************主程式*************//
void main(void)
{
system("cover"); //封面
screen(5); //設定圖形模式,且底色為黑色
compcode();
//-----------------
getdate(&da); //取系統日期
mouse.init();
mouse.show();
setfillstyle(1,5);bar(0,0,640,480); //清屏
//--------------------------------
char far *Book[5]={"查詢","編目","借書","還書","幫助"};
w.setoffon();w.unsave();w.form();
MENU menu(5,1,Book,6,30); //定義一下拉菜單
menu.setmode(1);menu.init();
//------------------------------
setcolor(5);line(6,52,630,52);
setcolor(15);line(6,53,630,53);
int tt[]={title,borrowmessage,bookmessage,zhantie,edit,del,
borrow,retu,code,riqi};
char far *ms[]={"檢視書庫目錄","檢視借書資訊","檢視某書的詳細資訊",
"庫記錄追加","庫記錄修改","庫記錄删除","借書",
"還書","設定密碼","日期/時間"};
K_E_Y kk(10,120,59,tt,ms);
if(ROLE==0)kk.setflag("34567");
else kk.setflag("");
kk.setmode("368");
kk.init();
//save("tubit?.dat",120,59,420,85);
if(ROLE==0)load("tubit1.dat"); else load("tubit0.dat");
w.wind(6,59,105,79);
if(ROLE==0)hz.hz(15,61,"普通使用者",5);
else hz.hz(15,61,"超級使用者",5);
w.key(Jv,85,59,0);
//-------------------------------
w.edit(6,86,632,420);
char *escr[1]={{"圖書管理系列..."}};
w.endscr(0,escr);
BAR(613,90,631,402);BAR(10,401,630,419);
setfillstyle(1,7);bar(610,401,631,419);
w.key(Ja,612,86,0); w.key(Jv,612,382,0);
w.key(Jd,7,400,0); w.key(Jb,593,400,0);
w.winu(612,106,631,300);w.winu(27,400,450,419);
printf("/16[sa%d,%d,%d,%d,%s$]",0,0,639,451,"tumain.pcx");
fun[0]=Find; //查詢
fun[1]=Index; //編目
fun[2]=Borrow; //借書
fun[3]=Return; //還書
fun[4]=Help; //幫助
//-------------------
fun0[0]=readall; //檢視書庫目錄
fun0[1]=messageall; //檢視借書資訊
fun0[2]=allmess; //檢視某書的詳細資訊
fun0[3]=append; //庫記錄追加
fun0[4]=eedit; //庫記錄修改
fun0[5]=delnum; //庫記錄删除
fun0[6]=subBorrow; //借書
fun0[7]=Return; //還書
fun0[8]=setcode; //設定密碼
fun0[9]=daTe; //日期/時間
//--------------------
menu.RUN(kk,fun,fun0,&w); //菜單運作
closegraph();
}
//----------------------------------------------------------------------//
這是關于滑鼠部分的源碼:
//------------------------------------------------------------------------//
// 鼠 标 類 庫 //
typedef struct mouse_xzrd
{
int x,y;
int far *image;
}M_XZRD;
extern int Mpp0[]={0xffff,0xffff,0xffff,0xffff,
0xffff,0xffff,0xffff,0xffff,
0x8002,0x4004,0x2008,0x1010,
0x0820,0x0440,0x0280,0x0000,
0x0280,0x0440,0x0820,0x1010,
0x2008,0x4004,0x8002,0x0000
};
extern int Mpp1[]={0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x001f,0x01ff,0x10ff,
0x30ff,0x787f,0xf87f,0xfc7f,
0x0000,0x4000,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
extern int Mpp2[]={0xfc7f,0xfc7f,0xfc7f,0xfc7f,
0xfc7f,0xfc7f,0x0001,0x0001,
0x0001,0xfc7f,0xfc7f,0xfc7f,
0xfc7f,0xfc7f,0xfc7f,0xffff,
0x0000,0x0100,0x0100,0x0100,
0x0100,0x0100,0x0100,0x7ffc,
0x0100,0x0100,0x0100,0x0100,
0x0100,0x0100,0x0000,0x0000
extern int Mpp3[]={0xfeff,0xfc7f,0xfc7f,0xfc7f,
0xf83f,0xf83f,0xf01f,0xe00f,
0xc007,0x8003,0x0001,0x0001,
0xf83f,0xf01f,0xe00f,0xe10f,
0x0380,0x0380,0x07c0,0x0fe0,
0x1ff0,0x3ff8,0x7ffc,0x0380,
0x0380,0x07c0,0x0ee0,0x0000
extern int Mpp4[]={0xffff,0xf00f,0xc003,0x8001,
0x0000,0x0000,0x0000,0x0000,
0x8001,0xc003,0xf00f,0xffff,
0x0000,0x0000,0x0ff0,0x381c,
0x6ff6,0x5c3a,0x57ea,0x566a,
0x566a,0x57ea,0x5c3a,0x6ff6,
0x381c,0x0ff0,0x0000,0x0000
extern int Mpp5[]={0xffff,0xffff,0xffff,0xffff,
0x0c00,0x1200,0x1200,0x1200,
0x13fe,0x1249,0x1249,0x1249,
0x7249,0x9001,0x9001,0x9001,
0x8001,0x8001,0x4002,0x3ffc
extern int Mpp6[]={0xffff,0xffff,0xffff,0xffff,
0x0000,0x0000,0x0420,0x0c30,
0x1428,0x27e4,0x4002,0x8001,
0x4002,0x27e4,0x1428,0x0c30,
0x0420,0x0000,0x0000,0x0000
extern int Mpp7[]={0xffff,0xffff,0xffff,0xffff,
0x0100,0x0280,0x0440,0x0820,
0x1010,0x3c78,0x0440,0x0440,
0x0440,0x0440,0x3c78,0x1010,
0x0820,0x0440,0x0280,0x0100
extern int Mpp8[]={0xffff,0xffff,0xffff,0xffff,
0x0000,0x0002,0x0006,0x000e,
0x001e,0x003e,0x007e,0x00fe,
0x01fe,0x007e,0x003e,0x0062,
0x0060,0x00c0,0x00c0,0x0180
extern M_XZRD Mouse0={7,7,Mpp0}; //X形
extern M_XZRD Mouse1={0,0,Mpp1}; //右鍵頭形
extern M_XZRD Mouse2={7,7,Mpp2}; //十字形
extern M_XZRD Mouse3={7,0,Mpp3}; //飛機形
extern M_XZRD Mouse4={7,7,Mpp4}; //圓形
extern M_XZRD Mouse5={5,0,Mpp5}; //手形
extern M_XZRD Mouse6={7,7,Mpp6}; //<->形
extern M_XZRD Mouse7={7,7,Mpp7}; //VA形
extern M_XZRD Mouse8={15,1,Mpp8}; //左鍵頭形
class MOUSE
private:
int flag; //滑鼠安裝與否
int FLAG; //滑鼠顯隐與否
int num; //滑鼠鍵的個數
int x,y; //座标
int right,left; //滑鼠左右健按下與否
M_XZRD far *form; //滑鼠形狀
int bx,by,ex,ey; //滑鼠的顯隐區
int chart; //圖形狀态打開與否
int chartsize; //圖形下滑鼠的大小
int winxsize,winysize; //文本下滑鼠的大小
int key; //滑鼠鍵位
int rx,ry; //滑鼠形狀熱點
int rbx,rby,lbx,lby; //滑鼠鍵最後按下的座标
int rex,rey,lex,ley; //滑鼠鍵最後松開的座标
int leftnum,rightnum;
int KEY()
{ union REGS r; r.h.ah=0x00;
int86(0x16,&r,&r);return(r.h.ah);}
public:
int KEYKEY;
MOUSE(void){chart=0;chartsize=16;winxsize=8;winysize=8;
form=&Mouse1;bx=0;by=0;ex=640;ey=480;KEYKEY=0;
rbx=0;rby=0;lbx=0;lby=0;
rex=0;rey=0;lex=0;ley=0;leftnum=0;rightnum=0;
init();shape();show();}
void show_message(void); //顯示滑鼠資訊
void init(void); //滑鼠初始化
void shape(void); //定義滑鼠的形狀
void setshape(int); //設定滑鼠的形狀
void show(void); //顯示滑鼠
void hide(void); //消隐滑鼠
void setbeginxy(int,int);//設定滑鼠初始位置
void message(void); //獲得滑鼠資訊
void mousekeymessage(void); //獲得滑鼠按下松開資訊
void show_mousekeymessage(void); //顯示滑鼠按下松開資訊
void setmax(int,int); //設定滑鼠顯示X範圍
void setmay(int,int); //設定滑鼠顯示Y範圍
void setmaxy(int,int,int,int); //設定滑鼠顯示範圍
int mousekey(void); //判斷是滑鼠還是鍵盤資訊
void mousev(void); // 設定滑鼠的靈敏度
int getx(void){message();return x;} //獲得滑鼠x值
int gety(void){message();return y;} //獲得滑鼠y值
int getlbx(void){mousekeymessage();return lbx;} //獲得滑鼠左鍵按下的x值
int getlby(void){mousekeymessage();return lby;} //獲得滑鼠左鍵按下的y值
int getlex(void){mousekeymessage();return lex;} //獲得滑鼠左鍵松開的x值
int getley(void){mousekeymessage();return ley;} //獲得滑鼠左鍵松開的y值
int getrbx(void){mousekeymessage();return rbx;} //獲得滑鼠右鍵按下的x值
int getrby(void){mousekeymessage();return rby;} //獲得滑鼠右鍵按下的y值
int getrex(void){mousekeymessage();return rex;} //獲得滑鼠右鍵松開的x值
int getrey(void){mousekeymessage();return rey;} //獲得滑鼠右鍵松開的y值
//獲得滑鼠左鍵按下的次數
int getleftnum(void){mousekeymessage();return leftnum;}
//獲得滑鼠右鍵按下的次數
int getrightnum(void){mousekeymessage();return rightnum;}
int getkey(void){message();return key;} //獲得滑鼠key值
//顯示滑鼠座标
void showxy(void){gotoxy(1,1);cout<<"x="<<x<<" y="<<y<<" key="<<key<<endl;}
int yesno(int,int,int,int);//判斷滑鼠是否在指定範圍
void run(void far interrupt(far *p)(),int nn);// 使用者滑鼠程式的運作
void close(void); //消除使用者滑鼠程式的運作
};
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
void MOUSE::show_message(void)
cout<<"Mouse num:"<<num<<endl;
cout<<"Mouse form:"<<form<<endl;
cout<<"Mouse showsection:"<<bx<<","<<by<<","<<ex<<","<<ey<<endl;
}
void MOUSE::init(void)
union REGS r;
flag=0;
if(getvect(0x33)!=0L)
{ r.x.ax=0;
int86(0x33,&r,&r);
if(r.x.ax==0){cout<<"NOT INSTALLED MOUSE !";exit(0);}
if(r.x.ax!=0){
flag=1;num=r.x.bx;
shape();
if(!chart)
{
r.h.ah=0x0f;
int86(0x10,&r,&r);
if(r.h.al==0||r.h.al==1)winxsize=16;
chart=1;
}}
}
void MOUSE::shape()
if(flag)
{ _ES=FP_SEG(form->image);
_DX=FP_OFF(form->image);
_CX=form->y;
_BX=form->x;
_AX=0x09;
geninterrupt(0x33);
rx=form->x;
ry=form->y;
void MOUSE::setshape(int n)
switch (n)
case 0:form=&Mouse0;break;
case 1:form=&Mouse1;break;
case 2:form=&Mouse2;break;
case 3:form=&Mouse3;break;
case 4:form=&Mouse4;break;
case 5:form=&Mouse5;break;
case 6:form=&Mouse6;break;
case 7:form=&Mouse7;break;
case 8:form=&Mouse8;break;
default:break;
}
inline void MOUSE::show(void)
r.x.ax=1;
int86(0x33,&r,&r);
FLAG=1;
inline void MOUSE::hide(void)
if((FLAG)&&(flag))
r.x.ax=2;
FLAG=0;
void MOUSE::setbeginxy(int X,int Y)
r.x.ax=4;
r.x.cx=X;
r.x.dx=Y;
int86(0x33,&r,&r);
x=X;y=Y;
inline void MOUSE::message(void)
union REGS r;
r.x.ax=3;
int86(0x33,&r,&r);
key=r.x.bx;
KEYKEY=key;
x=r.x.cx;
y=r.x.dx;
}}
void MOUSE::mousekeymessage(void)
{//-----按下-----
//左鍵
r.x.ax=5;
r.x.bx=0;
key=KEYKEY=r.x.ax;
leftnum=r.x.bx;
lbx=r.x.cx;
lby=r.x.dx;
//右鍵
r.x.bx=1;
rightnum=r.x.bx;
rbx=r.x.cx;
rby=r.x.dx;
//-----松開-----
r.x.ax=6;
lex=r.x.cx;
ley=r.x.dx;
rex=r.x.cx;
rey=r.x.dx;
void MOUSE::show_mousekeymessage(void)
gotoxy(10,6);
cout<<"Left ("<<lbx<<","<<lby<<")-("<<lex<<","<<ley<<")/n";
gotoxy(10,7);
cout<<"Right ("<<rbx<<","<<rby<<")-("<<rex<<","<<rey<<")/n";
void MOUSE::setmax(int x1,int x2)
if(!FLAG)
{
x1=(x1*winxsize)-winxsize;
x2=(x2*winxsize)-winxsize;
r.x.ax=7;
r.x.cx=x1;
r.x.dx=x2;
void MOUSE::setmay(int y1,int y2)
y1=(y1*winysize)-winysize;
y2=(y2*winysize)-winysize;
r.x.ax=8;
r.x.cx=y1;
r.x.dx=y2;
void MOUSE::setmaxy(int x1,int y1,int x2,int y2)
if(flag)
r.x.ax=16;
r.x.cx=x1;
r.x.dx=y1;
r.x.si=x2;
r.x.di=y2;
else hide();
inline int MOUSE::mousekey()
if(kbhit())return KEY();
message();
if(key==1) return(1001);
if(key==2) return(1002);
if(key==3) return(1003);
return(-1);
void MOUSE::mousev()
_BX=20;
_CX=20;
_AX=0x1a;
geninterrupt(0x33);
int MOUSE::yesno(int bx,int by,int ex,int ey)
{ int t;
if(bx>ex){t=bx;bx=ex;ex=t;}
if(by>ey){t=by;by=ey;ey=t;}
message();
if(x>bx&&x<ex&&y>by&&y<ey)return 1;
else return 0;
void MOUSE::run(void far interrupt(*p)(),int nn)
_ES=FP_SEG(p);
_DX=FP_OFF(p);
_CX=nn;
_AX=0x14;
geninterrupt(0x33);
void MOUSE::close(void)
_ES=0;
_DX=0;
_CX=0;
好了,先放這些吧。現在想想如果用DOS做簡單的圖形界面的嵌入式系統,也許這個也有點用(我剛到公司,做的第一個程式就是用這個改進的(DOS下的物料計量系統))