gpt4 book ai didi

c++ - 防止窗口移动

转载 作者:行者123 更新时间:2023-11-28 00:44:57 27 4
gpt4 key购买 nike

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

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

 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。

最佳答案

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

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

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

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

关于c++ - 防止窗口移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16698879/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com