- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想制作一种销售点 (POS) 程序。因此,当您打开程序时,会打开一个菜单(主菜单),这是一个滚动菜单(您可以上下移动以使用箭头键选择菜单中的项目),其中的项目就像“开始工作日”、“统计”、“库存”等等等等。
现在,当您按下“开始工作日”(使用回车键)时,您会看到另一个菜单,其中会要求诸如“接受订单”......“返回主菜单”之类的内容。这就是我发现问题的地方。当我按下“返回主菜单”时,我无法返回主菜单。
我的尝试
#include<iostream>
#include<conio.h>
#include<string>
#include<windows.h>
using namespace std;
int chk=0;
int sbd(void) //the order menu (start business day -> ' press ENTER')
{
int pointer=0;
string order[4]={"TAKE ORDER","CHECK MENU","MEMO","RETURN TO MAIN MENU"};
while(true)
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14);
cout<<"\t\t ZAIKA KATHI ROLLS\n";
cout<<"\t\t\tORDER MENU\n\n";
for(int i=0;i<=3;i++)
{
if( i==pointer)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
cout<<"-> "<<order[i]<<endl<<endl;
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
cout<<" "<<order[i]<<endl<<endl;
}
}
while(true)
{
if(GetAsyncKeyState(VK_UP)!=0)
{
pointer-=1;
if(pointer==-1)
{
pointer=3;
}
break;
}
else if(GetAsyncKeyState(VK_DOWN)!=0)
{
pointer+=1;
if(pointer==4)
{
pointer=0;
}
break;
}
else if(GetAsyncKeyState(VK_RETURN)!=0)
{
switch(pointer)
{
case 3 : return 1;
}
}
}
Sleep(150);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
int pointer=0;
int flag=1;
string menu[6]={"START BUSINESS DAY","CONTINUE BUSINESS DAY","END BUSINESS DAY","INVENTORY MANAGEMENT","STATISTICS","SETTINGS"};
Mainmenu : while(true)
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),14);
int i=0;
cout<<"\t\t ZAIKA KATHI ROLLS\n";
cout<<"\t\t\tMAIN MENU\n\n";
for(i=0;i<=5;i++)
{
if(i==pointer)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
cout<<"-> "<<menu[i]<<endl<<endl;
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15);
cout<<" "<<menu[i]<<endl<<endl;
}
}
while(true)
{
if(GetAsyncKeyState(VK_UP)!=0)
{
pointer-=1;
if(pointer==-1)
{
pointer=5;
}
break;
}
else if(GetAsyncKeyState(VK_DOWN)!=0)
{
pointer+=1;
/* if(flag==0 && pointer==1)
pointer=3;
if(flag==1 && pointer==0)
pointer=1;*/
if(pointer==6)
{
pointer=0;
}
break;
}
else if(GetAsyncKeyState(VK_RETURN)!=0)
{
switch(pointer)
{
case 0 :chk=sbd();
if(chk==1)
goto Mainmenu;
}
}
}
Sleep(150);
}
return 0;
}
我想到的最好的想法是将“开始工作日”作为一个函数,在该函数中,当我们按下“返回主菜单”时,该函数将返回一个主函数将检测到的值,并且然后通过使用 goto 函数,程序控制将转移到主菜单。显然那是行不通的,所以任何人都可以帮助我解决这个问题吗?
最佳答案
发生的事情是,当您在“返回主菜单”上按回车键时,它实际上是返回到主菜单。如果您调试并单步执行它,您会看到这一点。问题在于,一旦它走出子菜单循环,它就会进入主菜单循环,检查是否按下了“enter”,通过条件并再次进入子菜单循环。
问题是您没有在代码中正确使用 GetAsyncKeyState 函数:
if (GetAsyncKeyState(VK_RETURN) != 0)
它检查值是否为零。但是根据文档,此函数返回一个 SHORT。
如果按键被按下,最高有效位为 1,否则为 0。
如果自上次调用 GetAsyncKeyState 后按键被按下,则最低有效位为 1。我想这就是你想要的。因此,首先更改代码中的两个位置:
if (GetAsyncKeyState(VK_RETURN) != 0)
到:
if (GetAsyncKeyState(VK_RETURN) & 0x01 != 0)
我们只想检查最低有效位以查看自上次调用该函数以来是否按下了该键。如果您这样做,它应该会起作用。
你也可以使用 Windows 宏这样写:
if (LOBYTE(GetAsyncKeyState(VK_RETURN)) != 0)
我还应该提一下,您可能应该以同样的方式进行按键上键和下键操作。
我真的很喜欢它,干得漂亮。
编辑:GetAsyncKeyState() 返回一个短整数。它很可能是两个字节。当函数返回此值时,它会设置某些位或标志来告诉您信息。正如我所说,最高有效位(最高位)告诉您按键是否按下,最低有效位告诉您自上次调用该函数以来是否按下了该键。
所以返回的二进制数字看起来像这样 (MSB) 是最重要的,(LSB) 是最不重要的:
10000000 00000001
^ MSB ^ LSB
如果这是一个无符号整数,它的值将是 32769。您对当前是否按下该键不感兴趣,但更感兴趣的是自上次调用该函数以来该键是否被按下。你只对右边的位感兴趣。按位运算符 & AND 将比较两个位模式,当且仅当两个位都为 1 时,它会将结果位设置为 1。这与掩码一起使用,因此您可以提取某些值,可以这么说。
10000000 00000001 // Original value
00000000 00000001 // The mask
00000000 00000001 // Result
结果为 1。然后您可以检查该值是否为 1,如果是,则自上次调用以来按下了该键。这是一种非常低级的做事方式,但这有点像 Windows 的工作方式,Windows 实际上通过提供执行相同操作的宏 LOBYTE() 来提供帮助。另一种方法是,该函数可以为每个事物返回带有 bool 值的类/结构。
第二次编辑(进一步解释):
如果自上次调用 GetAsyncKeyState 以来按下键,则最低有效位仅为 1。因此,如果您按下 enter 键并保持按下 3 秒,则 LSB 将仅在第一次调用 GetAsyncKeyState 时设置。然而,MSB 将继续返回并设置 MSB,因为这表明键是否按下。我认为以下快速程序应该很好地说明了这一点。
在我们的例子中,一个 short 有 2(字节)16 位,因此我们将使用正确的位移运算符 >> 来获取它。我要将返回类型从 SHORT 转换为 USHORT。这是因为对于负数的有符号整数,位移是未定义的,因为右移可以传播最左边的位。例如:
// Right shifting 7 bits
UNSIGNED INT
1000 0000 >> 7 = 0000 0001
SIGNED INT
1000 0000 >> 7 = 1111 1111 // We may get this instead which is not what we want
启动一个新项目并粘贴它并运行,尝试按回车键:
#include <iostream>
#include <Windows.h>
using namespace std;
int main()
{
while (true)
{
int count = 0;
USHORT funcResult = 0;
while ((funcResult = GetAsyncKeyState(VK_RETURN)) != 0)
// If MSB or LSB is set then condition is true
{
count++;
cout << "Return pressed " << count << " times in one loop\n";
cout << "MSB = " << (funcResult >> 15) << '\n';
cout << "LSB = " << (funcResult & 1) << '\n';
}
// You will see that the MSB is always 1, because it tells us
// if the key is down.
// However the LSB is 1 only on the first run of the while loop
}
}
所以这就是为什么添加 Sleep() 也解决了这个问题,因为如果你按下 enter 键 400 毫秒然后松手,让线程休眠 500 毫秒,下次它检查键就不会了下来,MSB 不会被设置。
关于c++ - 使用c++从另一个内部菜单返回主菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49249915/
我听说过两种数据库架构。 大师级 主从 master-master不是更适合现在的web吗,因为它就像Git一样,每个单元都有整套数据,如果一个宕机也无所谓。 主从让我想起了 SVN(我不喜欢它),你
我们当前将 MySQL 配置为支持故障转移:Site1 Site2。当它们被设置为主/主时。在给定时间点,应用程序服务器仅主动写入一个站点。我们想要设置一个新的故障转移站点。然后我们将拥有 Site
我听说过两种数据库架构。 大师-大师 主从 master-master 不是更适合当今的网络吗,因为它就像 Git,每个单元都有整套数据,如果其中一个发生故障,也没关系。 主从让我想起 SVN(我不喜
我正在创建一个标记为类别的表,其中主类别(父列)包含 0,子类别包含父类别的 ID。我听说这叫引用。我的问题:这张表的结构正确吗?或者是否有更好的方法,例如实现遍历树或类似方法? CREATE TAB
我正在阅读一份关于 C++ 与 C 的文档。该文档说与 C 相比,C++ 编写得非常紧凑。一个例子是,C 允许 main() 函数类型为 void。另一方面,C++ 不允许这样做,他给出了标准中的以下
C main函数和Java main函数有什么区别? int main( int argc, const char* argv[] ) 对比 public static void main(Strin
我一直摸不着头脑,但运气不好。设计器有一个包含 3 栏的站点、两个侧边栏和一个主要内容区域。 专为桌面设计,左栏、主要内容、右栏。但是,在较小的设备上,我们希望首先堆叠主要内容。 所以通常情况下,你可
我一直在阅读有关 Jenkins 主/从配置的信息,但我仍然有一些问题: 是不是真的没有像 Jenkins 主站那样安装和启动从站 Jenkins?我假设我会以相同的方式安装一个主 Jenkins 和
据我了解,Viemodel中MVVM背后的概念包括业务逻辑和/或诸如暴露于 View 的数据的主/明细关系之类的事物 因此,正如我发现的那样,有很多ORM生成器,例如模型的telerik a.o以及另
我们有一个群集,其中包含3个主分区,每个主分区有2个副本。主/副本分片的总文档数相同;但是,对于同一查询/文档,我们得到3个不同的分数。当我们将preference = primary添加为查询参数时
我有一个非常大/旧/长时间运行的项目,它使用相对于启动目录的路径访问文件资源(即应用程序仅在从特定目录启动时才工作)。当我需要调试程序时,我可以从 eclipse 启动它并使用“运行配置”->->“工
谁能向我解释一下为什么我在这段代码上遇到段错误?我一直试图弄清楚这一点,但在各种搜索中却一无所获。当我运行代码而不调用 main(argc, argv) 时,它会运行。 Slave 仅将 argv 中
使用 xcode 中的默认项目作为主从应用程序,如果我在折叠委托(delegate)中放置 print 调试语句,当我旋转设备时它似乎永远不会被触发(事实上我永远无法触发它)。 我编辑的代码位于 Ap
是否有任何产品可以使 mysql 主/从故障转移过程更容易?一些可以自动发生的事情,而不是手动修复它。 最佳答案 [...稍后...;) 你所说的“更容易”是什么?MySQL 有很多解决方案: MyS
我有两个 mysql 数据库。我想做主/主复制。 复制以一种方式进行。然而,反过来说却不然。该错误表明它无法与用户“test@IPADDRESS”连接。 如何将用户名更改为 repl?从未进行过测试,
我正在尝试在 MySQL 中运行以下查询: GRANT REPLICATION SLAVE ON *.* TO 'replication'@’10.141.2.%’ IDENTIFIED BY ‘sl
我正在尝试使用 Android 提供的主/详细流程模板创建一个应用程序,并且我正在尝试将多个操作栏菜单项添加到操作栏的主要部分和详细信息部分。这就是我要实现的目标: (来源:softwarecrew.
我正在寻找一个跨平台的 C++ master/worker 库或工作队列库。一般的想法是我的应用程序将创建某种任务或工作对象,将它们传递给工作主机或工作队列,这将依次在单独的线程或进程中执行工作。为了
我似乎看到很多人在他们的 MySQL 模式中任意分配大尺寸的主/外键字段,例如 INT(11) 甚至 WordPress 使用的 BIGINT(20)。 如果我错了,请纠正我,但即使是 INT(4)
如果我有一个可以与多个键相关联的用户,正确的表设置应该是: 一个表有两列,例如: UserName | Key 没有主键且用户可以有多行,或者: 具有匹配标识符的两个表 Table 1 Us
我是一名优秀的程序员,十分优秀!