ExtFloodFill застрял с белым цветом

#c #mfc

#c #mfc

Вопрос:

Итак, я пытался программно перерисовать растровое изображение, когда пользователь нажимал кнопку ExtFloodFill с помощью приведенного ниже кода

 CDC* cdc = GetDlgItem(IDC_MAP_STATIC)->GetDC(); // Get the CStatic that contains the bitmap
cdc->SetDCBrushColor(COLOR_SKYBLUE);            // constant for #00EEEE
SetDCBrushColor((HDC)cdc, COLOR_SKYBLUE);       // Trying to change the cdc brush color
// Just for debugging, i have inspected it and the value is the same with the COLOR_SKYBLUE value           
COLORREF cr = cdc->GetDCBrushColor();
cdc->ExtFloodFill(x,cdc->GetCurrentPosition().y y, RGB(0, 0, 0), FLOODFILLBORDER);
 

Но каждый раз, когда я вызываю ExtFloodFill, заливка заполняет область только белым цветом и в соответствии с документом

Заполняет область поверхности дисплея текущей кистью.

Я попытался изменить текущий цвет кисти CDC на цвет skyblue. Но это вообще не работает.

IDC_MAP_STATIC — это обычный объект CStatic. Я не использую для этого подкласс CStatic.

Итак, где я сделал не так, что это привело к тому, что ExtFloodFill продолжал заливать мое растровое изображение белым, а не небесно-голубым?

Ответ №1:

Неважно, решите это сразу же с помощью этого фрагмента. Я не знаю почему, но когда я устанавливаю цвет кисти с помощью SetDCBrushColor, это не меняет выбранную кисть. Итак, с помощью кодов, основанных на этой статье, я попытался объявить новую кисть и выбрать ее, прежде чем пытаться заполнить ее

 CDC* cdc = GetDlgItem(IDC_MAP_STATIC)->GetDC();
CBrush cb(RGB(255, 0, 0)); //Make a new CBrush (Red)
cdc->SelectObject(amp;cb);    //Assign the CBrush to the CDC
cdc->ExtFloodFill(x,y, RGB(0, 0, 0), FLOODFILLBORDER);
DeleteObject(cb);
ReleaseDC(cdc);
 

Комментарии:

1. Вы либо пропускаете контекст устройства, либо уничтожаете его, пока в нем все еще выделена ваша кисть. Ни один из них не предвещает ничего хорошего. Кроме того, ответ, который не объясняет, в чем заключалась проблема, и как она была решена, не совсем полезен.

2. Вы должны просто рисовать на DC вашего собственного окна, вместо того, чтобы делать то, что кажется взломом.