2011-12-20 4 views
1

Хотя название вопроса кажется немым, это не совсем то, что мне нужно. Чтобы заполнить целиком область с цветом, нужно выбрать подходящую кисть - это тривиально. Но я хочу заполнить верхнюю половину его разным цветом, а нижнюю половину - другой. Если бы это был нормальный (не круглый) прямоугольник, я мог бы нарисовать два прямоугольника (с разными кистями). Но с RoundRect у меня нет никаких идей, как это сделать.GDI: Как заполнить RoundRect цветом?

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

Я надеюсь, что вы получите идею, что я имею в виду :)

+1

Используйте отсечение. IntersectClipRect() будет работать. Или используйте Paths, FillPath будет работать. –

+0

Я бы сказал, что отсечение будет самым простым. Разделите область пополам и установите прямоугольник клипа в обработчике 'WM_PAINT'. Не уверен, почему Ганс не опубликовал это в качестве ответа. –

ответ

3

Если вы должны использовать устаревшую GDI вместо GDI +, здесь я написал вам функцию, чтобы нарисовать такую ​​(ячейку), как вам нужно, я надеюсь, что это это то, что вы ожидали!

Основная идея заключается в том, чтобы создать верхнюю и нижнюю области (которые оба они были полное перекрытие прямоугольников со скругленными углами, то каждый из них имеет один из его половин отрезать)

Diff operation to show how to created the upper have of the intended "cell"

я подготовил выше иллюстрацию к покажите, как может быть произведена ячейка. Это только для верхней стороны, но у вас должна быть идея создать нижнюю.

Вот функция обертывание, чтобы создать ячейку, которую необходимо:

void DrawCell(HDC& hdc, const RECT& rcTarget,const HBRUSH& hbrUpper, const HBRUSH& hbrLower) 
    { 

     HRGN hRgnUpper = CreateRoundRectRgn(rcTarget.left, rcTarget.top, rcTarget.right, rcTarget.bottom, 42, 38);  
     HRGN hRgnLower = CreateRoundRectRgn(rcTarget.left, rcTarget.top, rcTarget.right, rcTarget.bottom, 42, 38); 

     HRGN hRgnCutFromUpper = CreateRectRgn(rcTarget.left, rcTarget.top + ((rcTarget.bottom - rcTarget.top)/2), rcTarget.right, rcTarget.bottom);  
     HRGN hRgnCutFromLower = CreateRectRgn(rcTarget.left, rcTarget.top , rcTarget.right, rcTarget.bottom - ((rcTarget.bottom - rcTarget.top)/2));  

     CombineRgn(hRgnUpper, hRgnUpper,hRgnCutFromUpper, RGN_DIFF); 
     CombineRgn(hRgnLower, hRgnLower,hRgnCutFromLower, RGN_DIFF); 


     FillRgn(hdc, hRgnUpper, hbrUpper);  
     FillRgn(hdc, hRgnLower, hbrLower); 

     DeleteObject(hRgnCutFromLower); 
     DeleteObject(hRgnCutFromUpper); 
     DeleteObject(hRgnLower); 
     DeleteObject(hRgnUpper); 



    } 

вызова этой функции внутри обработчика WM_PAINT:

 RECT rcTarget; 
    rcTarget.left = 20; 
    rcTarget.top = 20; 
    rcTarget.right = 275; 
    rcTarget.bottom = 188; 

    HBRUSH hRed = CreateSolidBrush(RGB(255, 0, 0)); 
    HBRUSH hGreen = CreateSolidBrush(RGB(0, 255, 0)); 

    DrawCell(hdc, rcTarget, hRed, hGreen); 
Смежные вопросы