GDI: Как заполнить RoundRect цветом? - PullRequest
1 голос
/ 20 декабря 2011

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

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

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

1 Ответ

3 голосов
/ 21 декабря 2011

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

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

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

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

Вот функция обтекания для создания нужной ячейки:

   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);
...