Плавное появление окна с помощью AnimateWindow
От: programme-soul  
Дата: 28.04.10 07:13
Оценка:
Здравствуйте!

У меня возникли проблемы с использованием функции AnimateWindow. Я прочитала все в MSDN и RSDN, что нашла про AnimateWindow. В результате ни один из способов непонятно как правильно использовать (т.к. неправильно работает для моего случая) и какой-то сумбур в голове...

Задача:
сделать плавное появление главного окна, используя AnimateWindow. После этого на главном окне должна отрисоваться картинка (средствами GDI+).

Проблема:
какой бы способ ни пробовала, изображение отрисовывается только после сворачивания/разворачивания окна, в то время, как если вместо AnimateWindow использовать ShowWindow, то такой проблемы нет.

Функция создания главного окна
bool 
CImageViewer::CreateMainWindow()
{
    m_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, (const char*)"Image Viewer main window class", 
                            (const char*)"Image Viewer v.1.0.0", WS_OVERLAPPEDWINDOW, 
                            0, 0, 
                            1024, 768,
                            NULL, NULL, 
                            m_hInstance, this);

    if (m_hWnd == NULL)
        return false;

    if (!AnimateWindow(m_hWnd, 500, AW_BLEND))
        return false;

    if (!UpdateWindow(m_hWnd))
        return false;

    return true;
}


Оконная процедура
LRESULT CALLBACK 
CImageViewer::WndProc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    PAINTSTRUCT ps;
    HDC         hdc;

    switch (msg)
    {
    case WM_PRINTCLIENT:
    // в MSDN написано, что нужно обрабатывать это сообщение, но как?
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
        if (hdc == NULL) break;
        OnPaint(hdc);
        EndPaint(hWnd, &ps);
        break;
    case WM_CLOSE:
        AnimateWindow(hWnd, 500, AW_BLEND|AW_HIDE);
        DestroyWindow(hWnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, msg, wparam, lparam);
    }

    return 0;
}


Функция прорисовки (использует GDI+)

void 
CImageViewer::OnPaint(HDC hdc)
{
    Graphics graphics(hdc);

    Image image(L"g:\\_project\\image viewer\\ipcamera.jpg");
    graphics.DrawImage(&image, 0, 0);
}
Just programming soul
...who wants to know more
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.