Windows 7和8上的SysAnimate32

时间:2013-04-19 07:40:31

标签: windows windows-7

此代码不再适用于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;
}

1 个答案:

答案 0 :(得分:1)

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

enter image description here

值得注意的是您的错误检查不足,您没有注意Animate_Open()的返回值。 FALSE返回表示无法打开.avi文件。很多可能的原因,这个功能没有比“无法做到”更好的诊断。

很难找到一个可以处理的.avi文件,这个控件很老了,不能处理,而是最简单的。特别是,如MSDN Library所述,也不会打开具有音轨的.avi文件。我使用的测试是一个非常简单的测试,我从Visual Studio图像库Animations / filecopy_16.avi挖出来。

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