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;
}
Непонятки с GDI/Bitmap
Код:
Собственно, задача в том, что есть bitmap в памяти, и с ним предполагается производить манипуляции (пока для эксперимента только заливка ExtFloodFill()). При этом обработчик сообщения WM_PAINT должен переписывать соберживое этого bitmap-а в памяти в текущий контекст (DC) окна для отображения, чтобы не посторять все манипуляции.
И в чём, собственно, проблема... Левый верхний фрагмент окна действительно залит, но залит он белым цветом, а не красным, как предполагается в программе.
Такое ощущение, что этот CompatibleBitmap в памяти двухцветный.
[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(), если у вас прямоугольная область.