我目前有一个在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。
答案 0 :(得分:2)
当DefWindowProc在wParam中使用SC_MOVE或SC_SIZE处理WM_SYSCOMMAND时,它会进入一个循环,直到用户通过释放鼠标按钮或按Enter或escape来停止它。这样做是因为它允许程序通过处理WM_PAINT和WM_NCPAINT消息来呈现客户区(您的小部件或游戏或其他任何内容)以及边框和标题区域(您仍应在Window Procedure中接收这些事件)。
它适用于普通的Windows应用程序,这些应用程序由于接收消息而在其Window Procedure中进行大部分处理。它只影响在窗口过程之外进行处理的程序,例如游戏(通常是全屏但不受影响)。
然而,有一种解决方法:自己处理WM_SYSCOMMAND,调整大小或移动自己。这需要付出很多努力,但可能证明是值得的。或者,您可以使用setjmp / longjmp在发送WM_SIZING时从Window Procedure中逃脱,或者沿着相同的行使用Windows Fibers;这些都是黑客的解决方案。
我在上周末解决了它(使用第一种方法),如果您感兴趣我已经将代码发布到sourceforge上的公共域。只需确保阅读README,特别是警告部分。这是:https://sourceforge.net/projects/win32loopl/
答案 1 :(得分:1)
由于用户可以移动窗口的标题栏,您可以完全删除该标题栏和边框。有关示例,请参阅“opening a window that has no title bar with win32”。
当游戏启动或暂停时,您可以显示自己的UI元素,以允许用户在这些特定情况下移动游戏窗口,但仅限于此。
答案 2 :(得分:0)
您可以使用WM_ENTERSIZEMOVE
和WM_EXITSIZEMOVE
消息检查尺寸/移动循环。