共有回帖数 0 个
-
有一段时间想编写图形化界面,用的是dos的图形函数,后来发现根本不实用.但已经编写一部分了.给大家看看.学c语言6个月后编写的,希望能对出学者一些启发~~本来很顺畅,但由于源码乱改,不知哪个没有bug了,就随手捡一个出来.
很简陋,不吝赐教,谢谢----badming
主文件main.c(一楼)
汉字包文件:hanzi.c(2-3楼)
窗体文件包文件:win_body.c(4楼)
鼠标文件包:mouse.c(5楼)
/////这个保存为main.c////
/* WIN-TC BGI 图形编程模板 */
#include "Conio.h"
#include "graphics.h"
#include "dos.h"
#include "mouse.c"
#include "hanzi.c"
#include "win_body.c"
#define closegr closegraph
#define NULL 0
void initgr(void) /* BGI初始化 */
{
int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果 */
registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行 */
initgraph(&gd, &gm, "");
}
/****************************************************************************/
struct b_window_body full={
1,
1,1,639,477,
"working",
0,{0},{0},{0},
13,{0},{0x1002,0x1002,0x1002,0x1002,0x1002,0xc02,0xc02,0xc02,0xc02,0xc02,0xc02,0xc02,0xc02},
{6,50,94,138,182,6,40,76,112,148,184,220,256},/*(字号+4)*n+4*/
{24,24,24,24,24,48,48,48,48,48,48,48,48},
{1,2,3,0,4,5,6,7,8,9,10,11,12},
0,0,0,0,
0,bad_f};
struct b_window_body xin={
1,
200,200,400,360,
"new",
0,{0},{0},{0},
3,{0},{0x1003,0x1002,0x1002},
{206,294,338},
{300,300,300},
{15,14,13},
1,0,220,250,
0,bad_f};
struct b_file{
int choice;
int num;
int open;
int sex;
char name[20];
struct b_file * parent;
struct b_file * l_brother;
struct b_file * r_brother;
struct b_file * child;
}root={0,1,1,1,"root",0,0,0,0},
bad1={0,1,0,1,"bad",&root,0,0,0},
bad2={0,2,0,0,"bad",&root,0,0,0},
bad3={0,3,0,1,"bad",&root,0,0,0},
bad4={0,5,0,1,"bad",0,0,0,0},*living,*lived;
draw_file(struct b_file *p)
{int midx,midy;
midx=(p-num-1)%12*50+30;
midy=(p-num-1)/12*60+30+70;
setcolor(13-p-choice);
rectangle(midx-20,midy-20,midx+20,midy+20);
if(p-sex==1)circle(midx,midy,5);
outtextxy(midx-20,midy+25,p-name);
}
look_file(struct b_file *p)
{
setfillstyle(1,15);
bar(5,70,636,476);
if(p-open==0){ /*文件或每打开的文件夹*/
if(p-l_brother!=0)p=p-parent-child;/*有左兄弟到大哥那里*/
loop:draw_file(p);if(p-r_brother!=0){p=p-r_brother;goto loop;}}
else if(p-child!=0){p=p-child;goto loop;}
}
open_file(struct b_file *p)
{if(p-sex==1)p-open=1;
look_file(p);
}
back_file()/*注意!改变了living 的指向!!!*/
{
if(living-parent!=0)if(living-open==0){living-choice=0;living=living-parent;}/*有父亲,是文件或每打开的文件夹*/
living-open=0;living-choice=1;
look_file(living);
}
search_file(x,y)
{
int i=1,midx,midy;
struct b_file *q;
q=living;
if(living-sex==1&&living-open==1){ /*一个打开的文件家*/
if(living-child!=0){living=living-child;}/*有害子则到孩子*/
else return;
}
else if(living-l_brother!=0)living=living-parent-child; /*有左兄弟,到大哥*/
while(i)
{
midx=(living-num-1)%9*50+30;
midy=(living-num-1)/6*30+30+70;
if(x=midx-20&&x=midx+20&&y=midy-20&&y=midy+25)
{q-choice=0;living-choice=1;i=0; look_file(living); }
else if(living-r_brother!=0){living=living-r_brother;}
else {living=q;living-choice=1;i=0;}
}
}
new_file(n)
{lived=(struct b_file *)malloc(sizeof(struct b_file));
if(living-open==1&&living-child==0){lived-parent=living;living-child=lived; lived-sex=n;
lived-choice=1;
living=lived;lived-num=1;return;}
if(living-open==1&&living-child!=0)living=living-child;
if(living-open==0)living-choice=0;
while(living-r_brother!=0)living=living-r_brother;
living-r_brother=lived;lived-l_brother=living;lived-parent=living-parent;
lived-num=living-num+1;
lived-sex=n;
lived-choice=1;
living=lived;
}
thing(n)/*按调用号对事件的具体处理*/
{
switch(n)
{
case 0:closegr();exit(0);break;
case 1:b_window_draw(xin);xin.power=1;while(xin.power)(*xin.f)(&xin);look_file(living);break;
case 2:open_file(living);break;
case 3:back_file();break;
case 13:xin.power=0;break;
case 14:new_file(1);xin.power=0;break;
case 15:new_file(2);xin.power=0;break;
}
}
int main(void)
{ int i;
initgr(); /* BGI初始化 */
b_window_draw(full);
hanzi();
living=&root;
root.child=&bad1;
bad1.r_brother=&bad2;
bad2.l_brother=&bad1;
bad2.r_brother=&bad3;
bad3.l_brother=&bad2;
bad3.child=&bad4;
bad4.parent=&bad3;
thing(2);
while(1){
(*full.f)(&full);
}
getch();
closegr(); /* 恢复TEXT屏幕模式 */
return 0;
}
/////这个保存为hanzi.c/////
char tui16S[]={
/* 以下是 '退' 的 16点阵宋体 字模,32 byte */
0x40,0x00,0x27,0xF0,0x24,0x10,0x07,0xF0,
0x04,0x10,0x04,0x10,0xE7,0xF0,0x24,0x88,
0x24,0x50,0x24,0x20,0x25,0x10,0x26,0x18,
0x24,0x08,0x50,0x00,0x8F,0xFE,0x00,0x00,
};
char chu16S[]={
/* 以下是 '出' 的 16点阵宋体 字模,32 byte */
0x01,0x00,0x01,0x00,0x21,0x04,0x21,0x04,
0x21,0x04,0x21,0x04,0x3F,0xFC,0x21,0x04,
0x01,0x00,0x21,0x04,0x21,0x04,0x21,0x04,
0x21,0x04,0x3F,0xFC,0x20,0x04,0x00,0x00,
};
char xin16S[]={
/* 以下是 '新' 的 16点阵宋体 字模,32 byte */
0x10,0x00,0x08,0x0E,0x7F,0x70,0x22,0x40,
0x14,0x40,0xFF,0x7E,0x08,0x48,0x08,0x48,
0xFF,0x48,0x08,0x48,0x2C,0x48,0x2A,0x88,
0x4A,0x88,0x89,0x08,0x2A,0x08,0x10,0x08,
};
char jian16S[]={
/* 以下是 '建' 的 16点阵宋体 字模,32 byte */
0x00,0x40,0x78,0x40,0x0B,0xF8,0x10,0x48,
0x17,0xFE,0x20,0x48,0x7B,0xF8,0x08,0x40,
0x4B,0xFC,0x48,0x40,0x28,0x40,0x17,0xFC,
0x28,0x40,0x46,0x40,0x81,0xFE,0x00,0x00,
};
char da16S[]={
/* 以下是 '打' 的 16点阵宋体 字模,32 byte */
0x10,0x00,0x10,0x00,0x13,0xFE,0x10,0x20,
0xFE,0x20,0x10,0x20,0x14,0x20,0x18,0x20,
0x30,0x20,0xD0,0x20,0x10,0x20,0x10,0x20,
0x10,0x20,0x10,0x20,0x50,0xA0,0x20,0x40,
};
char kai16S[]={
/* 以下是 '开' 的 16点阵宋体 字模,32 byte */
0x00,0x00,0x7F,0xFE,0x04,0x20,0x04,0x20,
0x04,0x20,0x04,0x20,0xFF,0xFE,0x04,0x20,
0x04,0x20,0x04,0x20,0x08,0x20,0x08,0x20,
0x10,0x20,0x20,0x20,0x40,0x20,0x00,0x00,
};
char hou16S[]={
/* 以下是 '后' 的 16点阵宋体 字模,32 byte */
0x00,0x7C,0x1F,0x80,0x10,0x00,0x10,0x00,
0x1F,0xFC,0x10,0x00,0x10,0x00,0x10,0x00,
0x17,0xF8,0x24,0x08,0x24,0x08,0x24,0x08,
0x47,0xF8,0x44,0x08,0x84,0x08,0x00,0x00,
};
char da12S[]={
/* 以下是 '打' 的 12点阵宋体 字模,24 byte */
0x20,0x00,0x27,0xE0,0xF8,0x80,0x20,0x80,
0x20,0x80,0x38,0x80,0xE0,0x80,0x20,0x80,
0x20,0x80,0x20,0x80,0xE3,0x80,0x00,0x00,
};
char kai12S[]={
/* 以下是 '开' 的 12点阵宋体 字模,24 byte */
0x00,0x40,0x7F,0xE0,0x11,0x00,0x11,0x00,
0x11,0x00,0xFF,0xE0,0x11,0x00,0x11,0x00,
0x11,0x00,0x21,0x00,0xC1,0x00,0x00,0x00,
};
char jian12S[]={
/* 以下是 '剪' 的 12点阵宋体 字模,24 byte */
0x11,0x00,0xFF,0xE0,0x48,0x40,0x7A,0x40,
0x4A,0x40,0x7A,0x40,0x48,0xC0,0x00,0x00,
0x7F,0xC0,0x08,0x40,0x73,0x80,0x00,0x00,
};
char qie12S[]={
/* 以下是 '切' 的 12点阵宋体 字模,24 byte */
0x20,0x20,0x2F,0xE0,0x21,0x20,0x39,0x20,
0xE1,0x20,0x21,0x20,0x22,0x20,0x2A,0x20,
0x34,0x20,0x28,0x20,0x11,0xC0,0x00,0x00,
};
char fu12S[]={
/* 以下是 '复' 的 12点阵宋体 字模,24 byte */
0x10,0x40,0x3F,0xE0,0x60,0x80,0xBF,0x80,
0x20,0x80,0x3F,0x80,0x10,0x00,0x1F,0x80,
0x69,0x00,0x06,0x00,0xF9,0xE0,0x00,0x00,
};
char zhi12S[]={
/* 以下是 '制' 的 12点阵宋体 字模,24 byte */
0x10,0x20,0x54,0x20,0x7E,0xA0,0x90,0xA0,
0xFE,0xA0,0x10,0xA0,0x7E,0xA0,0x52,0xA0,
0x52,0x20,0x56,0x20,0x10,0xE0,0x00,0x00,
};
char zhan12S[]={
/* 以下是 '粘' 的 12点阵宋体 字模,24 byte */
0x21,0x00,0xA9,0x00,0x71,0xE0,0x21,0x00,
0xFD,0x00,0x21,0x00,0x77,0xE0,0xAC,0x20,
0xA4,0x20,0x24,0x20,0x27,0xE0,0x00,0x00,
};
char tie12S[]={
/* 以下是 '贴' 的 12点阵宋体 字模,24 byte */
0xF9,0x00,0x89,0x00,0xA9,0xE0,0xA9,0x00,
0xA9,0x00,0xAB,0xE0,0xAA,0x20,0xAA,0x20,
0x52,0x20,0x4B,0xE0,0x82,0x20,0x00,0x00,
};
char shan12S[]={
/* 以下是 '删' 的 12点阵宋体 字模,24 byte */
0x77,0x20,0x55,0x20,0x55,0x20,0x55,0x20,
0x55,0x20,0xFF,0xA0,0x55,0x20,0x55,0x20,
0x55,0x20,0x55,0x20,0xBB,0x60,0x00,0x00,
};
char chu12S[]={
/* 以下是 '除' 的 12点阵宋体 字模,24 byte */
0xF1,0x00,0x92,0x80,0xA4,0x40,0xA8,0x20,
0xA7,0xC0,0x91,0x00,0x9F,0xE0,0xF1,0x00,
0x85,0x40,0x89,0x20,0x93,0x20,0x00,0x00,
};
char ming12S[]={
/* 以下是 '命' 的 12点阵宋体 字模,24 byte */
0x04,0x00,0x0A,0x00,0x11,0x00,0x3F,0x80,
0xC0,0x60,0x7B,0xC0,0x4A,0x40,0x4A,0x40,
0x7A,0x40,0x4A,0xC0,0x02,0x00,0x00,0x00,
};
char ming122S[]={
/* 以下是 '名' 的 12点阵宋体 字模,24 byte */
0x08,0x00,0x0F,0xC0,0x10,0x80,0x31,0x00,
0x4A,0x00,0x04,0x00,0x0F,0xC0,0x30,0x40,
0xD0,0x40,0x10,0x40,0x1F,0xC0,0x00,0x00,
};
char shua12S[]={
/* 以下是 '刷' 的 12点阵宋体 字模,24 byte */
0x7E,0x20,0x42,0xA0,0x7E,0xA0,0x48,0xA0,
0x48,0xA0,0x7E,0xA0,0x6A,0xA0,0xAA,0xA0,
0xAA,0xA0,0x2E,0x20,0x08,0xE0,0x00,0x00,
};
char xin12S[]={
/* 以下是 '新' 的 12点阵宋体 字模,24 byte */
0x10,0x60,0xFD,0x80,0x49,0x00,0x29,0x00,
0xFD,0xE0,0x11,0x40,0xFD,0x40,0x59,0x40,
0x55,0x40,0x92,0x40,0x34,0x40,0x00,0x00,
};
char bang16S[]={
/* 以下是 '帮' 的 16点阵宋体 字模,32 byte */
0x04,0x00,0x3F,0xBE,0x04,0x24,0x3F,0xA8,
0x04,0x28,0x7F,0xA4,0x04,0x32,0x08,0xAC,
0x10,0xA0,0x2F,0xF8,0x48,0x88,0x08,0x88,
0x08,0xA8,0x08,0x90,0x00,0x80,0x00,0x80,
};
char zhu16S[]={
/* 以下是 '助' 的 16点阵宋体 字模,32 byte */
0x00,0x20,0x3E,0x20,0x22,0x20,0x22,0x20,
0x22,0xFC,0x3E,0x24,0x22,0x24,0x22,0x24,
0x3E,0x24,0x22,0x24,0x22,0x44,0x27,0x44,
0xF8,0x84,0x01,0x14,0x02,0x08,0x00,0x00,
};
void drawmat(char *mat,int matsize,int x,int y,int color)
/*依次:字模指针、点阵大小、起始坐标(x,y)、颜色*/
{int i,j,k,n;
n=(matsize-1)/8+1;
for(j=0;jmatsize;j++)
for(i=0;in;i++)
for(k=0;k8;k++)
if(mat[j*n+i]&(0x80k)) /*测试为1的位则显示*/
putpixel(x+i*8+k,y+j,color);
}
hanzi(){
drawmat(xin16S,16,8,26,6);/*对应按钮坐标横纵都+2,紧接的字横坐标+字号+4*/
drawmat(jian16S,16,24,26,6);
drawmat(da16S,16,52,26,6);
drawmat(kai16S,16,72,26,6);
drawmat(hou16S,16,94,26,6);
drawmat(tui16S,16,114,26,6);
drawmat(tui16S,16,140,26,6);
drawmat(chu16S,16,160,26,6);
drawmat(bang16S,16,184,26,6);
drawmat(zhu16S,16,204,26,6);
drawmat(da12S,12,8,50,6);
drawmat(kai12S,12,24,50,6);
drawmat(jian12S,12,44,50,6);
drawmat(qie12S,12,58,50,6);
drawmat(fu12S,12,78,50,6);
drawmat(zhi12S,12,94,50,6);
drawmat(zhan12S,12,114,50,6);
drawmat(tie12S,12,130,50,6);
drawmat(xin12S,12,150,50,6);
drawmat(jian12S,12,166,50,6);
drawmat(shan12S,12,186,50,6);
drawmat(chu12S,12,202,50,6);
drawmat(shua12S,12,222,50,6);
drawmat(xin12S,12,238,50,6);
}////保存为win_body.c////
/*函数说明:本函数快提供2中函数调用
1为b_window_draw(struct b_window_body p),用于初始化窗体;
2为船体结构体体struct b_window_body的设计,
存北京色无法完成。具体解释如下*/
struct b_window_body
{
int power;
int minx;
int miny;
int maxx;
int maxy;/*窗体框*/
/***********/
char *title;/*窗体标题*/
int word_num;/*提示信息的条数*/
char *word[13];/*信息内容*/
int word_x[13];/*信息的输出坐标*/
int word_y[13];
/**************/
int button;/*按钮的数目*/
int button_press[13];/*按键的状态*/
int button_mode[13];/*按键的模式,16进制数,前8为容纳字符数,后8为容纳字号大小点阵*/
int button_x[13];/*按键坐标*/
int button_y[13];
int button_thing[13];/*按键触发的事件*/
/******************/
int input;/*是否有输入*/
char *input_word;/*输入内容*/
int input_x;/*输入显示的坐标*/
int input_y;
/**************/
int *pic;/*所占据的背景储存*/
int (*f)();/*处理函数指针*/
};
draw_button(x,y,mode,press)
{int size,n;
size=mode8;
n=mode&255;
setcolor(15-press*8);line(x,y,x+(size+4)*n,y);line(x,y,x,y+(size+4));
setcolor(7+press*8);line(x,y+(size+4),x+(size+4)*n,y+(size+4));line(x+(size+4)*n,y,x+(size+4)*n,y+(size+4));
}
b_window_draw(struct b_window_body p)
{int i;
setbkcolor(15);
setcolor(13);
rectangle(p.minx,p.miny,p.maxx,p.maxy);
setfillstyle(1,1);
bar(p.minx+2,p.miny+2,p.maxx-2,p.miny+18);
line(p.minx,p.miny+20,p.maxx,p.miny+20);
setcolor(15);
outtextxy(p.minx+2,p.miny+6,p.title);
if(p.button!=0)for(i=0;i=p.button-1;i+=1)
draw_button(p.button_x,p.button_y,p.button_mode,p.button_press);
if(p.word_num!=0)for(i=0;i=p.word_num-1;i+=1){setcolor(13);outtextxy(p.word_x,p.word_y,p.word);}
}/*********************/
/*以下为函数的引用,基本的通用函数,必须家鼠标函数*/
int bad_f(struct b_window_body *p)
{ int i;
if(mouse(3,0,0)==1)
{for(i=0;i=((*p).button-1);i+=1)
if(mousex=(*p).button_x&&mousex=((*p).button_x+((*p).button_mode&255)*(((*p).button_mode8)+4))
&&mousey=(*p).button_y&&mousey=(*p).button_y+((*p).button_mode8)+4)
{(*p).button_press=1;draw_button((*p).button_x,(*p).button_y,(*p).button_mode,(*p).button_press);
if(mouse(3,0,0)==0)thing((*p).button_thing);}if(mouse(3,0,0)==0)search_file(mousex,mousey);}
else for(i=0;i=((*p).button-1);i+=1)
if((*p).button_press==1){(*p).button_press=0;
draw_button((*p).button_x,(*p).button_y,(*p).button_mode,(*p).button_press);}
}
.///这个保存为mouse.c////
#include "graphics.h"
#include "dos.h"
#define NULL 0
char mouseary[]={
/* 以下是 '☆' 的 16点阵宋体 字模,32 byte */
0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,
0x02,0x80,0x04,0x40,0xFC,0x7E,0x40,0x04,
0x30,0x18,0x08,0x20,0x08,0x20,0x11,0x90,
0x16,0x50,0x18,0x30,0x20,0x08,0x00,0x00,
};
int mousex,mousey,mousez,mousex1,mousey1,*mousepoint=NULL;
drawmouse(x,y){
int i,j,k,n;
n=(16-1)/8+1;
for(j=0;j16;j++)
for(i=0;in;i++)
for(k=0;k8;k++)
if(mouseary[j*n+i]&(0x80k)) /*测试为1的位则显示*/
putpixel(x+i*8+k,y+j,GREEN);
}
mouse(n,x,y)
int x,y,n;
{switch(n){
case 0:_AX=0;geninterrupt(0x33);break;/*初始化*/
case 1:_AX=1;geninterrupt(0x33);break;/*显示模式*/
case 2:_AX=2;geninterrupt(0x33);break;/*隐藏模式*/
case 3:_AX=3;geninterrupt(0x33);mousex=_CX;mousey=_DX;mousez=_BX;
if(((mousex1!=mousex)||(mousey1!=mousey))&&(x==0)){
{putimage(mousex1,mousey1,mousepoint,0);free(mousepoint);
getimage(mousex,mousey,mousex+15,mousey+15,mousepoint);drawmouse(mousex,mousey);}
mousex1=mousex;mousey1=mousey;}/*显示鼠标*/
if(x==1){free(mousepoint);getimage(mousex,mousey,mousex+15,mousey+15,mousepoint);mousex1=mousex;mousey1=mousey;}/*取鼠标背景图*/
if(x==2){putimage(mousex1,mousey1,mousepoint,0);}/*释放背景图*/ if(mousez&1)return 1; else {if (mousez&2)return 2;else return 0;}break;
case 7:_AX=7;_CX=x;_DX=y;geninterrupt(0x33);break;/*设置水平范围*/
case 8:_AX=8;_CX=x;_DX=y;geninterrupt(0x33);break;/*设置垂直范围*/
}
}
楼主 2016-03-03 17:26 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知