运行跳过显示

0
int Start()
{
	TCHAR s[] = _T("是否生成数字波?"), s1[] = _T("> 是"), s2[] = _T("> 否");
	int choice = 0, i = 0;
	initgraph(800, 700);
	setbkcolor(BLACK);
	settextcolor(WHITE);
	settextstyle(70, 50, _T("Consolas"));
	outtextxy(25, 200, s);
	settextstyle(40, 20, _T("Consolas"));
	outtextxy(300, 400, s1);
	outtextxy(300, 500, s2);
	while (1)
	{
		MOUSEMSG M = GetMouseMsg();

		if (M.x >= 300 && M.x <= 380 && M.y >= 400 && M.y <= 440)
		{
			i = 1;
			settextcolor(RED);
			outtextxy(300, 400, s1);
			if (M.mkLButton)
			{
				choice = 1;
				break;
			}
		}
		else if (M.x >= 300 && M.x <= 380 && M.y >= 500 && M.y <= 540)
		{
			i = 1;
			settextcolor(RED);
			outtextxy(300, 500, s2);
			if (M.mkLButton)
			{
				choice = 0;
				break;
			}
		}
		else if (i)
		{
			settextcolor(WHITE);
			outtextxy(300, 400, s1);
			outtextxy(300, 500, s2);
		}
	}
	return choice;
}
int main()
{
	while (Start() == 1)
	{
		Handle();
	}
	closegraph();
	return 0;
}

主函数里的while循环,第一次运行到这儿的时候会显示Start子函数创造的界面,获取鼠标点击,但是第二次运行到这儿的时候就不会显示Start子函数代表的界面,直接显示Handle子函数创造的界面了,但是在while和Handle语句分别设置断点调试的时候,就没问题

ava
用户8dc7

2020-4-24

0

你的代码并不能直接编译,我只能根据肉眼观察找你的问题。建议下次发代码的时候发一个可以编译的并且能体现你的问题的最简代码。

目测你的问题是鼠标消息缓存的问题。

鼠标消息有很多,比如,鼠标移动的时候,每个移动的点、鼠标按下、弹起等等,都会有消息。鼠标消息会缓存在系统中,当你 GetMouseMsg() 的时候,会从缓冲区中拿出一个消息。所以,第二次运行的时候,你获取到的鼠标消息,是之前没有来得及处理的鼠标消息。

解决办法有多种。针对你的代码,至少有这两种做法:

  1. 处理缓冲区里的所有鼠标消息,如果消息自己不需要(例如是鼠标移动的消息)就重新获取下一个消息,直到遇到自己需要的鼠标消息。
  2. 执行函数 FlushMouseMsgBuffer() 清空鼠标消息。
ava
慢羊羊

2020-4-24

1

接村长,你的代码逻辑还是存在很大的漏洞,比如多次调用initgraph()而不调用closegraph()导致内存泄漏

这里建议只进行一次initgraph(),以后用cleardevice()

第二,处理UI的消息及绘制操作逻辑混乱,正确的做法应该是这样:

while(1){
	Draw();//绘制
	Update();//更新,处理鼠标事件等
	if(Exit())break;//检测退出事件
	Sleep(5);//释放CPU
}

而Update又可细分为:

void Update(){
	for(auto i:DrawCells)//遍历每一个可能在运动的元素
		i.Update();
	if(MouseHit()){//有鼠标事件才执行
		MOUSEMSG m=GetMouseMsg();
		//balabala
	}
	if(_kbhit()){//键盘事件,同理
		char c=_getch();
		//balabala
	}
	//当然,你愿意的话,可以把鼠标事件及键盘事件扔进DrawCells的Update函数中分别执行
}

而不是无限制地获取鼠标事件阻塞进程,以后你处理带动画的UI会遇见这样的问题的

虽然这种小代码用什么方式都无伤大雅,但结构化的语言可以让你更好的排除并查找问题

ava
无名氏

2020-4-24

技术讨论社区
相关提问