📄 xcd0.c
字号:
#define ENTER 0x1c0d
#define UP 0x4800
#define DOWN 0x5000
#define RIGHT 0x4d00
#define LEFT 0x4b00
#define ESC 0x011b
#define DEBUG
#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<process.h>
#include<dos.h>
#include<bios.h>
#include<alloc.h>
void hanzi16(int x,int y,char *s,int colour);
void initgraphics(void);
int get_key();
void activemainmenu(int select);
void activesubmenu(int numb);
int managesubmenu(int number);
void managemainmenu(void);
void submenu1();
void submenu2();
void submenu3();
void submenu4();
void mainmenu();
void subfunction();
void *buffer;
void *mainbuf;
void *subbuf1,*subbuf2,*subbuf3, *subbuf4;
int h,n,sn,w;
int subitem1,subitem2,subitem3,subitem4,subsize;
/* 主函数*/
main()
{initgraphics();
mainmenu();
managemainmenu();
getch();
closegraph();
}
void initgraphics() /*图形初始化函数*/
{
int gd=DETECT,gm,errorcode;
subitem1=4;
subitem2=6;
subitem3=3;
subitem4=4;
initgraph(&gd,&gm,"c:\\turboc2");
cleardevice();
errorcode=graphresult();
if(errorcode!=0)
{
printf("Graphics error:%s\n",grapherrormsg(errorcode));
printf("Press any key to halt!\n");
getch();
exit(1);
}
}
void mainmenu() /*显示主菜单*/
{
int x,y,size;
x=639;
y=479;
n=1;
h=3*textheight("t");
w=textwidth("t");
size=imagesize(1,50,126,49+h);
mainbuf=malloc(size);
if(mainbuf!=NULL)
{ setfillstyle(1,MAGENTA);
bar(1,50,126,49+h);
setbkcolor(1);
setcolor(RED);
rectangle(0,0,x,y);
rectangle(0,0,x,h);
setfillstyle(1,LIGHTGRAY);
bar(1,1,x-1,h-1);
hanzi16(3*w,3,"文件",0);
hanzi16(18*w,3,"编辑",0);
hanzi16(33*w,3,"工具",0);
hanzi16(48*w,3,"菜单四",0);
getimage(3,52,124,47+h,mainbuf);
setfillstyle(1,BLUE);
bar(1,50,127,50+h);
activemainmenu(n); }
else {printf("out of memory!");exit(1);}
}
void submenu1() /* 子菜单1*/
{
int i;
sn=1;
for(i=1;i<=subitem1;i++)
{
setcolor(RED);
rectangle(1,i*h,126,i*h+h);
setfillstyle(1,LIGHTGRAY);
bar(2,i*h+1,125,i*h+h-1);
}
hanzi16(2*w,h+3,"新建文件",0);
hanzi16(2*w,2*h+3,"打开文件",0);
hanzi16(2*w,3*h+3,"保存文件",0);
hanzi16(2*w,4*h+3,"退出",0);
putimage(2,h+2,mainbuf,XOR_PUT);
}
void submenu2() /* 子菜单2*/
{ int i;
sn=1;
for(i=1;i<=subitem2;i++)
{setcolor(RED);
rectangle(16*w,i*h,16*w+126,i*h+h);
setfillstyle(1,LIGHTGRAY);
bar(16*w+1,i*h+1,16*w+125,i*h+h-1);
}
hanzi16(17*w,h+3,"撤消",0);
hanzi16(17*w,2*h+3,"复制",0);
hanzi16(17*w,3*h+3,"粘贴",0);
hanzi16(17*w,4*h+3,"全选",0);
hanzi16(17*w,5*h+3,"查找",0);
hanzi16(17*w,6*h+3,"替换",0);
putimage(16*w+1,h+2,mainbuf,XOR_PUT);
subsize=imagesize(16*w,h,16*w+126,subitem2*h+h);
subbuf1=malloc(subsize);
if(subbuf2!=NULL)getimage(16*w,h,16*w+126,subitem2*h+h,subbuf2);
}
void submenu3() /* 子菜单3*/
{ int i;
sn=1;
bar(48*w,h,639,7*h);
for(i=1;i<=subitem3;i++)
{setcolor(RED);
rectangle(32*w,i*h,32*w+126,i*h+h);
setfillstyle(1,LIGHTGRAY);
bar(32*w+1,i*h+1,32*w+125,i*h+h-1);
}
hanzi16(33*w,h+3,"阿赛码字符集",0);
hanzi16(33*w,2*h+3,"点阵字模工具",0);
hanzi16(33*w,3*h+3,"中文运行环境",0);
putimage(32*w+1,h+2,mainbuf,XOR_PUT);
subsize=imagesize(32*w,h,32*w+126,subitem3*h+h);
subbuf1=malloc(subsize);
if(subbuf3!=NULL)getimage(32*w,h,32*w+126,subitem3*h+h,subbuf3);
}
void submenu4() /* 子菜单4*/
{ int i;
sn=1;
for(i=1;i<=subitem4;i++)
{setcolor(RED);
rectangle(48*w,i*h,48*w+126,i*h+h);
setfillstyle(1,LIGHTGRAY);
bar(48*w+1,i*h+1,48*w+125,i*h+h-1);
}
hanzi16(49*w,h+3,"菜单一",0);
hanzi16(49*w,2*h+3,"菜单二",0);
hanzi16(49*w,3*h+3,"菜单三",0);
hanzi16(49*w,4*h+3,"菜单四",0);
putimage(48*w+1,h+2,mainbuf,XOR_PUT);
subsize=imagesize(48*w,h,48*w+126,subitem4*h+h);
subbuf1=malloc(subsize);
if(subbuf4!=NULL)getimage(48*w,h,48*w+126,subitem4*h+h,subbuf4);
}
void managemainmenu(void) /*管理主菜单*/
{
unsigned key;
while(1)
{
setfillstyle(1,1);
bar(1,h,639,7*h);
key=get_key();
switch(key)
{case LEFT:
{
if(n==1){activemainmenu(n);n=4;activemainmenu(n);break;}
else {activemainmenu(n);n--;activemainmenu(n);break;}
}
case RIGHT:
{
if(n==4){activemainmenu(n);n=1;activemainmenu(n); break;}
else {activemainmenu(n);n++;activemainmenu(n); break;}
}
case ENTER: {managesubmenu(n); break;}
case DOWN: {managesubmenu(n); break;}
case ESC: exit(0);
}
}
}
int managesubmenu(int number) /*管理子菜单*/
{int num;
num=number;
switch(num)
{
case 1:{submenu1();activesubmenu(1);break;}
case 2:{submenu2();activesubmenu(2);break;}
case 3:{submenu3();activesubmenu(3);break;}
case 4:{submenu4();activesubmenu(4);break;}
}
}
/* x,y为显示坐标,s为显示字符串,colour为颜色 */
void hanzi16(int x,int y,char *s,int colour) /* 汉字显示函数 */
{
FILE *fp;
char buffer[32]; /* 32字节的字模缓冲区 */
register i,j,k;
unsigned char qh,wh;
unsigned long location;
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("Can't open hzk16!");
getch();
exit(0);
}
while(*s)
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L; /* 计算汉字字模在文件中的位置 */
fseek(fp,location,SEEK_SET);
fread(buffer,32,1,fp);
for(i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour);
s+=2;
x+=16; /* 汉字间距 */
}
fclose(fp);
}
int get_key() /*得到按键扫描码*/
{union REGS reg;
reg.h.ah=0;
int86(0x16,®,®);
return reg.x.ax;}
void activemainmenu(int select) /*激活主菜单*/
{ int i;
i=select;
switch(i)
{case 1:
{putimage(1,3,mainbuf,XOR_PUT);break;}
case 2:
{putimage(16*w,3,mainbuf,XOR_PUT);break;}
case 3:
{putimage(32*w,3,mainbuf,XOR_PUT);break;}
case 4:
{putimage(48*w,3,mainbuf,XOR_PUT);break;}
}
}
void activesubmenu(int numb) /*激活子菜单*/
{
int j,f;
j=numb;
while(1)
{
unsigned key;
key=get_key();
switch(key)
{
case DOWN:
switch(j)
{
case 1: if(sn!=4){putimage(2,sn*h+2,mainbuf,XOR_PUT);sn++;putimage(2,sn*h+1,mainbuf,XOR_PUT);break;}
else {putimage(2,sn*h+2,mainbuf,XOR_PUT);sn=1;putimage(2,sn*h+1,mainbuf,XOR_PUT);break;}
case 2: if(sn!=6){putimage(16*w+1,sn*h+2,mainbuf,XOR_PUT);sn++;putimage(16*w+1,sn*h+1,mainbuf,XOR_PUT);break;}
else {putimage(16*w+1,sn*h+2,mainbuf,XOR_PUT);sn=1;putimage(16*w+1,sn*h+1,mainbuf,XOR_PUT);break;}
case 3: if(sn!=3){putimage(32*w+1,sn*h+2,mainbuf,XOR_PUT);sn++;putimage(32*w+1,sn*h+1,mainbuf,XOR_PUT);break;}
else {putimage(32*w+1,sn*h+2,mainbuf,XOR_PUT);sn=1;putimage(32*w+1,sn*h+1,mainbuf,XOR_PUT);break;}
case 4: if(sn!=4){putimage(48*w+1,sn*h+2,mainbuf,XOR_PUT);sn++;putimage(48*w+1,sn*h+1,mainbuf,XOR_PUT);break;}
else {putimage(48*w+1,sn*h+2,mainbuf,XOR_PUT);sn=1;putimage(48*w+1,sn*h+1,mainbuf,XOR_PUT);break;}
} break;
case UP:
switch(j)
{
case 1: if(sn!=1){putimage(2,sn*h+2,mainbuf,XOR_PUT);sn--;putimage(2,sn*h+2,mainbuf,XOR_PUT);break;}
else {putimage(2,sn*h+2,mainbuf,XOR_PUT);sn=4;putimage(2,sn*h+2,mainbuf,XOR_PUT);break;}
case 2: if(sn!=1){putimage(16*w+1,sn*h+2,mainbuf,XOR_PUT);sn--;putimage(16*w+1,sn*h+2,mainbuf,XOR_PUT);break;}
else {putimage(16*w+1,sn*h+2,mainbuf,XOR_PUT);sn=6;putimage(16*w+1,sn*h+2,mainbuf,XOR_PUT);break;}
case 3: if(sn!=1){putimage(32*w+1,sn*h+2,mainbuf,XOR_PUT);sn--;putimage(32*w+1,sn*h+2,mainbuf,XOR_PUT);break;}
else {putimage(32*w+1,sn*h+2,mainbuf,XOR_PUT);sn=3;putimage(32*w+1,sn*h+2,mainbuf,XOR_PUT);break;}
case 4: if(sn!=1){putimage(48*w+1,sn*h+2,mainbuf,XOR_PUT);sn--;putimage(48*w+1,sn*h+2,mainbuf,XOR_PUT);break;}
else {putimage(48*w+1,sn*h+2,mainbuf,XOR_PUT);sn=4;putimage(48*w+1,sn*h+2,mainbuf,XOR_PUT);break;}
}break;
/* case LEFT: {managemainmenu();break;} */
/*case RIGHT:{managemainmenu();break;} */
case ENTER:{subfunction();break;}
case ESC:{ managemainmenu();break;}
}
}
}
void subfunction()
{
setbkcolor(MAGENTA);
cleardevice();
setcolor(CYAN);
outtextxy(200,200,"This is an example! press any key to exit");
getch();
exit(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -