![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 15:55 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » c语言开发鼠标驱动问题 |
| 可打印版本 1,900 / 9 |
| 第1楼 yueluck | 发表于 2007-06-14 16:45 |
| 初级用户 发帖 14 积分 32 | |
|
c语言开发鼠标驱动问题 问题在于:1鼠标留下的痕迹不能消除2.鼠标范围.我真的不懂,谢谢好心人.
/* Note:Your choice is C IDE */ #include "stdio.h" #include"graphics.h" #include<dos.h> #define ture 1 #define false 0 int mouse_installed=false; char wen16K[]={ /* 以下是 '温' 的 16点阵楷体_GB2312 字模,32 byte */ 0x00,0x00,0x00,0xF0,0x27,0x10,0x14,0xD0, 0x03,0x20,0x82,0x60,0x41,0x80,0x00,0x30, 0x17,0xD0,0x25,0x50,0x25,0x50,0x45,0xFC, 0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; char du16K[]={ /* 以下是 '度' 的 16点阵楷体_GB2312 字模,32 byte */ 0x01,0x00,0x00,0x80,0x00,0xF0,0x1F,0x40, 0x12,0x70,0x17,0xC0,0x12,0x40,0x13,0x80, 0x10,0xC0,0x27,0x40,0x22,0x40,0x41,0x80, 0x42,0x60,0x9C,0x3E,0x00,0x00,0x00,0x00, }; void drawmat(char *mat,int matsize,int x,int y,int color); int InitMouse(void); int ShowMouse(void); int HideMouse(void); int GetMouseXY(int *x,int *y); int SetMouseXY(int x,int y); int GetPressInfo(int button); int GetReleaseInfo(int button); int SetXRange(int min,int max); int SetYRange(int min,int max); main() { int g=DETECT,m;char *chara,x,y,a=0,b=0,mouse_buttons; initgraph(&g,&m,"");setviewport(0,0,639,479,0); mouse_buttons=InitMouse(); if(mouse_installed==false) { printf("Mouse NOT installed!\n"); printf("Program finished!\n"); exit(-1); } /*ShowMouse();*/ setwritemode(0); ellipse(120,120,0,360,30,20);setcolor(1); ellipse(120,120,0,360,29,19); setfillstyle(1,1); fillellipse(120,120,28,18);drawmat(wen16K,16,102,115,15);drawmat(du16K,16,118,115,15); setcolor(4);settextstyle(0,0,2); sprintf(chara,"%c",24); outtextxy(136,115,chara);circle(a,b,3); while(!kbhit()) { GetMouseXY(&x,&y); if(a!=x&&b!=y){setcolor(0); circle(a,b,3);}setcolor(15); if(x<0)x=0; if(y<0)y=0; if(x>639)x=639; if(y>479)y=479; circle(x,y,3); a=x;b=y; if(GetPressInfo(0)==1) { } if(GetReleaseInfo(0)==1) { } if(GetPressInfo(mouse_buttons-1)==1) { } if(GetReleaseInfo(mouse_buttons-1)==1) { } gotoxy(40,3); printf("Mouse X:%-d",x); gotoxy(40,4); printf("Mouse Y:%-d",y); } } 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;j<matsize;j++) for(i=0;i<n;i++) for(k=0;k<8;k++) if(mat[j*n+i]&(0x80>>k)) /*测试为1的位则显示*/ putpixel(x+i*8+k,y+j,color); } int InitMouse(void) { union REGS r; r.x.ax=0; int86(0x33,&r,&r); if(r.x.ax==0xffff) mouse_installed=ture; else mouse_installed=false; return(r.x.bx); } int ShowMouse(void) { union REGS r; if(mouse_installed==false) return (-1); r.x.ax=0x0001; int86(0x33,&r,&r); return(0); } int HideMouse(void) { union REGS r; if(mouse_installed==false) return (-1); r.x.ax=0x0002; 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 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 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); } int GetReleaseInfo(int button) { union REGS r; if(mouse_installed==false) return (-1); r.x.ax=0x0006; r.x.bx=button; int86(0x33,&r,&r); return(r.x.bx); } int SetXRange(int min,int max) { union REGS r; if(mouse_installed==false) return (-1); r.x.ax=0x0007; r.x.cx=min; r.x.dx=max; int86(0x33,&r,&r); return(0); } int SetYRange(int min,int max) { union REGS r; if(mouse_installed==false) return (-1); r.x.ax=0x0008; r.x.cx=min; r.x.dx=max; int86(0x33,&r,&r); return(0); } |
|
| 第2楼 nilauh | 发表于 2007-06-14 21:16 |
| 新手上路 发帖 2 积分 6 | |
|
你应该这么做 判断鼠标位置有改变后
1:在鼠标现在的位置输出保存的图形 2:把鼠标要移动的下一个位置一定范围内的图形保存下来 3:在新位置画鼠标 4:新坐标代替旧坐标 ps:程序初始化就要鼠标现在的位置的图形再画鼠标 |
|
| 第3楼 firstsail | 发表于 2007-06-14 21:32 |
| 高级用户 发帖 295 积分 668 来自 广东深圳 | |
|
将鼠标关闭显示后,才能调用画图函数,画完后,再来恢复鼠标的显示。
|
|
| 第4楼 yueluck | 发表于 2007-06-15 09:38 |
| 初级用户 发帖 14 积分 32 | |
|
能写给我吗? 我的鼠标是个圆形.我用imagesize,getimage,putimage 但是没效果,而且鼠标只是在左上角很小的范围内活动.
谢谢回复. |
|
| 第5楼 nilauh | 发表于 2007-06-15 18:37 |
| 新手上路 发帖 2 积分 6 | |
|
呵呵 你参考一下我的程序有点大 /*main.h*/
#include <dos.h> #include <bios.h> #include <malloc.h> #include <stdlib.h> #include <stdio.h> #include <graphics.h> #define BkColor LIGHTBLUE #define sysbutton_width 14 #define sysbutton_height 12 #define linewidth 1 #define sysmargin 2 #define sysbutton_Interval 3 #define sysbutton_MIN_LM 4 #define sysbutton_MIN_RM 4 #define sysbutton_MIN_BM 2 #define sysbutton_CLOSE_LM 4 #define sysbutton_CLOSE_RM 3 #define sysbutton_CLOSE_BM 3 #define sysbutton_CLOSE_TM 3 #define syswindowboderWidth 7 #define syswindowboderheight 6 #define syswindowtopboder 4 #define syswindowleftboder 4 #define syswindowrightboder 3 #define syswindowbottomboder 2 #define CapWidth 300 #define CapHeight 15 #define SysMinButtonLM (sysmargin+sysbutton_width*2+linewidth+sysbutton_Interval) #define SysCloseButtonLM (sysmargin+sysbutton_width) #define SysBorderWidth 3 #define SysMenuMargin 5 #define SysMainMenuWidth 36 #define SysMainMenuHeight 14 int WindowHeight= 50; int WindowWidth=100; #define initgraph() \ {\ int gdriver=DETECT, gmode;\ unsigned int capsize;\ int i, ht; \ registerbgidriver(EGAVGA_driver);\ initgraph(&gdriver, &gmode, "");\ setbkcolor(BkColor);\ } #define midx ((getmaxx()/2)) #define midy ((getmaxy()/2)) #define MouseWidth 13 #define MouseHeight 22 #define draw_mouse(x,y){\ putpixel(x,y,DARKGRAY);\ putpixel(x,y+1,DARKGRAY);\ putpixel(x+1,y+1,DARKGRAY);\ putpixel(x,y+2,DARKGRAY);\ putpixel(x+1,y+2,WHITE);\ putpixel(x+2,y+2,DARKGRAY);\ putpixel(x,y+3,DARKGRAY);\ putpixel(x+1,y+3,WHITE);\ putpixel(x+2,y+3,WHITE);\ putpixel(x+3,y+3,DARKGRAY);\ putpixel(x,y+4,DARKGRAY);\ putpixel(x+1,y+4,WHITE);\ putpixel(x+2,y+4,WHITE);\ putpixel(x+3,y+4,WHITE);\ putpixel(x+4,y+4,DARKGRAY);\ putpixel(x,y+5,DARKGRAY);\ putpixel(x+1,y+5,WHITE);\ putpixel(x+2,y+5,WHITE);\ putpixel(x+3,y+5,WHITE);\ putpixel(x+4,y+5,WHITE);\ putpixel(x+5,y+5,DARKGRAY);\ putpixel(x,y+6,DARKGRAY);\ putpixel(x+1,y+6,WHITE);\ putpixel(x+2,y+6,WHITE);\ putpixel(x+3,y+6,WHITE);\ putpixel(x+4,y+6,WHITE);\ putpixel(x+5,y+6,WHITE);\ putpixel(x+6,y+6,DARKGRAY);\ putpixel(x,y+7,DARKGRAY);\ putpixel(x+1,y+7,WHITE);\ putpixel(x+2,y+7,WHITE);\ putpixel(x+3,y+7,WHITE);\ putpixel(x+4,y+7,WHITE);\ putpixel(x+5,y+7,WHITE);\ putpixel(x+6,y+7,WHITE);\ putpixel(x+7,y+7,DARKGRAY);\ putpixel(x,y+8,DARKGRAY);\ putpixel(x+1,y+8,WHITE);\ putpixel(x+2,y+8,WHITE);\ putpixel(x+3,y+8,WHITE);\ putpixel(x+4,y+8,WHITE);\ putpixel(x+5,y+8,WHITE);\ putpixel(x+6,y+8,WHITE);\ putpixel(x+7,y+8,WHITE);\ putpixel(x+8,y+8,DARKGRAY);\ putpixel(x,y+9,DARKGRAY);\ putpixel(x+1,y+9,WHITE);\ putpixel(x+2,y+9,WHITE);\ putpixel(x+3,y+9,WHITE);\ putpixel(x+4,y+9,WHITE);\ putpixel(x+5,y+9,WHITE);\ putpixel(x+6,y+9,WHITE);\ putpixel(x+7,y+9,WHITE);\ putpixel(x+8,y+9,WHITE);\ putpixel(x+9,y+9,DARKGRAY);\ putpixel(x,y+10,DARKGRAY);\ putpixel(x+1,y+10,WHITE);\ putpixel(x+2,y+10,WHITE);\ putpixel(x+3,y+10,WHITE);\ putpixel(x+4,y+10,WHITE);\ putpixel(x+5,y+10,WHITE);\ putpixel(x+6,y+10,WHITE);\ putpixel(x+7,y+10,WHITE);\ putpixel(x+8,y+10,WHITE);\ putpixel(x+9,y+10,WHITE);\ putpixel(x+10,y+10,DARKGRAY);\ putpixel(x,y+11,DARKGRAY);\ putpixel(x+1,y+11,WHITE);\ putpixel(x+2,y+11,WHITE);\ putpixel(x+3,y+11,WHITE);\ putpixel(x+4,y+11,WHITE);\ putpixel(x+5,y+11,WHITE);\ putpixel(x+6,y+11,WHITE);\ putpixel(x+7,y+11,DARKGRAY);\ putpixel(x+8,y+11,DARKGRAY);\ putpixel(x+9,y+11,DARKGRAY);\ putpixel(x+10,y+11,DARKGRAY);\ putpixel(x+11,y+11,DARKGRAY);\ putpixel(x,y+12,DARKGRAY);\ putpixel(x+1,y+12,WHITE);\ putpixel(x+2,y+12,WHITE);\ putpixel(x+3,y+12,WHITE);\ putpixel(x+4,y+12,DARKGRAY);\ putpixel(x+5,y+12,WHITE);\ putpixel(x+6,y+12,WHITE);\ putpixel(x+7,y+12,DARKGRAY);\ putpixel(x,y+13,DARKGRAY);\ putpixel(x+1,y+13,WHITE);\ putpixel(x+2,y+13,WHITE);\ putpixel(x+3,y+13,DARKGRAY);\ putpixel(x+4,y+13,DARKGRAY);\ putpixel(x+5,y+13,WHITE);\ putpixel(x+6,y+13,WHITE);\ putpixel(x+7,y+13,DARKGRAY);\ putpixel(x,y+14,DARKGRAY);\ putpixel(x+1,y+14,WHITE);\ putpixel(x+2,y+14,DARKGRAY);\ putpixel(x+5,y+14,DARKGRAY);\ putpixel(x+6,y+14,WHITE);\ putpixel(x+7,y+14,WHITE);\ putpixel(x+8,y+14,DARKGRAY);\ putpixel(x,y+15,DARKGRAY);\ putpixel(x+1,y+15,DARKGRAY);\ putpixel(x+5,y+15,DARKGRAY);\ putpixel(x+6,y+15,WHITE);\ putpixel(x+7,y+15,WHITE);\ putpixel(x+8,y+15,DARKGRAY);\ putpixel(x,y+16,DARKGRAY);\ putpixel(x+6,y+16,DARKGRAY);\ putpixel(x+7,y+16,WHITE);\ putpixel(x+8,y+16,WHITE);\ putpixel(x+9,y+16,DARKGRAY);\ putpixel(x+6,y+17,DARKGRAY);\ putpixel(x+7,y+17,WHITE);\ putpixel(x+8,y+17,WHITE);\ putpixel(x+9,y+17,DARKGRAY);\ putpixel(x+7,y+18,DARKGRAY);\ putpixel(x+8,y+18,WHITE);\ putpixel(x+9,y+18,WHITE);\ putpixel(x+10,y+18,DARKGRAY);\ putpixel(x+8,y+19,DARKGRAY);\ putpixel(x+9,y+19,DARKGRAY);\ } #define MSMOVE 1; #define MSLButtonD 2; #define MSLButtonU 3; #define MSRButtonD 4; #define MSRButtonU 5; #define MSCloseWindow 15; int exitwindow=0; int capleft; int captop; char *caption="this is my first dosgui"; void *p_wd; char psize[80]; static int x,y,z; int Event[256]; int EventWP=0,EventRP=0; int mousebusy; int key; int test=0; int HitCaption=0; void far *mouserect; int timer180mscnt=0; int mousemovecnt=0; unsigned shape[]={ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000, 0x13c0, 0x3ff0, 0x7ff8, 0xfff8, 0xfff8, 0x0824, 0x0822, 0x1ce2, 0x0000, }; struct time t,t_old; struct mshandler { unsigned char mask; /* event mask */ unsigned segment, offset; /* address of event handler*/ }oldHandler; struct mouse { int a,a_old; int b,b_old; int sta,sta_old; }; struct button { int x,y,width,height; unsigned char state; unsigned char HitBt; }; struct Rect { int left,right,top,bottom; }; struct Point { int x,y; }; struct caption { struct Rect rt; struct Rect box1; struct Rect box2; unsigned char HitBt; char text[20]; }; struct submenu { struct Rect itemrt[5]; char itemtext[5][20]; /*每个5个选项*/ int itemnum; }; struct menu { struct Rect menurt[2]; struct submenu sm[2]; char menutext[2][10]; int menunum; unsigned char mouseover[2]; int state; }menu1; struct window { int left,top,width,height; struct Rect wrect; struct caption cap; struct menu mainmenu; int mouseonmmenu_i; }; #define EventExit() __emit__(0x5D, /* pop bp */ \ 0x5F, /* pop di */ \ 0x5E, /* pop si */ \ 0x1F, /* pop ds */ \ 0x07, /* pop es */ \ 0x5A, /* pop dx */ \ 0x59, /* pop cx */ \ 0x5B, /* pop bx */ \ 0x58, /* pop ax */ \ 0xCB); /* retf */ struct mouse ms={0}; struct button sysminbt={0}; struct button sysclosebt={0}; void mouseevhandler(); void interrupt far (*oldInterrupt_1C)(); void interrupt far (*oldInterruptms_1C)(); void interrupt far Timer(); void far mousehandler(); void ClearOldHandler(void); void mouse_show(void); void initmouse(); void getmouse(int *x,int *y,int *key); void constructmouse(); void initpara(); int Windowbdpixel[640*2+1024*2]; int MouseRelCapX,MouseRelCapY; void RestoreOldWindowbd(int xa,int xb,struct window wd); void SaveNewWindowbd(int xa,int xb,struct window wd); void PutNewWindowbd(int xa,int xb,struct window wd); unsigned char MouseInPaintCap(int x,int y,int cppleft,int cpptop); unsigned char MouseInMinButton(int x,int y,int cppleft,int cpptop); unsigned char MouseInCloseButton(int x,int y,int cppleft,int cpptop); void drawboder(struct window wd); void drawpurecap(struct caption cp,char *caption); void drawminbox(struct Rect btrt,unsigned char state); void drawclosebox(struct Rect btrt,unsigned char state); void drawcaption(struct caption cp); void drawpurebutton(struct Rect btrt,unsigned char state); void drawclient(int clileft,int clitop,int cliright,int clibottom); void drawmenu(struct menu mn); void drawwindow(struct window *wd); unsigned char MouseInRect(int x,int y,struct Rect rt); void GetCapRect(struct window *pwd); void GetCapBox1Rect(struct window *pwd); void GetCapBox2Rect(struct window *pwd); void GetMenuRect(struct window *pwd); void drawwindow(struct window *wd); void windowparainit(struct window *wd); void GetMainMenuItemRect(struct menu mn,int item,struct Rect *Menurt); void DrawMouseonMenu(struct menu mn,int i,unsigned char state); void DrawMouseDownMenu(struct menu mn,int i); /*main.c*/ #include "main.h" struct window dlgwindow; int main() { initgraph(); initpara(); dlgwindow.left=midx-150; dlgwindow.top=midy-200; dlgwindow.width=200; dlgwindow.height=200; drawwindow(&dlgwindow); initmouse(); while(!exitwindow) { switch (Event[EventRP]) { case 0: break; case 1:/*MSMOVE*/ { if (mousebusy==0) { } break; } case 2:/*MSLButtonD*/ { EventRP++; break; } case 3:/*MSLButtonU*/ { EventRP++; break; } case 4: { } if (EventRP==256) EventRP=0; } } constructmouse(); closegraph(); return 0; } void ClearOldHandler(void) { struct REGPACK regp={0}; regp.r_ax=0x14; intr(0x33,®p); oldHandler.mask = regp.r_cx; /* save the old event handler*/ oldHandler.offset = regp.r_dx; oldHandler.segment = regp.r_es; } void mouseevhandler() { } void far mousehandler() { int i,j,k,l; mousebusy=1; i=_AX; j=_BX; k=_CX; l=_DX; ms.a=k; ms.b=l; mousebusy=0; } void interrupt far Timer() { union REGS regs; char *mouseloc; gettime(&t); if ((t.ti_hour!=t_old.ti_hour)||(t.ti_min!=t_old.ti_min)||(t.ti_sec!=t_old.ti_sec)) { char tm[40]; setfillstyle(SOLID_FILL,BkColor); bar(300,350,450,380); sprintf(tm,"currtime is %2d:%02d:%02d.%02d",t.ti_hour, t.ti_min, t.ti_sec); tm[strlen(tm)-1]='\0'; setcolor(WHITE); moveto(250,350); outtext(tm); t_old.ti_hour=t.ti_hour; t_old.ti_min=t.ti_min; t_old.ti_sec=t.ti_sec; } getmouse(&ms.a,&ms.b,&ms.sta); { if(ms.a<0) ms.a=0; /*保证鼠标左边不出界*/ if(ms.b<0) ms.b=0; /*保证上面不出界*/ if(ms.a>getmaxx()-MouseWidth-1) ms.a=getmaxx()-MouseWidth-1; /*保证右边不出界*/ if(ms.b>getmaxy()-MouseHeight-1) ms.b=getmaxy()-MouseHeight-1; /*保证下边不出界*/ if (ms.a!=ms.a_old||ms.b!=ms.b_old){/*mouse move*/ /*当鼠标移动时*/ int i,j,b_bmin,b_bclose,b_onmenu; char *mouseloc; sprintf(mouseloc,"x:%d y:%d",ms.a,ms.b); setfillstyle(SOLID_FILL,BkColor); bar(10,350,120,380); moveto(10,350); outtext(mouseloc); j=dlgwindow.mainmenu.menunum; sprintf(mouseloc,"x:%d y:%d",ms.a,ms.b); setfillstyle(SOLID_FILL,BkColor); bar(10,350,120,380); moveto(10,350); setcolor(WHITE); outtext(mouseloc); putimage(ms.a_old,ms.b_old,mouserect,COPY_PUT); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/ b_bmin=MouseInRect(ms.a_old,ms.b_old,dlgwindow.cap.box1); b_bclose=MouseInRect(ms.a_old,ms.b_old,dlgwindow.cap.box2); if (HitCaption==0&&dlgwindow.mainmenu.state==0) { for (i=0;i<j;i++) { if (MouseInRect(ms.a_old,ms.b_old,dlgwindow.mainmenu.menurt[i])) { if (dlgwindow.mainmenu.mouseover[i]==0) { DrawMouseonMenu(dlgwindow.mainmenu,i,1); dlgwindow.mainmenu.mouseover[i]=1; } dlgwindow.mouseonmmenu_i=i+1; } else if (dlgwindow.mainmenu.mouseover[i]==1) { DrawMouseonMenu(dlgwindow.mainmenu,i,0); dlgwindow.mainmenu.mouseover[i]=0; dlgwindow.mouseonmmenu_i=0; } } } if (sysminbt.HitBt==1) { drawminbox(dlgwindow.cap.box1,b_bmin); } if (sysclosebt.HitBt==1) { drawclosebox(dlgwindow.cap.box2,b_bclose); } if (HitCaption==1) { RestoreOldWindowbd(ms.a_old,ms.b_old,dlgwindow); SaveNewWindowbd(ms.a,ms.b,dlgwindow); PutNewWindowbd(ms.a,ms.b,dlgwindow); } getimage(ms.a,ms.b,ms.a+MouseWidth,ms.b+MouseHeight,mouserect); /*这条语句是将目前鼠标所在位置的图形存贮到mouserect里面试着看着有无这条语句的区别*/ draw_mouse(ms.a,ms.b); ms.a_old=ms.a;ms.b_old=ms.b; } if (ms.sta!=ms.sta_old) { switch (ms.sta_old) { case 0: { switch (ms.sta) { case 1:/*leftmousedown*/ { struct Rect rt;int i; Event[EventWP++]=MSLButtonD; rt=dlgwindow.cap.rt; rt.right=rt.right-sysbutton_width*2-4; if (MouseInRect(ms.a,ms.b,dlgwindow.cap.box1)==1) { drawminbox(dlgwindow.cap.box1,1); sysminbt.HitBt=1; } else if (MouseInRect(ms.a,ms.b,dlgwindow.cap.box2)==1) { drawclosebox(dlgwindow.cap.box2,1); sysclosebt.HitBt=1; } if (MouseInRect(ms.a,ms.b,rt)==1) { /*drawwindow(&dlgwindow);*/ HitCaption=1; MouseRelCapX=ms.a-dlgwindow.left; MouseRelCapY=ms.b-dlgwindow.top; putimage(ms.a_old,ms.b_old,mouserect,COPY_PUT); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/ p_wd=malloc(imagesize(dlgwindow.left, dlgwindow.top, dlgwindow.left+dlgwindow.width, dlgwindow.top+ dlgwindow.height)); getimage(dlgwindow.left, dlgwindow.top, dlgwindow.left+dlgwindow.width, dlgwindow.top+ dlgwindow.height,p_wd); SaveNewWindowbd(ms.a,ms.b,dlgwindow); } if (dlgwindow.mouseonmmenu_i!=0) { putimage(ms.a_old,ms.b_old,mouserect,COPY_PUT); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/ DrawMouseDownMenu(dlgwindow.mainmenu,dlgwindow.mouseonmmenu_i-1); getimage(ms.a,ms.b,ms.a+MouseWidth,ms.b+MouseHeight,mouserect); /*这条语句是将目前鼠标所在位置的图形存贮到mouserect里面试着看着有无这条语句的区别*/ dlgwindow.mainmenu.state=1;/*mouse down*/ } else draw_mouse(ms.a,ms.b); break;} case 2: {Event[EventWP++]=MSRButtonD;break;} } } case 1:/*leftmouseup*/ { if (ms.sta==0) {Event[EventWP++]=MSLButtonU; putimage(ms.a_old,ms.b_old,mouserect,COPY_PUT); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/ if (MouseInRect(ms.a,ms.b,dlgwindow.cap.box1)==1) { if (sysminbt.HitBt==1) drawminbox(dlgwindow.cap.box1,0); } else if (MouseInRect(ms.a,ms.b,dlgwindow.cap.box2)==1) { if (sysclosebt.HitBt==1) { drawclosebox(dlgwindow.cap.box2,0); exitwindow=1; } } if (HitCaption==1) { HitCaption=0; /*putimage(ms.a_old,ms.b_old,mouserect,COPY_PUT); */ /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/ /*putimage(dlgwindow.left, dlgwindow.top,p_wd,COPY_PUT);*/ setfillstyle(SOLID_FILL,BkColor); bar(dlgwindow.left, dlgwindow.top, dlgwindow.left+dlgwindow.width,dlgwindow.top+dlgwindow.height); dlgwindow.left=ms.a-MouseRelCapX; dlgwindow.top=ms.b-MouseRelCapY; /*drawwindow(&dlgwindow);*/ GetCapRect(&dlgwindow); GetCapBox1Rect(&dlgwindow); GetCapBox2Rect(&dlgwindow); GetMenuRect(&dlgwindow); putimage(ms.a-MouseRelCapX,ms.b-MouseRelCapY,p_wd,COPY_PUT); free(p_wd); } getimage(ms.a,ms.b,ms.a+MouseWidth,ms.b+MouseHeight,mouserect); /*第一次将图形(一个空矩形)存入到内存中,内存中存入的是一个空矩形*/ draw_mouse(ms.a,ms.b); sysminbt.HitBt=0; sysclosebt.HitBt=0; } break; } case 2: { if (ms.sta==0) Event[EventWP++]=MSRButtonU; break; } } ms.sta_old=ms.sta; if (EventWP==255) EventWP=0; Event[EventWP+1]=0; } } (*oldInterrupt_1C)(); } void mouse_show(void) { struct REGPACK regp={0},regp1={0}; union REGS inreg, outreg; struct SREGS s; regp.r_ax=0x00; intr(0x33,®p); /* inreg.x.ax = 0x9; inreg.x.bx = 0; inreg.x.cx = 11; inreg.x.dx = (unsigned)shape; segread(&s); s.es = s.ds; int86x(0x33,&inreg,&outreg,&s); */ regp.r_ax=01; intr(0x33,®p); /* regp.r_es = FP_SEG(mousehandler);; regp.r_dx = FP_OFF(mousehandler);; regp.r_cx = 0x1; regp.r_ax = 0x14; intr(0x33,®p); /* regp.r_ax=0x1c; regp.r_bx=4; intr(0x33,®p); regp.r_ax=0x7; regp.r_cx=1; regp.r_dx=640; intr(0x33,®p); regp.r_ax=0x8; regp.r_cx=1; regp.r_dx=480; intr(0x33,®p); regp.r_ax=0x1d; regp.r_bx=0; intr(0x33,®p);*/ } void initmouse() { ClearOldHandler(); oldInterrupt_1C = getvect(0x1C); setvect(0x1C, Timer); mouse_show(); mouserect=farmalloc(imagesize(ms.a,ms.b,ms.a+MouseWidth,ms.b+MouseHeight)); /*返回矩形的大小*/ getimage(ms.a,ms.b,ms.a+MouseWidth,ms.b+MouseHeight,mouserect); /*第一次将图形(一个空矩形)存入到内存中,内存中存入的是一个空矩形*/ } void getmouse(int *x,int *y,int *key) { union REGS inregs,outregs; int keysta; inregs.x.ax=3; /*获取鼠标位置和状态也可以用3*/ int86(0x33,&inregs,&outregs); /*中断调用*/ *x=outregs.x.cx; /*cx寄存器中存的是横坐标*/ *y=outregs.x.dx; /*dx寄存器中存的是列坐标*/ *key=outregs.x.bx; /*bx寄存器是按键状态*/ } void constructmouse() { farfree(mouserect); if(oldHandler.mask) /* restore old event handler*/ { struct SREGS sregs={0}; union REGS regs={0}; regs.x.ax=0x14; regs.x.dx=oldHandler.offset; regs.x.cx=0xFF; sregs.es=oldHandler.segment; int86x(0x33,®s,®s,&sregs); } setvect(0x1C, Timer); } void initpara() { int i; for (i=0;i<256;i++) { Event[i]=0; } } void RestoreOldWindowbd(int xa,int xb,struct window wd) { int i=0,j=0; int newwdleft=xa-MouseRelCapX; int newwdtop=xb-MouseRelCapY; for(i=0;i<wd.width;i++) putpixel(newwdleft+i,newwdtop,Windowbdpixel[j++]); for(i=0;i<wd.height;i++) putpixel(newwdleft+wd.width,newwdtop+i,Windowbdpixel[j++]); for(i=0;i<wd.width;i++) putpixel(newwdleft+wd.width-i,newwdtop+wd.height,Windowbdpixel[j++]); for(i=0;i<wd.height;i++) putpixel(newwdleft,newwdtop+wd.height-i,Windowbdpixel[j++]); } void SaveNewWindowbd(int xa,int xb,struct window wd) { int i,j=0; int newwdleft=xa-MouseRelCapX; int newwdtop=xb-MouseRelCapY; for(i=0;i<wd.width;i++) Windowbdpixel[j++]=getpixel(newwdleft+i,newwdtop); for(i=0;i<wd.height;i++) Windowbdpixel[j++]=getpixel(newwdleft+wd.width,newwdtop+i); for(i=0;i<wd.width;i++) Windowbdpixel[j++]=getpixel(newwdleft+wd.width-i,newwdtop+wd.height); for(i=0;i<wd.height;i++) Windowbdpixel[j++]=getpixel(newwdleft,newwdtop+wd.height-i); } void PutNewWindowbd(int xa,int xb,struct window wd) { int i; int newwdleft=xa-MouseRelCapX; int newwdtop=xb-MouseRelCapY; setcolor(DARKGRAY); /* for(i=0;i<wd.width;i++) putpixel(newwdleft+i,newwdtop,DARKGRAY); for(i=0;i<wd.height;i++) putpixel(newwdleft+wd.width,newwdtop+i,DARKGRAY); for(i=0;i<wd.width;i++) putpixel(newwdleft+wd.width-i,newwdtop+wd.height,DARKGRAY); for(i=0;i<wd.height;i++) putpixel(newwdleft,newwdtop+wd.height-i,DARKGRAY); */ rectangle(newwdleft,newwdtop,newwdleft+wd.width,newwdtop+wd.height); } unsigned char MouseInRect(int x,int y,struct Rect rt) { if (x>rt.left &&x<rt.right &&y>rt.top &&y<rt.bottom) return 1; else return 0; } void GetCapRect(struct window *pwd) { pwd->cap.rt.left=pwd->left+syswindowleftboder; pwd->cap.rt.right=pwd->left+pwd->width-syswindowrightboder; pwd->cap.rt.top=pwd->top+syswindowtopboder; pwd->cap.rt.bottom=pwd->top+syswindowtopboder+CapHeight; } void GetCapBox1Rect(struct window *pwd) { pwd->cap.box1.left=pwd->cap.rt.right-sysmargin-sysbutton_width*2-sysbutton_Interval; pwd->cap.box1.right=pwd->cap.rt.right-sysmargin-sysbutton_width-sysbutton_Interval; pwd->cap.box1.top=pwd->cap.rt.top+sysmargin; pwd->cap.box1.bottom=pwd->cap.rt.top+sysmargin+sysbutton_height; } void GetCapBox2Rect(struct window *pwd) { pwd->cap.box2.left=pwd->cap.rt.right-sysmargin-sysbutton_width; pwd->cap.box2.right=pwd->cap.rt.right-sysmargin; pwd->cap.box2.top=pwd->cap.rt.top+sysmargin; pwd->cap.box2.bottom=pwd->cap.rt.top+sysmargin+sysbutton_height; } void GetMenuRect(struct window *pwd) { int i,j,m,k,left; j=sizeof(pwd->mainmenu.sm)/sizeof(pwd->mainmenu.sm[0]); pwd->mainmenu.menunum=j; pwd->mainmenu.menurt[0].left=pwd->cap.rt.left; for (i=0;i<j-1;i++) { pwd->mainmenu.menurt[i].right=pwd->mainmenu.menurt[i].left+strlen(pwd->mainmenu.menutext[i])*8+8; pwd->mainmenu.menurt[i+1].left=pwd->mainmenu.menurt[i].right+1; m=sizeof(pwd->mainmenu.sm[i].itemrt)/sizeof(pwd->mainmenu.sm[i].itemrt[0]); for (k=0;k<m;k++) { int a,b;char *s; a=pwd->mainmenu.sm[i].itemrt[k].left=pwd->mainmenu.menurt[i].left+3; b=pwd->mainmenu.sm[i].itemrt[k].right=pwd->mainmenu.menurt[i].right+3+50; } } pwd->mainmenu.menurt[i].right=pwd->mainmenu.menurt[i].left+strlen(pwd->mainmenu.menutext[i])*8+8; for (i=0;i<j;i++) { pwd->mainmenu.menurt[i].top=pwd->cap.rt.bottom+2; pwd->mainmenu.menurt[i].bottom=pwd->cap.rt.bottom+2+SysMainMenuHeight; m=sizeof(pwd->mainmenu.sm[i].itemrt)/sizeof(pwd->mainmenu.sm[i].itemrt[0]); for (k=0;k<m;k++) { pwd->mainmenu.sm[i].itemrt[k].top=pwd->mainmenu.menurt[i].bottom+3+k*SysMainMenuHeight; pwd->mainmenu.sm[i].itemrt[k].bottom=pwd->mainmenu.menurt[i].right+3+(k+1)*SysMainMenuHeight; } } } void drawboder(struct window wd) { setcolor(LIGHTGRAY); line(wd.left,wd.top+wd.height,wd.left,wd.top); line(wd.left+1,wd.top,wd.left+wd.width,wd.top); setcolor(DARKGRAY); line(wd.left+wd.width,wd.top+1,wd.left+wd.width,wd.top+wd.height); setcolor(WHITE); line(wd.left+1,wd.top+wd.height,wd.left+1,wd.top+1); line(wd.left+2,wd.top+1,wd.left+wd.width-1,wd.top+1); setcolor(LIGHTGRAY); rectangle(wd.left+2,wd.top+2,wd.left+wd.width-1,wd.top+wd.height); rectangle(wd.left+3,wd.top+3,wd.left+wd.width-2,wd.top+wd.height-1); setcolor(DARKGRAY); line(wd.left+1,wd.top+wd.height,wd.left+wd.width-1,wd.top+wd.height); } void drawpurecap(struct caption cp,char *caption) { setfillstyle(SOLID_FILL,BLUE); bar(cp.rt.left, cp.rt.top, cp.rt.right,cp.rt.bottom); setcolor(WHITE); moveto(cp.rt.left+sysmargin*2,cp.rt.top+sysmargin*2); outtext(caption); } void drawminbox(struct Rect btrt,unsigned char state) { int px=0,py=0; sysminbt.state=state; drawpurebutton(btrt,state); if (state==1) {px=1;py=1;} setfillstyle(SOLID_FILL,DARKGRAY); bar(px+sysbutton_MIN_LM+btrt.left, py-sysbutton_MIN_BM+btrt.bottom, px-sysbutton_MIN_RM+btrt.right, py-sysbutton_MIN_BM+btrt.bottom); } void drawclosebox(struct Rect btrt,unsigned char state) { int px=0,py=0; sysclosebt.state=state; drawpurebutton(btrt,state); if (state==1) {px=1;py=1;} setcolor(DARKGRAY); line(px+sysbutton_CLOSE_LM+btrt.left, py+sysbutton_CLOSE_TM+btrt.top, px-sysbutton_CLOSE_RM+btrt.right, py-sysbutton_CLOSE_TM+btrt.bottom); line(px-sysbutton_CLOSE_RM+btrt.right, py+sysbutton_CLOSE_TM+btrt.top, px+sysbutton_CLOSE_LM+btrt.left, py-sysbutton_CLOSE_TM+btrt.bottom); } void drawpurebutton(struct Rect btrt,unsigned char state) { if (state==0) setcolor(WHITE); else setcolor(DARKGRAY); line(btrt.left,btrt.bottom,btrt.left,btrt.top); line(btrt.left,btrt.top,btrt.right,btrt.top); if (state==1) setcolor(WHITE); else setcolor(DARKGRAY); line(btrt.right,btrt.top+1,btrt.right,btrt.bottom); line(btrt.right,btrt.bottom,btrt.left,btrt.bottom); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(btrt.left+1,btrt.top+1,btrt.right-1,btrt.bottom-1); } void drawcaption(struct caption cp) { drawpurecap(cp,cp.text); drawminbox(cp.box1,0); drawclosebox(cp.box2,0); } void drawclient(int clileft,int clitop,int cliright,int clibottom) { } void drawmenu(struct menu mn) { int i,item=2; struct Rect txtrt; char *s; txtrt.top=mn.menurt[0].top+SysMainMenuHeight/2-3; for (i=0;i<item;i++) { txtrt.left=mn.menurt[i].left+4; moveto(txtrt.left,txtrt.top); outtext(mn.menutext[i]); } } void drawwindow(struct window *pwd) { struct window wd; windowparainit(pwd); GetCapRect(pwd); GetCapBox1Rect(pwd); GetCapBox2Rect(pwd); GetMenuRect(pwd); wd=*pwd; setfillstyle(SOLID_FILL,LIGHTGRAY); bar(wd.left,wd.top,wd.left+wd.width,wd.top+wd.height); drawboder(wd); drawcaption(wd.cap); drawmenu(wd.mainmenu); } void windowparainit(struct window *wd) { int i,j; strcpy(wd->mainmenu.menutext[0],"File"); strcpy(wd->mainmenu.sm[0].itemtext[0],"Open"); strcpy(wd->mainmenu.sm[0].itemtext[1],"Exittttttt"); strcpy(wd->mainmenu.menutext[1],"Search"); wd->mainmenu.menutext[1][9]='\0'; strcpy(wd->mainmenu.sm[1].itemtext[0],"Find"); strcpy(wd->mainmenu.sm[1].itemtext[1],"FindNext"); strcpy(wd->cap.text,"my first dosgui"); wd->cap.HitBt=0; } void DrawMouseonMenu(struct menu mn,int i,unsigned char state) { if (state==1) setcolor(WHITE); else setcolor(LIGHTGRAY); line(mn.menurt[i].left,mn.menurt[i].bottom-1,mn.menurt[i].left,mn.menurt[i].top); line(mn.menurt[i].left,mn.menurt[i].top,mn.menurt[i].right-1,mn.menurt[i].top); if (state==1) setcolor(DARKGRAY); else setcolor(LIGHTGRAY); line(mn.menurt[i].right,mn.menurt[i].top,mn.menurt[i].right,mn.menurt[i].bottom); line(mn.menurt[i].right,mn.menurt[i].bottom,mn.menurt[i].left,mn.menurt[i].bottom); } void DrawMouseDownMenu(struct menu mn,int i) { struct Rect txtrt; int k,j; char *s; j=sizeof(mn.sm[i].itemrt)/sizeof(mn.sm[i].itemrt[0]); setcolor(DARKGRAY); line(mn.menurt[i].left,mn.menurt[i].bottom-1,mn.menurt[i].left,mn.menurt[i].top); line(mn.menurt[i].left,mn.menurt[i].top,mn.menurt[i].right-1,mn.menurt[i].top); setcolor(WHITE); line(mn.menurt[i].right,mn.menurt[i].top,mn.menurt[i].right,mn.menurt[i].bottom); line(mn.menurt[i].right,mn.menurt[i].bottom,mn.menurt[i].left,mn.menurt[i].bottom); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(mn.menurt[i].left+1,mn.menurt[i].top+1,mn.menurt[i].right-1,mn.menurt[i].bottom-1); txtrt.left=mn.menurt[i].left+4; txtrt.top=mn.menurt[0].top+SysMainMenuHeight/2-3; moveto(txtrt.left+1,txtrt.top+1); setcolor(DARKGRAY); outtext(mn.menutext[i]); setcolor(WHITE); line(mn.menurt[i].left+1,mn.menurt[i].bottom+2+50,mn.menurt[i].left+1,mn.menurt[i].bottom+2); line(mn.menurt[i].left+1,mn.menurt[i].bottom+2,mn.menurt[i].right+1+50,mn.menurt[i].bottom+2); setcolor(DARKGRAY); line(mn.menurt[i].right+1+50,mn.menurt[i].bottom+2,mn.menurt[i].right+1+50,mn.menurt[i].bottom+2+50); line(mn.menurt[i].right+1+50,mn.menurt[i].bottom+2+50,mn.menurt[i].left+1,mn.menurt[i].bottom+2+50); setfillstyle(SOLID_FILL,LIGHTGRAY); bar(mn.menurt[i].left+2,mn.menurt[i].bottom+3,mn.menurt[i].right+1+49,mn.menurt[i].bottom+2+49); setcolor(DARKGRAY); for (k=0;k<2;k++) { moveto(mn.sm[i].itemrt[k].left+2,mn.sm[i].itemrt[k].top+2); outtext(mn.sm[i].itemtext[k]); } } |
|
| 第6楼 yueluck | 发表于 2007-06-18 14:08 |
| 初级用户 发帖 14 积分 32 | |
|
非常感谢 你的程序很好.谢谢你.good luck
|
|
| 第7楼 yueluck | 发表于 2007-06-18 14:08 |
| 初级用户 发帖 14 积分 32 | |
|
非常感谢 你的程序很好.谢谢你.good luck
|
|
| 第8楼 qq43142691 | 发表于 2007-09-25 19:19 |
| 中级用户 发帖 152 积分 326 | |
|
超人~~~~~~编程。。。。。。
|
|
| 第9楼 fqljwdyq | 发表于 2007-10-11 19:15 |
| 新手上路 发帖 7 积分 14 来自 江苏 | |
|
你可以到这个网址,去下载NEO开发包,里面有鼠标的全程源程序,你可以参考一下,这个开发包很好
|
|
| 第10楼 fqljwdyq | 发表于 2007-10-11 19:16 |
| 新手上路 发帖 7 积分 14 来自 江苏 | |
|
刚才没把网址写上http://free.ys168.com?dongkai
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |