netlib.narod.ru< Назад | Оглавление | Далее >

Заключение

В этой главе я упоминал о том, что загрузить растровое изображение на поверхность можно и другим, более простым способом. Вспомните — в интерфейс DirectDrawSurface входит функция GetDC(), которая позволяет работать с поверхностями с помощью обычных функций Win32. Реализующая этот подход функция может выглядеть так:

BOOL CopyBmp (LPDIRECTDRAWSURFACE surface, HBITMAP bmp,
             int x, int y)
{
    if (bmp == 0)
    {
        TRACE("no bmp specified\n");
        return FALSE;
    }
    if (surface == 0)
    {
        TRACE("no surface specified\n");
        return FALSE;
    }
    HDC imageDC = CreateCompatibleDC(0);
    SelectObject(imageDC, bmp);

    BITMAP bitmap;
    GetObject(bmp, sizeof(bitmap), &bitmap);
    int w = bitmap.bmWidth;
    int h = bitmap.bmHeight;

    DDSURFACEDESC desc;
    desc.dwSize = sizeof(desc);
    desc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH;
    surface->GetSurfaceDesc(&desc);
    HDC dc;
    HRESULT result;
    if ((result = surface->GetDC(&dc)) == DD_OK))
    {
        Stretchblt(dc, 0, 0, desc.dwWidth, desc.dwHeight, imageDC,
               x, y, w, h, SRCCOPY);
        surface->ReleaseDC(dc);
    }
    DeleteDC (imageDC);

    return result == DD_OK;
}

Эта функция не имеет никакого отношения к программе этой главы, ее даже нет на CD-ROM. Она приведена с единственной целью — показать, что с помощью функции GetDC() интерфейса DirectDrawSurface и функции Win32 наподобие StretchBlt() можно легко скопировать растровое изображение Windows на поверхность. Разумеется, в этом случае приходится жертвовать скоростью, поскольку механизм GDI не отличается особым быстродействием, а его функции не поддаются оптимизации.

Не будем отклоняться от основной темы этой главы — прямого доступа к поверхностям. Загрузка растров на поверхности была всего лишь упражнением. Теперь, когда вы все знаете о блокировке поверхностей и форматах пикселей, вы сможете самостоятельно реализовать алгоритмы рисования линий, эффекты растрирования (dithering) и даже спрайты. Кроме того, можно включить в программу поддержку других файловых форматов.

В главе 6 мы узнаем, как наделить приложение поддержкой DirectInput. Обходя традиционные механизмы ввода Windows, DirectInput позволяет с максимальной эффективностью получать данные от таких устройств, как клавиатура или мышь.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz