如果必須使用傳統的GDI而不是GDI +的想法,在這裏我給你寫了一個函數來得出這樣的(小區),你需要我希望它是你所期望的!
的基本思想是創建上部和下部區域(它們都是充分重疊圓角矩形,則每個具有其一半之一切斷)
![Diff operation to show how to created the upper have of the intended "cell"](https://i.stack.imgur.com/DKm2R.gif)
我已經準備由上述中,以展示細胞如何生產。它僅適用於上層,但你應該有創建下層的想法。
這裏是一個包裝函數來創建你所需要的細胞:
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