请c语言高手相助,在TC30下,关于图形和鼠标驱动的程序。

hanyh 2001-10-17 11:19:07
我的程序的本意是用鼠标在屏幕上点击,点左键3次,然后就画一个三角形,点右
键便退出。点左键50次的时候,点任意键也退出。可是程序运行的时候有问题,
画三角形的时候总怪怪的,请高手帮我一下!

******graph.h******//图形初始化,结束头文件

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>

void InitGraphics();
void CloseGraphics();




void InitGraphics()
{
int gdriver = VGA, gmode=VGAHI, errorcode;

if (!(registerbgidriver(EGAVGA_driver)<0))
{
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode == grOk)
return;
}
cout << "Error detected when initialize graphics...\n";
cout << "No VGA compatible graphics card is found...\n";
getch();
exit(1);
}

void CloseGraphics() {
getch();
cleardevice();
closegraph();
}



******mouse.h******//鼠标驱动头文件

#include <dos.h>

enum MouseDisplayMode {
MOUSE_OFF, MOUSE_ON,
};

int x, y;
int mDispStatus, mNumKeys, mKey;
int mKeyPressed, mInstalled;
union REGS inregs, outregs;

int GetX() { return x; }
int GetY() { return y; }
void GetXY(int& px, int& py) { px = x; py = y; }

void Reset(void);
void ShowCursor(void);
void HideCursor(void);
void GetButtonStatus(void);
void SetMinMaxHorzCursPos(int min,int max);
void SetMinMaxVertCursPos(int min,int max);
int LeftButtonPressed(void);
int RightButtonPressed(void);

void Reset(void)
{
inregs.x.ax = 0x00;
int86(0x33, &inregs, &outregs);
mInstalled = (outregs.x.ax > 0);

if(mInstalled)
mNumKeys = outregs.x.bx;
else
mNumKeys = 0;

mDispStatus = MOUSE_OFF;
}

void ShowCursor(void)
{
if(mDispStatus == MOUSE_OFF) {
inregs.x.ax = 0x01;
int86(0x33, &inregs, &outregs);
mDispStatus = MOUSE_ON;
}
}

void HideCursor(void)
{
if (mDispStatus) {
inregs.x.ax = 0x02;
int86(0x33, &inregs, &outregs);
mDispStatus = MOUSE_OFF;
}
}

void GetButtonStatus()
{
inregs.x.ax = 0x03;
int86(0x33, &inregs, &outregs);
mKey = outregs.x.bx;
x = outregs.x.cx;
y = outregs.x.dx;
}

int LeftButtonPressed(void)
{
delay(50);
GetButtonStatus();
mKeyPressed = (mKey == 1);
return mKeyPressed;
}

int RightButtonPressed(void)
{
delay(50);
GetButtonStatus();
mKeyPressed = (mKey == 2);
return mKeyPressed;
}


void SetMinMaxHorzCursPos(int min, int max)
{
inregs.x.ax = 0x07;
inregs.x.cx = min;
inregs.x.dx = max;
int86(0x33, &inregs, &outregs);
}

void SetMinMaxVertCursPos(int min, int max)
{
inregs.x.ax = 0x08;
inregs.x.cx = min;
inregs.x.dx = max;
int86(0x33, &inregs, &outregs);
}


******main.cpp******

#include"graph.h"
#include"mouse.h"

main()
{
int a,b,i,gx[50],gy[50],flag;
InitGraphics();
Reset();
SetMinMaxHorzCursPos(0,639);
SetMinMaxVertCursPos(0,479);
ShowCursor();
for(a=1;a<50;a++)
{
flag=1;
while(flag)
{
if(LeftButtonPressed()) //点左键
{
GetXY(gx[a],gy[a]);
flag=0;
}
if(RightButtonPressed()) //点右键退出
{
sound(2000);
delay(500);
nosound();
closegraph();
exit(0);
}
}
if(a%3==0) //如果点左键是3的倍数,就连接最近3个点成一

//三角形
{
HideCursor();
for(b=a,i=1;i<3;i++,b--)
line(gx[b],gy[b],gx[b-1],gy[b-1]);
line(gx[b],gy[b],gx[b+2],gy[b+2]);
ShowCursor();
}
}
sound(2000);
delay(500);
nosound();
CloseGraphics();
return 0;
}
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyh 2001-10-19
  • 打赏
  • 举报
回复
谢谢两位,你们的方法跟我的差不多,我最后终于找到了错误的根源,问题现已经解决。
lormee 2001-10-18
  • 打赏
  • 举报
