-1

此代码不再适用于 Windows 7 或 8。

它们不支持 SysAnimate32 控件吗?

有没有办法让它像以前在 Windows XP 上一样工作?

(我需要写更多细节,但我没有更多细节可谈:)

谢谢

#include <windows.h>
#include <CommCtrl.h>

HINSTANCE hInstance;

#define IDC_MYANIMATE 9

HWND CreateAnimationControl (HWND hParent)
{
    HWND hAnimation = Animate_Create( hParent, IDC_MYANIMATE, ACS_AUTOPLAY | WS_BORDER | WS_CHILD, hInstance);
    Animate_Open (hAnimation, "test.avi");
    ShowWindow (hAnimation, SW_SHOW);
    return hAnimation;
}

LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
    static HWND hAnimation = NULL;

    switch (uiMsg)
    {
        case WM_DESTROY:
             PostQuitMessage (0);
             break;

        case WM_CREATE:
             hAnimation = CreateAnimationControl (hWnd);
             break;

        case WM_SHOWWINDOW:
        if (wParam)
        {
            MoveWindow (hAnimation, 0, 0, 300, 300, TRUE);
            Animate_Play (hAnimation, 0, -1, -1);
        }
        break;
    }
    return DefWindowProc (hWnd, uiMsg, wParam, lParam);
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpsCmdLine, int iCmdShow)
{
    WNDCLASSEX WindowClass;
    HWND hWnd;
    MSG uMsg;

    hInstance = GetModuleHandle (NULL);

    WindowClass.cbClsExtra = 0;
    WindowClass.cbSize = sizeof (WNDCLASSEX);
    WindowClass.cbWndExtra = 0;
    WindowClass.hbrBackground = CreateSolidBrush (RGB (0, 0, 0));
    WindowClass.hCursor = LoadCursor (NULL, IDC_ARROW);
    WindowClass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    WindowClass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    WindowClass.hInstance = hInstance;
    WindowClass.lpfnWndProc = WindowProcedure;
    WindowClass.lpszClassName = "1";
    WindowClass.lpszMenuName = NULL;
    WindowClass.style = 0;

    if (!RegisterClassEx (&WindowClass))
    {
        MessageBox (NULL, "Window class registration has failed!", "Error:", MB_OK | MB_ICONERROR);
        return 0;
    }

    hWnd = CreateWindow ("1", "Win32 Animation Testing", WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
                          hInstance, NULL);
    if( ! hWnd )
    {
        MessageBox (NULL, "Window creation has failed!", "Error:", MB_OK | MB_ICONERROR);
        return 0;
    }

    ShowWindow( hWnd, SW_SHOW );
    UpdateWindow( hWnd );

    while( GetMessage( &uMsg, NULL, 0, 0 ) > 0 )
    {
        TranslateMessage( &uMsg );
        DispatchMessage ( &uMsg );
    }

    return ( int ) uMsg.wParam;
}
4

1 回答 1

1

不,当我在 Windows 8 上尝试使用 VS2012 编译的代码时,它仍然可以正常工作。一张截图来证明:

在此处输入图像描述

值得注意的是您缺少错误检查,您没有注意 Animate_Open() 的返回值。FALSE 返回表明它无法打开 .avi 文件。许多可能的原因,该功能没有比“无法做到”更好的诊断方法。

很难找到它可以处理的 .avi 文件,该控件非常陈旧,无法处理,只能处理最简单的。特别是,如 MSDN Library 所述,将无法打开同时具有音轨的 .avi 文件。我使用的测试是我从 Visual Studio 图像库 Animations/filecopy_16.avi 中挖出的一个非常简单的。

因此,在添加错误处理之后,基本检查是确保该文件实际上与您的 EXE 存在于同一目录中,并且它是一个非常简单的 .avi 文件,至少可以在 WMP 中播放。

于 2013-04-19T09:37:40.383 回答