GDI:如何用颜色填充RoundRect?

时间:2011-12-20 00:24:26

标签: visual-c++ gdi

虽然问题标题似乎很愚蠢,但这并不是我所需要的。要用颜色填充整个区域,需要选择合适的画笔 - 这是微不足道的。但是我想用不同的颜色填充它的上半部分,并且用不同的颜色填充它的下半部分。如果它是正常(非圆形)矩形,我可以绘制两个矩形(使用不同的画笔)。但是对于RoundRect,我没有任何想法如何去做。

以下是我需要它:我使用RoundRect在我的图形可视化中绘制每个节点,并且这些节点应该有几个应该用不同颜色填充的隔间(单元格)。

我希望你明白我的意思:)。

1 个答案:

答案 0 :(得分: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);