【问题标题】:Win32 - How to Animate a Borderless WindowWin32 - 如何为无边框窗口设置动画
【发布时间】: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


【解决方案1】:

因此,根据我原来帖子中的建议,我设法通过在窗口创建期间应用适当的样式来解决问题。下面的代码解决了它:

HWND hWnd = CreateWindowEx(     WS_EX_TOPMOST,
                                CLASS_NAME,
                                L"",
                                WS_POPUPWINDOW,
                                (coordinates.right - 252),
                                (coordinates.bottom - 102),
                                250,
                                100,
                                NULL, 
                                NULL, 
                                hInstance, 
                                NULL          );

密钥正在使用 WS_POPUPWINDOW。这似乎应用了正确的样式。我想不出任何方法可以使用 WS_OVERLAPPEDWINDOW 作为基础使其工作,尽管它可能是可能的。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多