0

我目前有一个在 win32 窗口中运行的小游戏。我刚刚注意到,当我按住窗口顶部(具有关闭按钮的栏)时,它会冻结我的应用程序。我想禁用它,因为它设法完全破坏了我的应用程序(计时器继续计数)。

似乎即使是最简约的窗口创建设置,它仍然具有此功能。我怎样才能禁用它?我目前有:

 HWND hWnd = CreateWindowW( L"Game",L"Game",
                          0x00000000L | 0x00080000L,
                          wr.left,
                          wr.top,
                          wr.right-wr.left,
                          wr.bottom-wr.top,
                          NULL,
                          NULL,
                          wc.hInstance,
                          NULL );

我读到我的线程在拖动时被忽略,如果我被迫使用 2 个线程,有人可以提供一个小例子吗?

还是我应该停止计时器?(我应该捕捉到什么信息,它甚至会被捕捉到吗?)

更新

我正在使用我的时间类的实例来处理看起来像这样的时间:

Timer::Timer() {
    __int64 frequency;
    QueryPerformanceFrequency( (LARGE_INTEGER*)&frequency );
    invFreqMilli = 1.0f / (float)((double)frequency / 1000.0);
    StartWatch();
}

void Timer::StartWatch() {
    startCount = 0;
    currentCount = 0;
    watchStopped = false;
    QueryPerformanceCounter( (LARGE_INTEGER*)&startCount );
}

我的 Win32 消息循环包含:mousemove、keyup 和 keydown。

4

3 回答 3

2

当 DefWindowProc 在 wParam 中使用 SC_MOVE 或 SC_SIZE 处理 WM_SYSCOMMAND 时,它会进入一个循环,直到用户通过释放鼠标按钮或按下 enter 或 escape 来停止它。这样做是因为它允许程序通过处理 WM_PAINT 和 WM_NCPAINT 消息(您仍然应该在窗口过程中接收这些事件)来呈现客户区域(您的小部件或游戏或任何被绘制的地方)以及边框和标题区域。

它适用于普通 Windows 应用程序,这些应用程序在接收消息后在其窗口过程中进行大部分处理。它只影响在窗口过程之外进行处理的程序,例如游戏(通常是全屏的,无论如何都不会受到影响)。

但是,有一种解决方法:自己处理 WM_SYSCOMMAND,调整大小或移动自己。这需要大量的努力,但可能证明是值得的。或者,您可以使用 setjmp/longjmp 在发送 WM_SIZING 时从窗口过程中退出,或者使用相同的方法使用 Windows 光纤;不过,这些都是骇人听闻的解决方案。

我在上周末解决了它(使用第一种方法),如果您有兴趣,我已将代码发布到 sourceforge 上的公共领域。请务必阅读自述文件,尤其是警告部分。这是:https ://sourceforge.net/projects/win32loopl/

于 2014-01-20T17:38:52.950 回答
1

由于用户可以移动窗口的标题栏,因此您可以完全删除该标题栏和边框。示例参见“用 win32 打开没有标题栏的窗口”。

当游戏启动或暂停时,您可以显示自己的 UI 元素,以允许用户在这些特定情况下移动游戏窗口,但仅限于那时。

于 2013-05-22T19:33:02.037 回答
0

WM_ENTERSIZEMOVE您可以使用和WM_EXITSIZEMOVE消息检查大小/移动循环。

于 2013-05-25T15:58:39.600 回答