⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hsgraphics.cpp

📁 漂亮菜单
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	hbrFill = ::CreateSolidBrush( clrPoint );
	::FillRgn( hdcMem, rgnLight, hbrFill );
	::DeleteObject( hbrFill );

	if ( fFouce == 0.0f )
	{
		float fMax = (float)hypot( max(abs(nX-rectFill.right),abs(nX-rectFill.left)), max(abs(nY-rectFill.bottom),abs(nY-rectFill.top)) );
		fFouce = ( fMax / (float)STEP );
	}

	for ( int nCount=0; nCount<STEP; nCount++ )
	{
		nStep = (int)( fFouce * ( nCount + 1 ) );

		rgnTemp  = ::CreateEllipticRgn( nX-nStep, nY-nStep, nX+nStep, nY+nStep );
		::CombineRgn( rgnLight, rgnTemp, rgnLight, RGN_DIFF );
//		::CombineRgn( rgnLight, rgnRect, rgnLight, RGN_AND );
		::DeleteObject( rgnTemp );

		hbrFill = ::CreateSolidBrush( RGB( nR+fRStep*nCount, nG+fGStep*nCount, nB+fBStep*nCount ) );
		::FillRgn( hdcMem, rgnLight, hbrFill );
		::DeleteObject( hbrFill );

		::DeleteObject( rgnLight );
		rgnLight = ::CreateEllipticRgn( nX-nStep, nY-nStep, nX+nStep, nY+nStep );
	}

	::BitBlt( hDC, rectFill.left, rectFill.top, nWidth, nHeight, hdcMem, 0, 0, SRCCOPY );

	::SelectObject( hdcMem, hobjOld );
	::DeleteObject( hbmpMem );
	::DeleteObject( rgnRect );
	::DeleteObject( rgnLight );
	::DeleteDC( hdcMem );
}

void WINAPI DrawRect(HDC hDC, COLORREF clrBorder, COLORREF clrBkgnd, int nLeft, int nTop, int nRight, int nBottom)
{
	HPEN	 hpen;
	HBRUSH	 hbr;
	HGDIOBJ	 hpenOld, hbrOld;

	hpen = ::CreatePen( PS_SOLID, 1, clrBorder );
	hbr  = ::CreateSolidBrush( clrBkgnd );

	hpenOld = ::SelectObject( hDC, hpen );
	hbrOld  = ::SelectObject( hDC, hbr );
	// Draw rectangle item	
	::Rectangle( hDC, nLeft, nTop, nRight, nBottom );

	::SelectObject( hDC, hpenOld );
	::SelectObject( hDC, hbrOld );

	::DeleteObject( hpen );
	::DeleteObject( hbr );
}

void WINAPI DrawArrow(HDC hDC, COLORREF clrArrow, int nX, int nY, int nSize, int nDirection)
{
	POINT	pt[2];
	HPEN	hpen;

	pt[0].x = pt[1].x = nX;
	pt[0].y = nY;
	pt[1].y = pt[0].y + 1;

	hpen = ::CreatePen( PS_SOLID, 1, clrArrow );
	HGDIOBJ hpenOld = ::SelectObject( hDC, hpen );

	switch( nDirection )
	{
		case DIR_RIGHT:
			for ( int i=0; i<nSize; i++ )
			{
				Polyline( hDC, pt, 2 );

				pt[0].x--;
				pt[0].y--;
				pt[1].x--;
				pt[1].y++;
			}
			break;
	}

	::SelectObject( hDC, hpenOld );
	::DeleteObject( hpen );
}

void WINAPI DrawRoundRect(HDC hDC, COLORREF clrBorder, COLORREF clrBkgnd, const RECT &rect, int nWidth, int nHeight)
{
	DrawRoundRect( hDC, clrBorder, clrBkgnd, rect.left, rect.top, rect.right, rect.bottom, nWidth, nHeight );
}

void WINAPI DrawRoundRect(HDC hDC, COLORREF clrBorder, COLORREF clrBkgnd, int nLeft, int nTop, int nRight, int nBottom, int nWidth, int nHeight)
{
	HPEN	 hpen;
	HBRUSH	 hbr;
	HGDIOBJ	 hpenOld, hbrOld;

	hpen = ::CreatePen( PS_SOLID, 1, clrBorder );
	hbr  = ::CreateSolidBrush( clrBkgnd );

	hpenOld = ::SelectObject( hDC, hpen );
	hbrOld  = ::SelectObject( hDC, hbr );
	// Draw rectangle item	
	::RoundRect( hDC, nLeft, nTop, nRight, nBottom, nWidth, nHeight );

	::SelectObject( hDC, hpenOld );
	::SelectObject( hDC, hbrOld );

	::DeleteObject( hpen );
	::DeleteObject( hbr );
}

void WINAPI DrawPartionRgn(HDC hDC, COLORREF clrLeftTop, COLORREF clrRightBottom, BOOL bVerticalLine, int nOffset, HRGN hRgn)
{
	RECT rect;

	::GetRgnBox( hRgn, &rect );

	HRGN hRgnFill = ::CreateRectRgn( 0, 0, 0, 0 );
	HRGN hRgnTemp = ::CreateRectRgn( rect.left, rect.top, rect.right, rect.bottom );

	if ( bVerticalLine )
		 ::OffsetRgn( hRgnTemp, nOffset, 0 );
	else ::OffsetRgn( hRgnTemp, 0, nOffset );

	::CombineRgn( hRgnFill, hRgn, hRgnTemp, RGN_DIFF );
	::DrawRgn( hDC, clrLeftTop, hRgnFill );

	::CombineRgn( hRgnFill, hRgn, hRgnTemp, RGN_AND );
	::DrawRgn( hDC, clrRightBottom, hRgnFill );

	::DeleteObject( hRgnFill );
	::DeleteObject( hRgnTemp );
}

void WINAPI DrawRgn(HDC hDC, COLORREF clrBorder, COLORREF clrBkgnd, HRGN hRgn)
{
	HBRUSH hbrBk = ::CreateSolidBrush( clrBkgnd );
	HBRUSH hbrBo = ::CreateSolidBrush( clrBorder );

	::FillRgn ( hDC, hRgn, hbrBk );
	::FrameRgn( hDC, hRgn, hbrBo, 1, 1 );

	::DeleteObject( hbrBk );	
	::DeleteObject( hbrBo );	
}

void WINAPI DrawRgn(HDC hDC, COLORREF clrBkgnd, HRGN hRgn)
{
	HBRUSH hbr = ::CreateSolidBrush( clrBkgnd );
	::FillRgn( hDC, hRgn, hbr );
	::DeleteObject( hbr );	
}

void WINAPI DrawFrameRgn( HDC hDC, HRGN hRgn, COLORREF clrEdge, int nWidth, int nHeight )
{
	HBRUSH hbr = ::CreateSolidBrush( clrEdge );
	::FrameRgn( hDC, hRgn, hbr, nWidth, nHeight );
	::DeleteObject( hbr );	
}

void WINAPI DrawEllipse(HDC hDC, COLORREF clrBorder, COLORREF clrBkgnd, int nLeft, int nTop, int nRight, int nBottom)
{
	HPEN	 hpen;
	HBRUSH	 hbr;
	HGDIOBJ	 hpenOld, hbrOld;

	hpen = ::CreatePen( PS_SOLID, 1, clrBorder );
	hbr  = ::CreateSolidBrush( clrBkgnd );

	hbrOld  = ::SelectObject( hDC, hbr );
	hpenOld = ::SelectObject( hDC, hpen );

	::Ellipse( hDC, nLeft, nTop, nLeft + 6, nTop + 6 );

	::SelectObject( hDC, hbrOld );
	::SelectObject( hDC, hpenOld );

	::DeleteObject( hpen );
	::DeleteObject( hbr );
}

void WINAPI DrawPolyline(HDC hDC, COLORREF clrLine, POINT *pt, int nSize)
{
	HPEN hpen = ::CreatePen( PS_SOLID, 1, clrLine );
	HGDIOBJ	hpenOld = ::SelectObject( hDC, hpen );

	::Polyline( hDC, pt, nSize );

	::SelectObject( hDC, hpenOld );
	::DeleteObject( hpen );
}

void WINAPI DrawTranBmp(HDC hDC, int nX, int nY, HBITMAP hBmp, int nWidth, int nHeight, COLORREF clrTran)
{
	HDC			hdcMem, hdcMsk;
	HBITMAP		hbmpMsk;
	HGDIOBJ		hbmpOld, hbmpMskOld;

	hdcMem = ::CreateCompatibleDC( hDC );
	hdcMsk = ::CreateCompatibleDC( hDC );

	hbmpOld = ::SelectObject( hdcMem, hBmp );

	hbmpMsk = ::CreateBitmap( nWidth, nHeight, 1, 1, NULL );
	hbmpMskOld = ::SelectObject( hdcMsk, hbmpMsk );

	COLORREF clrBkOld = ::SetBkColor( hdcMem, clrTran );
	::BitBlt( hdcMsk, 0, 0, nWidth, nHeight, hdcMem, 0, 0, SRCCOPY );
	::SetBkColor( hdcMem, clrBkOld );

	::BitBlt( hDC, nX, nY, nWidth, nHeight, hdcMem, 0, 0, SRCINVERT );
	::BitBlt( hDC, nX, nY, nWidth, nHeight, hdcMsk, 0, 0, SRCAND );
	::BitBlt( hDC, nX, nY, nWidth, nHeight, hdcMem, 0, 0, SRCINVERT );

	::SelectObject( hdcMsk, hbmpMskOld );
	::SelectObject( hdcMem, hbmpOld );
	::DeleteObject( hbmpMsk );
	::DeleteDC( hdcMem );
	::DeleteDC( hdcMsk );
}

void WINAPI DrawTranBmp(HDC hDC, int nX, int nY, UINT uID, COLORREF clrTran)
{
	HDC			hdcMem, hdcTemp;
	HBITMAP		hbmp, hbmpMask;
	HGDIOBJ		hbmpOld, hbmpMaskOld;
	BITMAP		bmpInfo;

	hdcMem  = ::CreateCompatibleDC( hDC );
	hdcTemp = ::CreateCompatibleDC( hDC );

	hbmp = ::LoadBitmap( AfxFindResourceHandle( MAKEINTRESOURCE( uID ), RT_BITMAP ), MAKEINTRESOURCE( uID ) );
	::GetObject( hbmp, sizeof(BITMAP), &bmpInfo );

	int nWidth  = bmpInfo.bmWidth;
	int nHeight = bmpInfo.bmHeight;

	hbmpOld = ::SelectObject( hdcMem, hbmp );

	hbmpMask = ::CreateBitmap( nWidth, nHeight, 1, 1, NULL );
	hbmpMaskOld = ::SelectObject( hdcTemp, hbmpMask );

	COLORREF clrBkOld = ::SetBkColor( hdcMem, clrTran );
	::BitBlt( hdcTemp, 0, 0, nWidth, nHeight, hdcMem, 0, 0, SRCCOPY );
	::SetBkColor( hdcMem, clrBkOld );

	::BitBlt( hDC, nX, nY, nWidth, nHeight, hdcMem,  0, 0, SRCINVERT );
	::BitBlt( hDC, nX, nY, nWidth, nHeight, hdcTemp, 0, 0, SRCAND );
	::BitBlt( hDC, nX, nY, nWidth, nHeight, hdcMem,  0, 0, SRCINVERT );

	::SelectObject( hdcMem, hbmpOld );
	::SelectObject( hdcTemp, hbmpMaskOld );
	::DeleteObject( hbmpMask );
	::DeleteDC( hdcMem );
	::DeleteDC( hdcTemp );
}

// Note : Initialize parameter "hrgn" by CreateRectRgn(0,0,0,0) first !
//		  Remember to DeleteObject( hrgn ) !
void WINAPI RgnFromBmp(HRGN hrgn, HDC hDC, UINT uID, COLORREF clrTran)
{
	HBITMAP	hbmp;
	HGDIOBJ	hbmpOld;
	HDC		hdcMem;
	BITMAP	bmpInfo;
	HRGN	hrgnBmp, hrgnTemp;
	
	hbmp = ::LoadBitmap( AfxFindResourceHandle( MAKEINTRESOURCE( uID ), RT_BITMAP ), 
						 MAKEINTRESOURCE( uID ) ); 

	hdcMem  = ::CreateCompatibleDC( hDC );
	hbmpOld = ::SelectObject( hdcMem, hbmp );

	::GetObject( hbmp, sizeof(BITMAP), &bmpInfo );
	int nWidth  = bmpInfo.bmWidth;
	int nHeight = bmpInfo.bmHeight;

	hrgnBmp = ::CreateRectRgn( 0, 0, nWidth, nHeight );

	for ( int nX=0; nX<nWidth; nX++ )
		for ( int nY=0; nY<nHeight; nY++ )
			if ( GetPixel( hdcMem, nX, nY ) == clrTran )
			{
				hrgnTemp = ::CreateRectRgn( nX, nY, nX+1, nY+1 );
				::CombineRgn( hrgnBmp, hrgnBmp, hrgnTemp, RGN_DIFF );
				::DeleteObject( hrgnTemp );
			}

	::CombineRgn( hrgn, hrgnBmp, 0, RGN_COPY );	

	::SelectObject( hdcMem, hbmpOld );
	::DeleteObject( hrgnBmp );
	::DeleteObject( hrgnTemp );
	::DeleteObject( hbmp );
	::DeleteDC( hdcMem );
}

