📄 hsgraphics.cpp
字号:
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 + -