回复
画三角形的语句有问题。不要使用循环来做,直接来三个画线语句:
line(gx[b],gy[b],gx[b-1],gy[b-1]);
line(gx[b-1],gy[b-1],gx[b-2],gy[b-2]);
line(gx[b],gy[b],gx[b+2],gy[b+2]);
我想这样子应该就不会怪怪的了。

livelivelive 2001-10-18
  • 打赏
  • 举报
回复
现在可以了,改动较大,for(a=1;a<50,a++) 中的a++有问题,已改为while结构,line语句也改了下,整个程序在一个文件中即可,不必分多个文件。注意,将EGAVGA.BGI分别放到输出exe的和tc所在的目录中,否则画线时会产生initgraph错误!
/******graph.h******///图形初始化,结束头文件

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>

void InitGraphics();
void CloseGraphics();

void InitGraphics()
{
int gdriver = VGA, gmode=VGAHI, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode == grOk)
return;
}

void CloseGraphics() {
getch();
cleardevice();
closegraph();
}



/*******mouse.h******///鼠标驱动头文件

#include <dos.h>

enum MouseDisplayMode {
MOUSE_OFF, MOUSE_ON,
};

int x, y;
int mDispStatus, mNumKeys, mKey;
int mKeyPressed, mInstalled;
union REGS inregs, outregs;

int GetX() { return x; }
int GetY() { return y; }
void GetXY(int& px, int& py) { px = x; py = y; }

void Reset(void);
void ShowCursor(void);
void HideCursor(void);
void GetButtonStatus(void);
void SetMinMaxHorzCursPos(int min,int max);
void SetMinMaxVertCursPos(int min,int max);
int LeftButtonPressed(void);
int RightButtonPressed(void);

void Reset(void)
{
inregs.x.ax = 0x00;
int86(0x33, &inregs, &outregs);
mInstalled = (outregs.x.ax > 0);

if(mInstalled)
mNumKeys = outregs.x.bx;
else
mNumKeys = 0;

mDispStatus = MOUSE_OFF;
}

void ShowCursor(void)
{
if(mDispStatus == MOUSE_OFF) {
inregs.x.ax = 0x01;
int86(0x33, &inregs, &outregs);
mDispStatus = MOUSE_ON;
}
}

void HideCursor(void)
{
if (mDispStatus) {
inregs.x.ax = 0x02;
int86(0x33, &inregs, &outregs);
mDispStatus = MOUSE_OFF;
}
}

void GetButtonStatus()
{
inregs.x.ax = 0x03;
int86(0x33, &inregs, &outregs);
mKey = outregs.x.bx;
x = outregs.x.cx;
y = outregs.x.dx;
}

int LeftButtonPressed(void)
{
delay(50);
GetButtonStatus();
mKeyPressed = (mKey == 1);
return mKeyPressed;
}

int RightButtonPressed(void)
{
delay(50);
GetButtonStatus();
mKeyPressed = (mKey == 2);
return mKeyPressed;
}


void SetMinMaxHorzCursPos(int min, int max)
{
inregs.x.ax = 0x07;
inregs.x.cx = min;
inregs.x.dx = max;
int86(0x33, &inregs, &outregs);
}

void SetMinMaxVertCursPos(int min, int max)
{
inregs.x.ax = 0x08;
inregs.x.cx = min;
inregs.x.dx = max;
int86(0x33, &inregs, &outregs);
}


/******main.cpp******/

//#include"graph.h"
//#include"mouse.h"

main()
{
int a,b,i,gx[50],gy[50],flag;
InitGraphics();
Reset();
SetMinMaxHorzCursPos(0,639);
SetMinMaxVertCursPos(0,479);
ShowCursor();
// for(a=1;a<50;a++)
a=0;
while(a<50)
{
flag=1;
while(flag){
if(LeftButtonPressed()) //点左键
{
GetXY(gx[a],gy[a]);
flag=0;
a++;
}
if(RightButtonPressed()) //点右键退出
{
sound(2000);
delay(500);
nosound();
closegraph();
exit(0);
}
}//while(flag)

if(a%3==0&&a!=0) //注意a!=0
{
HideCursor();
line(gx[a-3],gy[a-3],gx[a-2],gy[a-2]);
line(gx[a-3],gy[a-3],gx[a-1],gy[a-1]);
line(gx[a-2],gy[a-2],gx[a-1],gy[a-1]);
ShowCursor();
}//if(a%3==0)

sound(2000);
delay(100);
nosound();
};//while(a<=50)
getch();
CloseGraphics();
return 0;
}
livelivelive 2001-10-18
  • 打赏
  • 举报
回复
我正在看源程序
hanyh 2001-10-18
  • 打赏
  • 举报
回复
我试过了,不是这个地方错了,我想可能我在确定鼠标点饥的时候还应该写一个接收函数,正在测试!

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