【发布时间】:2015-10-09 17:19:33
【问题描述】:
我在使用 Win32 制作无边框窗口动画时遇到了很多麻烦。
我的目标是创建一种“弹出式”窗口,该窗口会在某些事件发生时滑入屏幕右下角的视图中。目前我只是在尝试使美学正确。
我编写了一些代码,可以非常有效地创建具有我想要的格式的弹出窗口。这是一个完全无边框的窗口,具有黑色背景。
使用 ShowWindow() 我可以毫无问题地显示它。但是,我想做的是使用 AnimateWindow() 将其从右向左滑入角落。
这是我当前的代码:
/* create the window */
RECT coordinates;
SystemParametersInfo(SPI_GETWORKAREA, 0, &coordinates, 0);
HWND hWnd = CreateWindowEx(0, CLASS_NAME, L"Test", WS_OVERLAPPEDWINDOW,
(coordinates.right - 252), (coordinates.bottom - 102), 250, 100,
NULL, NULL, hInstance, NULL);
/* could not create window, end program */
if( hWnd == NULL ) {
return 0;
}
/* configure the borderless window style */
LONG_PTR lStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
LONG_PTR lExStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE);
lStyle &= ~( WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU );
lExStyle &= ~( WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE );
SetWindowLongPtr(hWnd, GWL_STYLE, lStyle);
SetWindowLongPtr(hWnd, GWL_STYLE, lExStyle);
/* animate the newly created window */
//ShowWindow(hWnd, SW_SHOW);
BOOL status = AnimateWindow(hWnd, 100, AW_SLIDE|AW_HOR_NEGATIVE);
DWORD error = GetLastError();
如您所见,我注释掉了 ShowWindow 调用,因为显示窗口的方法可以正常工作。如果我使用 AnimateWindow() 而不是 ShowWindow(),我看到的是状态布尔值始终为 0(表示失败),但错误代码也是 0(表示没有错误)。我不知道发生了什么。
如果我注释掉配置无边框窗口的整个部分(这是 cmets“配置无边框窗口”和“动画窗口”之间的部分),一切正常。动画很棒,状态布尔值为1(成功),错误为0。
唯一的问题是窗口上的边框又回来了,它看起来不像我想要创建的任何东西。
我正在努力弄清楚如何正确格式化窗口样式以使其与动画兼容。
谁能指出我正确的方向?为什么状态布尔值为 0,错误代码为 0? MSDN 文章提出了一些原因,但似乎都不适用于我的情况。我是否以不兼容的方式格式化窗口?
当我得到状态 == 0 和错误 == 0 时,应用程序出现在任务栏中,但没有与之关联的可见窗口。
谢谢!
【问题讨论】:
-
在我尝试代码时工作正常。很难相信它与样式标志的胡闹有关,但我们不知道 Windows 版本。更好的是,您可以在 CreateWindowEx() 调用中获得正确的样式。既然你没有,我的水晶球说这是预期的结果,当窗口由另一个线程或进程拥有时发生。
-
为什么不在创建窗口的时候设置你想要的样式呢?
-
我已将您的代码插入到向导生成的 Win32 应用程序 (VS2013) 的 InitInstance() 函数中,它在 Aero 和 Classic 主题中运行良好。您显示从该窗口中删除的样式,但不显示设置的样式。由于您知道所有样式位,因此我建议将 lStyle 和 lExStyle 设置为您需要的任何内容,而不考虑以前的值。
-
@Hans Passant - OP 从同一个函数创建并动画化该窗口,显然 - 同一个线程。
-
@VladFeinstein - 版本是 Windows 7,我无法找出正确的标志组合来创建无边框窗口。我想出了要 remove 使其工作的选项,但无法确定正确的初始选项来设置相同的效果。
标签: c++ windows winapi animation