我是C ++的新手,我想知道是否有人可以帮助我。什么是正确的循环结构是打印"你好世界"在DOS窗口中单击鼠标左键?
我做了一些搜索,我到达了像
这样的东西if ((GetKeyState(VK_LBUTTON) & 0x80) != 0)
{
printf("Hello World!\n");
}
或者事件会更好吗?
"你好世界"将成为从网络摄像头捕获图像的代码。原始教程代码有一个while循环(始终为true),最终流式传输视频。我的目标是通过鼠标点击捕获1帧。我试图让这个hello world事情的简化版本。
答案 0 :(得分:0)
他们现在就这样做,你可能无法获得理想的结果。将鼠标想象为在单独的线程上运行。当您调用代码行以查看鼠标是否被按下时,即使用户在该特定帧中按下了鼠标,它也可能是错误的。
some code <-- mouse button pressed by user
some code <-- mouse button released by user
some code
your mouse check <-- mouse button check is false (undesired result)
some code
some code
事件解决了这个问题,因为按下和释放中断存储在缓冲区中(由OS)。这消除了计时问题。我不确定你使用的是什么库,但是如果它类似于sdl或sfml,那么你可以使用事件循环来决定做什么。
事件循环(在“大游戏循环”中)应该类似于:
while(there's still events){
if(mouse press event){
do what you want on mouse press
}
}
因为在任何两个帧之间可能有多个鼠标按下事件,我会创建一个bool mouseWasPressed默认为false,如果发生了所需的事件,则将其设置为true。
bool mouseWasPressed = false;
while(there's still events){
if(mouse press event){
if(!mouseWasPressed){
mouseWasPressed = true;
capture frame for video
}
}
}
这样你就可以消除每帧多次鼠标按下事件(甚至认为它们不太可能)。当我说鼠标按下事件时,我假设您正在过滤特定的鼠标按钮。
答案 1 :(得分:0)
如果你想为每次点击重复捕捉(你的标题意味着什么......),你将不得不循环。然后它将是一个活动循环(在伪代码中)
while true {
if _mouse_click_ {
// your stuff
}
}
最好使用一个事件循环(我假设你在Windows上),因为操作系统只在事件发生时为你的编程提供时间片而不是让你的编程浪费时间片测试出现...并且可能饿死其他应用......
答案 2 :(得分:0)
对于控制台窗口中的鼠标处理,请使用ReadConsoleInput
并检查事件Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED
是否已发生。然后粘贴
那里的网络摄像头代码。
#include <iostream>
#include <stdlib.h>
#include <windows.h>
using namespace std;
int main()
{
cout<<"click anywhere in console window to write - hello world -\n\n\n\n\n\n\n\n\n\n\n\n\n"
"Press Ctrl+C to Exit";
HANDLE hout= GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
INPUT_RECORD InputRecord;
DWORD Events;
COORD coord;
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 25;
cci.bVisible = FALSE;
SetConsoleCursorInfo(hout, &cci);
SetConsoleMode(hin, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
while(1)
{
ReadConsoleInput(hin, &InputRecord, 1, &Events);
if(InputRecord.EventType == MOUSE_EVENT)
{
if(InputRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
{
coord.X = InputRecord.Event.MouseEvent.dwMousePosition.X;
coord.Y = InputRecord.Event.MouseEvent.dwMousePosition.Y;
SetConsoleCursorPosition(hout,coord);
SetConsoleTextAttribute(hout,rand() %7+9);
cout<<"Hello world" ;
}
}
FlushConsoleInputBuffer(hin);
}
return 0;
}