|
yueluck
初级用户
 
积分 32
发帖 14
注册 2007-6-14
状态 离线
|
『楼 主』:
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);
}
|
|
2007-6-14 16:45 |
|
|
nilauh
新手上路

积分 6
发帖 2
注册 2007-5-14
状态 离线
|
『第
2 楼』:
你应该这么做
判断鼠标位置有改变后
1:在鼠标现在的位置输出保存的图形
2:把鼠标要移动的下一个位置一定范围内的图形保存下来
3:在新位置画鼠标
4:新坐标代替旧坐标
ps:程序初始化就要鼠标现在的位置的图形再画鼠标
|
|
2007-6-14 21:16 |
|
|
firstsail
高级用户
   
积分 668
发帖 295
注册 2005-7-26 来自 广东深圳
状态 离线
|
『第
3 楼』:
将鼠标关闭显示后,才能调用画图函数,画完后,再来恢复鼠标的显示。
|
|
2007-6-14 21:32 |
|
|
yueluck
初级用户
 
积分 32
发帖 14
注册 2007-6-14
状态 离线
|
『第
4 楼』:
能写给我吗?
我的鼠标是个圆形.我用imagesize,getimage,putimage 但是没效果,而且鼠标只是在左上角很小的范围内活动.
谢谢回复.
|
|
2007-6-15 09:38 |
|
|
nilauh
新手上路

积分 6
发帖 2
注册 2007-5-14
状态 离线
|
『第
5 楼』:
呵呵 你参考一下我的程序有点大
/*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]);
}
}
|
|
2007-6-15 18:37 |
|
|
yueluck
初级用户
 
积分 32
发帖 14
注册 2007-6-14
状态 离线
|
『第
6 楼』:
非常感谢
你的程序很好.谢谢你.good luck
|
|
2007-6-18 14:08 |
|
|
yueluck
初级用户
 
积分 32
发帖 14
注册 2007-6-14
状态 离线
|
『第
7 楼』:
非常感谢
你的程序很好.谢谢你.good luck
|
|
2007-6-18 14:08 |
|
|
qq43142691
中级用户
  
积分 327
发帖 152
注册 2007-5-4
状态 离线
|
『第
8 楼』:
超人~~~~~~编程。。。。。。
|
|
2007-9-25 19:19 |
|
|
fqljwdyq
新手上路

积分 14
发帖 7
注册 2006-2-18 来自 江苏
状态 离线
|
『第
9 楼』:
你可以到这个网址,去下载NEO开发包,里面有鼠标的全程源程序,你可以参考一下,这个开发包很好
|
|
2007-10-11 19:15 |
|
|
fqljwdyq
新手上路

积分 14
发帖 7
注册 2006-2-18 来自 江苏
状态 离线
|
|
2007-10-11 19:16 |
|
|