Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Непонятки с GDI/Bitmap

41K
16 марта 2011 года
kisssko
108 / / 28.10.2010
Весь код приводить не буду, а только что, что относится к теме.

Код:
HBITMAP   hImg;
HDC       hMemDC;
HGDIOBJ   prevObj;
BOOL      bResult;

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    hMemDC=CreateCompatibleDC(NULL);
    hImg=CreateCompatibleBitmap(hMemDC, 640, 480);
    prevObj=SelectObject(hMemDC, hImg);
    ExtFloodFill(hMemDC, 0, 0, RGB(255,0,0), FLOODFILLSURFACE);
    SelectObject(hMemDC, prevObj);

// .... лишний код убран ....

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    switch (message)
    {
// ... лишний код убран ...
    case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
        prevObj=SelectObject(hMemDC, hImg);
        bResult=BitBlt(hdc, 0, 0, 640, 480, hMemDC, 0, 0, SRCCOPY);
        SelectObject(hMemDC, prevObj);
        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}


Собственно, задача в том, что есть bitmap в памяти, и с ним предполагается производить манипуляции (пока для эксперимента только заливка ExtFloodFill()). При этом обработчик сообщения WM_PAINT должен переписывать соберживое этого bitmap-а в памяти в текущий контекст (DC) окна для отображения, чтобы не посторять все манипуляции.
И в чём, собственно, проблема... Левый верхний фрагмент окна действительно залит, но залит он белым цветом, а не красным, как предполагается в программе.
Такое ощущение, что этот CompatibleBitmap в памяти двухцветный.
278
16 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Ощущение вас подвело. :)

[QUOTE=MSDN]
// из описания параметров ExtFloodFill()
// ...
The ExtFloodFill function fills an area of the display surface with the current brush.
// ...
crColor [in]
The color of the boundary or of the area to be filled.
[/QUOTE]

Отсюда вывод: цвет заливки определяется не тем параметром, который вы написали, а цветом кисти. Рекомендую воспользоваться функцией FillRect(), если у вас прямоугольная область.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог