GDI:如何用颜色填充RoundRect?

TX_*_*TX_ 2 gdi visual-c++

虽然问题标题看起来很愚蠢,但这并不是我所需要的。为了用颜色填充整个区域,需要选择合适的画笔 - 这很简单。但我想用不同的颜色填充它的上半部分,用不同的颜色填充它的下半部分。如果它是普通(非圆形)矩形,我可以绘制两个矩形(使用不同的画笔)。但对于 RoundRect 我不知道如何做到这一点。

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

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

Ass*_*sem 5

如果您必须使用旧版 GDI 而不是 GDI+,这里我为您编写了一个函数来根据您的需要绘制这样的(单元格)我希望它是您所期望的!

基本思想是创建上部和下部区域(它们都是完全重叠的圆角矩形,然后每个区域的一半被切掉)

差异操作显示如何创建预期“单元”的上层

我准备了上面的插图来展示如何生产电池。它仅适用于上侧,但您应该已经有了创建下侧的想法。

这是一个用于创建您需要的单元格的包装函数:

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



    }
Run Code Online (Sandbox Code Playgroud)

从 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);
Run Code Online (Sandbox Code Playgroud)