void WINAPI DrawRect(HDC hDC, COLORREF clrFill, int nLeft, int nTop, int nRight, int nBottom)
{
	RECT	rect;

	rect.left	= nLeft;
	rect.top	= nTop;
	rect.right  = nRight;
	rect.bottom = nBottom;

	HBRUSH	br	= ::CreateSolidBrush( clrFill );
	::FillRect( hDC, &rect, br );
	::DeleteObject( br );
}

void WINAPI CreateRoundRectRgn( HRGN hRgn, const RECT &rect, int nWidth, int nHeight, BOOL bLeftTopR, BOOL bLeftBottomR, BOOL bRightTopR, BOOL bRightBottomR)
{
	int nXCenter = (rect.left+rect.right)/2;
	int nYCenter = (rect.top+rect.bottom)/2;

	HRGN hRect  = ::CreateRectRgn( rect.left, rect.top, nXCenter, nYCenter );
	HRGN hRound = ::CreateRoundRectRgn( rect.left, rect.top, rect.right+1, rect.bottom+1, nWidth, nHeight );

	if ( !bLeftTopR )
	{
		::CombineRgn( hRound, hRound, hRect, RGN_OR );
	}

	if ( !bLeftBottomR )
	{
		::SetRectRgn( hRect, rect.left, nYCenter, nXCenter, rect.bottom );
		::CombineRgn( hRound, hRound, hRect, RGN_OR );
	}

	if ( !bRightTopR )
	{
		::SetRectRgn( hRect, nXCenter, rect.top, rect.right, nYCenter );
		::CombineRgn( hRound, hRound, hRect, RGN_OR );
	}

	if ( !bRightBottomR )
	{
		::SetRectRgn( hRect, nXCenter, nYCenter, rect.right, rect.bottom );
		::CombineRgn( hRound, hRound, hRect, RGN_OR );
	}

	::CombineRgn( hRgn, hRound, 0, RGN_COPY );

	::DeleteObject( hRect );
	::DeleteObject( hRound );
}



void WINAPI GetBitmapRgn(HRGN hrgn, HDC hDC, UINT uID, COLORREF clrTran)
{
	HBITMAP	hbmp;
	HGDIOBJ	hbmpOld;
	HDC		hdcMem;
	BITMAP	bmpInfo;
	HRGN	hrgnBmp, hrgnTemp;
	
	hbmp = ::LoadBitmap( AfxFindResourceHandle( MAKEINTRESOURCE( uID ), RT_BITMAP ), 
					     MAKEINTRESOURCE( uID ) ); 

	hdcMem  = ::CreateCompatibleDC( hDC );
	hbmpOld = ::SelectObject( hdcMem, hbmp );

	::GetObject( hbmp, sizeof(BITMAP), &bmpInfo );
	int nWidth  = bmpInfo.bmWidth;
	int nHeight = bmpInfo.bmHeight;

	hrgnBmp = ::CreateRectRgn( 0, 0, nWidth, nHeight );

	for ( int nX=0; nX<nWidth; nX++ )
		for ( int nY=0; nY<nHeight; nY++ )
			if ( GetPixel( hdcMem, nX, nY ) == clrTran )
			{
				hrgnTemp = ::CreateRectRgn( nX, nY, nX+1, nY+1 );
				::CombineRgn( hrgnBmp, hrgnBmp, hrgnTemp, RGN_DIFF );
				::DeleteObject( hrgnTemp );
			}

	::CombineRgn( hrgn, hrgnBmp, 0, RGN_COPY );	

	::SelectObject( hdcMem, hbmpOld );
	::DeleteObject( hrgnBmp );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -