因为写一个程序封面要用到一个篆印做标记,所以临时写了一个小工具。
说明:
1。点左键置点,同时按左右键(其实应该是点右键,但是我用的mouse有点怪程别人不一样^_^)
消点.由于是调用了中断来显示鼠标,所以请在98,win me,ccdos,msdos...下使用^_^.
2。只是临时用用,所以功能吗......嘿嘿,自己扩充,
3。原来写的算法和这个不一样,改了一下,这样就可以和win-tc自带的字模函数配合用。最后得到的数据,相当一个24*24点阵的汉字字模.
/**********************************************/ /* 程序名称:图标制作(篆印制作) */ /* 程序作者:Knocker */ /* 完成日期:2004.10.7 */ /* 编译环境:Windows me + Win-TC 1.9.1 */ /* Email : knocker.k@163.com */ /**********************************************/
#include<dos.h> #include "Conio.h" #include "graphics.h"
#define TRUE 1 #define FALSE 0 int mouse_installed=FALSE ;
void Stars(int stars); void ShowPane(int*mat,int matsize,int x,int y,int color); void SavePane(int*mat,int paneX,int paneY,int m); void Meun(); int HideMouse(); int GetPressInfo(int button); int GetMouseXY(int*x,int*y); int InitMouse(); int ShowMouse(); void initgr(void); void pane(int x,int y,int paneX,int paneY,int pane_size,int pane_color); void fillpane(int x,int y,int pane_size,int fill_pane_color);
int main(void) { int startX=100,startY=100 ; /*方格起始位置*/ int pane_size=10 ; /*方格的大小*/ int pane_line_color=14 ; /*格线的color*/ int pane_filly_color=12 ; /*填充方格的color */ int paneX=24,paneY=24 ; /*点阵大小*/ int MouseX,MouseY ; /*mouse的位置*/ int tempX,tempY ; /*char key=0; */ int Temp[72]= { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, } ; char c='n'; initgr(); /* BGI初始化 */ Stars(2500); InitMouse(); Meun(); pane(startX,startY,paneX,paneY,pane_size,pane_line_color); ShowMouse(); while(c!='y') { while(!bioskey(1)) { if(GetPressInfo(0)==1) { GetMouseXY(&MouseX,&MouseY); tempX=(MouseX-startX)/pane_size ; tempY=(MouseY-startY)/pane_size ; if(MouseX>startX&&MouseY>startY) if((tempX>=0&&tempX<paneX)&&(tempY>=0&&tempY<paneY)) { HideMouse(); fillpane(startX+tempX*pane_size,startY+tempY*pane_size,pane_size,pane_filly_color); ShowMouse(); SavePane(Temp,tempX,tempY,1); } if(GetPressInfo(1)==1) { GetMouseXY(&MouseX,&MouseY); tempX=(MouseX-startX)/pane_size ; tempY=(MouseY-startY)/pane_size ; if(MouseX>startX&&MouseY>startY) if((tempX>=0&&tempX<paneX)&&(tempY>=0&&tempY<paneY)) { HideMouse(); fillpane(startX+tempX*pane_size,startY+tempY*pane_size,pane_size,0); ShowMouse(); SavePane(Temp,tempX,tempY,0); } } ShowPane(Temp,24,500,150,12); } } getch(); setcolor(BLUE); outtextxy(50,430,"Do you confirm that want to withdraw from the procedure ?(y or n)"); c=getch(); if(c=='y')break; setcolor(BLACK); outtextxy(50,430,"Do you confirm that want to withdraw from the procedure ?(y or n)"); graphdefaults(); }
closegraph(); clrscr(); printf("要打印点阵数据吗? (y or n)\n"); c=getch(); if(c=='y') for(paneX=1;paneX<=72;paneX++) { printf("%4d,",Temp[paneX-1]); if(paneX%8==0)printf("\n"); } return 0 ; } /* BGI初始化 */ void initgr(void) { int gd=DETECT,gm=0 ; /* 和gd = VGA,gm = VGAHI是同样效果 */ registerbgidriver(EGAVGA_driver); /* 注册BGI驱动后可以不需要.BGI文件的支持运行 */ initgraph(&gd,&gm,""); } void pane(int x,int y,int paneX,int paneY,int pane_size,int pane_color) /* x,y为方格起始坐标,paneX,paneY为X,Y方向方格数,pane_size为方格大小*/ { int i ; setcolor(pane_color); for(i=0;i<=paneX;i++) line(x+i*pane_size,y,x+i*pane_size,y+paneY*pane_size); for(i=0;i<=paneY;i++) line(x,y+i*pane_size,x+paneX*pane_size,y+i*pane_size); } void fillpane(int x,int y,int pane_size,int fill_pane_color) /*x,y为方格的顶点坐标,pane_size为方格大小,fill_pane_color为填充色*/ { setfillstyle(SOLID_FILL,fill_pane_color); bar(x+1,y+1,x+pane_size-1,y+pane_size-1); } /*=========Mouse处理============*/ int InitMouse() /* 初始化mouse */ { union REGS r ; r.x.ax=0 ; int86(0x33,&r,&r); if(r.x.ax==0xffff) mouse_installed=TRUE ; else mouse_installed=FALSE ; return(r.x.bx); } int ShowMouse() /* 显示鼠标 */ { union REGS r ; if(mouse_installed==FALSE)return(-1); r.x.ax=0x0001 ; int86(0x33,&r,&r); return(0); } int GetMouseXY(int*x,int*y) /*读取鼠标位置 */ { union REGS r ; if(mouse_installed==FALSE)return(-1); r.x.ax=0x0003 ; int86(0x33,&r,&r); *x=r.x.cx ; *y=r.x.dx ; return(0); } int GetPressInfo(int button) /*读取按下信息*/ { union REGS r ; if(mouse_installed==FALSE)return(-1); r.x.ax=0x0005 ; r.x.bx=button ; int86(0x33,&r,&r); return(r.x.bx); } /* button=1时,返回左右键同时按下次数。 */ /* button=0时,返回左键按下次数。 */ int SetMouseXY(int x,int y) /*设置鼠标位置*/ { union REGS r ; if(mouse_installed==FALSE)return(-1); r.x.ax=0x0004 ; r.x.cx=x ; r.x.dx=y ; int86(0x33,&r,&r); return(0); } int HideMouse() /* 隐藏鼠标 */ { union REGS r ; if(mouse_installed==FALSE)return(-1); r.x.ax=0x0002 ; int86(0x33,&r,&r); return(0); } /*=============顶条==========*/ void Meun()
{ setfillstyle(SOLID_FILL,CYAN); bar3d(50,20,590,50,0,0); outtextxy(100, 35," (C) Knocker 2004.10.07. Test the edition . "); } /*=========预视=============*/
void ShowPane(int*mat,int matsize,int x,int y,int color) /*依次:印模指针、点阵大小、起始坐标(x,y)、颜色*/ { int i,j,k,n ; setcolor(LIGHTCYAN); setfillstyle(SOLID_FILL,WHITE); bar3d(x-20,y-20,x+45,y+45,0,0); n=(matsize-1)/8+1 ; for(j=0;j<matsize;j++) for(i=0;i<n;i++) for(k=0;k<8;k++) /*测试为1的位则显示*/ if(mat[j*n+i]&(0x80>>k))putpixel(x+i*8+k,y+j,color); }
void SavePane(int*mat,int paneX,int paneY,int m) /*字模指针,点的位置x,y, m=0则消点,m=1则置点*/ { int c=0x01 ; int i,j ; i=paneX/8 ; j=paneX%8 ; c<<=(7-j); if(m==1)*(mat+i+paneY*3)=(*(mat+i+paneY*3)|c); else *(mat+i+paneY*3)=(*(mat+i+paneY*3)^c); } void Stars(int stars) { while(stars--)putpixel(rand()%640,rand()%480,rand()%16); }
[此贴子已经被作者于2004-10-08 10:29:12编辑过]