如果必须使用传统的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);
}
呼叫从自己的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);
使用截断。 IntersectClipRect()会起作用。或者使用Paths,FillPath将起作用。 – 2011-12-20 01:42:57
我会说裁剪将是最容易的事情。将该区域分成两半,并在你的'WM_PAINT'处理程序中设置一个剪切矩形。不知道汉斯为什么不把它作为答案。 – 2011-12-20 05:06:51