2011-12-20 205 views
1

虽然问题标题似乎愚蠢,这不完全是我需要的。要用颜色填充整个区域,需要选择合适的笔刷 - 这很简单。但我想用不同的颜色填充上半部分,而下半部分用不同的颜色填充。如果是正常(不是圆形)的矩形,我可以绘制两个矩形(使用不同的画笔)。但是对于RoundRect,我不知道如何去做。GDI:如何用颜色填充RoundRect?

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

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

+1

使用截断。 IntersectClipRect()会起作用。或者使用Paths,FillPath将起作用。 – 2011-12-20 01:42:57

+0

我会说裁剪将是最容易的事情。将该区域分成两半,并在你的'WM_PAINT'处理程序中设置一个剪切矩形。不知道汉斯为什么不把它作为答案。 – 2011-12-20 05:06:51

回答

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