MFC tab 绘制效果

原创
2015/01/29 17:50
阅读数 186
CDC *pDC =&MemDC;
	CRect rectTab=rcWindow;
	rectTab.left+=100;
	rectTab.right=rectTab.left+100;
	rectTab.top+=5;
	rectTab.bottom=rectTab.top+25;
	CList<POINT, POINT> pts;

	POSITION posLeft = pts.AddHead (CPoint (rectTab.left, rectTab.top));
	posLeft = pts.InsertAfter (posLeft, CPoint (rectTab.left, rectTab.top + 2));

	POSITION posRight = pts.AddTail (CPoint (rectTab.right, rectTab.top));
	posRight = pts.InsertBefore (posRight, CPoint (rectTab.right, rectTab.top + 2));

	int xLeft = rectTab.left + 1;
	int xRight = rectTab.right - 1;

	int y = 0;
	for (y = rectTab.top + 2; y < rectTab.bottom-4;y += 2)
	{
		
		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft, y));
		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft, y+2));

		posRight = pts.InsertBefore (posRight, CPoint (xRight, y));
		posRight = pts.InsertBefore (posRight, CPoint (xRight, y+2));
		xLeft++;
		xRight--;
		
	}
	
	xLeft--;
	xRight++;
	/**/

	const int nTabLeft = xLeft - 1;
	const int nTabRight = xRight + 1;

	for (;y < rectTab.bottom - 1; y++)
	{
		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft-1, y-1));
		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft, y));
		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 1, y+1));
		posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 2, y+2));
	
		posRight = pts.InsertBefore (posRight, CPoint (xRight, y));
		posRight = pts.InsertBefore (posRight, CPoint (xRight - 1, y + 1));

		if (y == rectTab.bottom - 2)
		{
			posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 1, y + 1));
			posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 3, y + 1));

			posRight = pts.InsertBefore (posRight, CPoint (xRight, y + 1));
			posRight = pts.InsertBefore (posRight, CPoint (xRight - 2, y + 1));
		}

		xLeft++;
		xRight--;
	}/**/

	posLeft = pts.InsertAfter (posLeft, CPoint (xLeft + 2, rectTab.bottom));
	posRight = pts.InsertBefore (posRight, CPoint (xRight - 2, rectTab.bottom));
	LPPOINT points = new POINT [pts.GetCount ()];
	int i = 0;

	for (POSITION pos = pts.GetHeadPosition (); pos != NULL; i++)
	{
		points [i] = pts.GetNext (pos);
		points [i].y = rectTab.bottom - (points [i].y - rectTab.top);
	}

	CRgn rgnClip;
	rgnClip.CreatePolygonRgn (points, (int) pts.GetCount (), WINDING);
	pDC->SelectClipRgn (&rgnClip);

	//Region rg((HRGN)rgnClip.GetSafeHandle());   
	//CBrush br (RGB(255,255,255));
	//pDC->FillRect ( rectTab,&br);
	//br.DeleteObject();
	/***绘制渐变色**/
	int R=255;
	int G=255;
	int B=255;
	CPen Bpen (PS_SOLID, 1, RGB(R,G,B));
	CPen* pOLdBPen = pDC->SelectObject (&Bpen);
	for(int i=rectTab.top;i<rectTab.bottom;i++)
	{
		 CPen pen (PS_SOLID, 1, RGB(R--,G--,B--));
	     pDC->SelectObject (&pen);
		 pDC->MoveTo (rectTab.left,i );
		 pDC->LineTo (rectTab.right,i);
		 pen.DeleteObject();
	}
	Bpen.DeleteObject();
	pDC->SelectObject (&pOLdBPen);
	
	/*graphics.SetSmoothingMode(SmoothingModeHighSpeed);
	SolidBrush brush22(Color(255,255, 255, 255));
	graphics.FillRegion(&brush22,&rg);*/

	pDC->SelectClipRgn (NULL);
	CPen pen (PS_SOLID, 1, globalData.clrBarShadow);
	CPen* pOLdPen = pDC->SelectObject (&pen);

	for (i = 0; i < pts.GetCount (); i++)
	{
		if ((i % 2) != 0)
		{
			int x1 = points [i - 1].x;
			int y1 = points [i - 1].y;

			int x2 = points [i].x;
			int y2 = points [i].y;

			if (x1 > rectTab.CenterPoint ().x && x2 > rectTab.CenterPoint ().x)
			{
				x1--;
				x2--;
			}

			if (y2 >= y1)
			{
				pDC->MoveTo (x1, y1);
				pDC->LineTo (x2, y2);
			}
			else
			{
				pDC->MoveTo (x2, y2);
				pDC->LineTo (x1, y1);
			}
		}
	}

	delete [] points;
	pDC->SelectObject (pOLdPen);
	rectTab.left = nTabLeft;
	rectTab.right = nTabRight;

   效果图:

   

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部