Ton*_*y R 2 c++ windows opengl input messages
有谁知道为什么在按住键盘键并尝试处理它时会有些犹豫?我正在调用 WinProc(...) 中的一个函数,该函数将在按住某个键时在屏幕 (OpenGL) 上移动图像。我按下它并得到一个响应,然后大约 0.5 秒没有任何反应,然后它的行为正常(每个 WinMain 循环移动 1 个像素)。
我想知道 Windows 消息是否因为我需要禁用的某些功能而以某种方式延迟???
这是我的代码:
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd)
{
bool quit = false;
MSG msg;
createWindow(hinstance, SCRW, SCRH, SCRD, WINDOWED);
// Main loop
while (!quit)
{
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
if (msg.message == WM_QUIT)
quit = true;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
renderFrame(); // processes graphics
SwapBuffers(hdc);
}
return msg.lParam;
}
Run Code Online (Sandbox Code Playgroud)
和 WinProc(有更多案例,但同样的事情......):
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch(msg)
{
case WM_KEYDOWN:
switch ( wparam )
{
case VK_RIGHT:
key_RIGHT();
return 0;
}
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
和 key_RIGHT:
void key_RIGHT()
{
MoveObjectRight1Pixel();
}
Run Code Online (Sandbox Code Playgroud)
这是一个相当标准的键盘设置,在按下键和生成重复消息之间有一个小的延迟。
您可以保留一个 256 位的数组,而不是在 Windows 消息处理程序中处理键盘输入,以指示键盘的当前状态。当您收到WM_KEYDOWNor 时WM_KEYUP,您更新相应密钥的位。然后,在主循环中,检查键的当前状态和键的先前状态(通过保留第二个 256 位数组,将其复制到每一帧)。
如果关键点当前已按下但在前一帧中未按下,则相应地移动对象。
另一种选择是使用该GetAsyncKeyState()函数。