📄 ppdrawmanager.cpp
字号:
FillGradient(hDC, &rect, clrBegin, clrEnd, TRUE);
rect.left = rect.right;
rect.right = lpRect->right;
FillGradient(hDC, &rect, clrEnd, clrBegin, TRUE);
break;
case EFFECT_3HGRADIENT:
rect.right = rect.left + nWidth / 2;
FillGradient(hDC, &rect, clrBegin, clrMid, TRUE);
rect.left = rect.right;
rect.right = lpRect->right;
FillGradient(hDC, &rect, clrMid, clrEnd, TRUE);
break;
case EFFECT_VCGRADIENT:
rect.bottom = rect.top + nHeight / 2;
FillGradient(hDC, &rect, clrBegin, clrEnd, FALSE);
rect.top = rect.bottom;
rect.bottom = lpRect->bottom;
FillGradient(hDC, &rect, clrEnd, clrBegin, FALSE);
break;
case EFFECT_3VGRADIENT:
rect.bottom = rect.top + nHeight / 2;
FillGradient(hDC, &rect, clrBegin, clrMid, FALSE);
rect.top = rect.bottom;
rect.bottom = lpRect->bottom;
FillGradient(hDC, &rect, clrMid, clrEnd, FALSE);
break;
#ifdef USE_SHADE
case EFFECT_NOISE:
case EFFECT_DIAGSHADE:
case EFFECT_HSHADE:
case EFFECT_VSHADE:
case EFFECT_HBUMP:
case EFFECT_VBUMP:
case EFFECT_SOFTBUMP:
case EFFECT_HARDBUMP:
case EFFECT_METAL:
rect.left = 0;
rect.top = 0;
rect.right = nWidth;
rect.bottom = nHeight;
SetShade(&rect, dwEffect, granularity, coloring, clrBegin, clrMid, clrEnd);
m_dNormal.Draw(hDC, lpRect->left, lpRect->top);
break;
#endif
} //switch
if (NULL != hBrush)
{
::DeleteObject(hBrush);
hBrush = NULL;
} //if
} //End FillEffect
void CPPDrawManager::MultipleCopy(HDC hDestDC, int nDestX, int nDestY, DWORD dwDestWidth, DWORD dwDestHeight,
HDC hSrcDC, int nSrcX, int nSrcY, DWORD dwSrcWidth, DWORD dwSrcHeight)
{
// Horizontal copying
int right, bottom;
int nDestRight = (int)(nDestX + dwDestWidth);
int nDestBottom = (int)(nDestY + dwDestHeight);
for (int x = nDestX; x < nDestRight; x+= dwSrcWidth)
{
right = min (x + (int)dwSrcWidth, nDestRight);
// Vertical copying
for (int y = nDestY; y < nDestBottom; y+= dwSrcHeight)
{
bottom = min (y + (int)dwSrcHeight, nDestBottom);
::BitBlt(hDestDC, x, y, right - x, bottom - y, hSrcDC, nSrcX, nSrcY, SRCCOPY);
} //for
} //for
} //End MultipleCopy
void CPPDrawManager::DrawBitmap(HDC hDC, int x, int y, DWORD dwWidth, DWORD dwHeight, HBITMAP hSrcBitmap,
BOOL bUseMask, COLORREF crMask,
DWORD dwEffect /* = IMAGE_EFFECT_NONE */,
BOOL bShadow /* = FALSE */,
DWORD dwCxShadow /* = PPDRAWMANAGER_SHADOW_XOFFSET */,
DWORD dwCyShadow /* = PPDRAWMANAGER_SHADOW_YOFFSET */,
DWORD dwCxDepth /* = PPDRAWMANAGER_SHADOW_XDEPTH */,
DWORD dwCyDepth /* = PPDRAWMANAGER_SHADOW_YDEPTH */,
COLORREF clrShadow /* = PPDRAWMANAGER_SHADOW_COLOR */)
{
m_bIsAlpha = FALSE;
if (NULL == hSrcBitmap)
return;
SIZE sz;
GetSizeOfBitmap(hSrcBitmap, &sz);
HDC hSrcDC = ::CreateCompatibleDC(hDC);
HDC hDestDC = ::CreateCompatibleDC(hDC);
HBITMAP hBitmapTemp = ::CreateCompatibleBitmap(hDC, dwWidth, dwHeight);
HBITMAP hOldSrcBitmap = (HBITMAP)::SelectObject(hSrcDC, hSrcBitmap);
HBITMAP hOldDestBitmap = (HBITMAP)::SelectObject(hDestDC, hBitmapTemp);
//Scales a bitmap if need
if (((DWORD)sz.cx != dwWidth) || ((DWORD)sz.cy != dwHeight))
::StretchBlt(hDestDC, 0, 0, dwWidth, dwHeight, hSrcDC, 0, 0, sz.cx, sz.cy, SRCCOPY);
else
::BitBlt(hDestDC, 0, 0, dwWidth, dwHeight, hSrcDC, 0, 0, SRCCOPY);
::SelectObject(hDestDC, hOldDestBitmap);
HBITMAP hMaskBmp = CreateImageEffect(hBitmapTemp, dwWidth, dwHeight, IMAGE_EFFECT_MASK, bUseMask, crMask);
HBITMAP hBitmap = CreateImageEffect(hBitmapTemp, dwWidth, dwHeight, dwEffect, bUseMask, crMask, clrShadow);
if (bShadow)
{
if (dwEffect & IMAGE_EFFECT_SHADOW)
{
POINT ptShadow;
ptShadow.x = x + dwCxShadow;
ptShadow.y = y + dwCyShadow;
HBITMAP hShadowBmp = CreateImageEffect(hBitmapTemp, dwWidth, dwHeight, IMAGE_EFFECT_MASK, bUseMask, crMask, InvertColor(clrShadow));
DrawShadow(hDC, ptShadow.x, ptShadow.y, dwWidth, dwHeight, hShadowBmp, dwEffect & IMAGE_EFFECT_GRADIENT_SHADOW, dwCxDepth, dwCyDepth);
::DeleteObject(hShadowBmp);
}
else
{
x += dwCxShadow;
y += dwCyShadow;
} //if
} //if
if (m_bIsAlpha)
{
::SelectObject(hSrcDC, hBitmap);
AlphaChannelBitBlt(hDC, x, y, dwWidth, dwHeight, hSrcDC, 0, 0);
}
else
{
//Merge the image mask with background
::SelectObject(hSrcDC, hMaskBmp);
::BitBlt(hDC, x, y, dwWidth, dwHeight, hSrcDC, 0, 0, SRCAND);
//Draw the image
::SelectObject(hSrcDC, hBitmap);
::BitBlt(hDC, x, y, dwWidth, dwHeight, hSrcDC, 0, 0, SRCPAINT);
}
::SelectObject(hSrcDC, hOldSrcBitmap);
::DeleteDC(hDestDC);
::DeleteDC(hSrcDC);
::DeleteObject(hBitmap);
::DeleteObject(hMaskBmp);
::DeleteObject(hBitmapTemp);
} //End DrawBitmap
void CPPDrawManager::DrawIcon(HDC hDC, int x, int y, DWORD dwWidth, DWORD dwHeight, HICON hSrcIcon,
DWORD dwEffect /* = IMAGE_EFFECT_NONE */,
BOOL bShadow /* = FALSE */,
DWORD dwCxShadow /* = PPDRAWMANAGER_SHADOW_XOFFSET */,
DWORD dwCyShadow /* = PPDRAWMANAGER_SHADOW_YOFFSET */,
DWORD dwCxDepth /* = PPDRAWMANAGER_SHADOW_XDEPTH */,
DWORD dwCyDepth /* = PPDRAWMANAGER_SHADOW_YDEPTH */,
COLORREF clrShadow /* = PPDRAWMANAGER_SHADOW_COLOR */)
{
m_bIsAlpha = FALSE;
if (NULL == hSrcIcon)
return;
SIZE sz;
GetSizeOfIcon(hSrcIcon, &sz);
HICON hIcon = NULL;
if (((DWORD)sz.cx == dwWidth) && ((DWORD)sz.cy == dwHeight))
hIcon = ::CopyIcon(hSrcIcon);
else hIcon = StretchIcon(hSrcIcon, dwWidth, dwHeight);
ICONINFO csOriginal;
if (!::GetIconInfo(hIcon, &csOriginal))
return;
HDC hSrcDC = ::CreateCompatibleDC(hDC);
HBITMAP hBitmap;
if (dwEffect & IMAGE_EFFECT_MONOCHROME)
hBitmap = CreateImageEffect(csOriginal.hbmMask, dwWidth, dwHeight, dwEffect, TRUE, RGB(255, 255, 255), clrShadow);
else
hBitmap = CreateImageEffect(csOriginal.hbmColor, dwWidth, dwHeight, dwEffect, TRUE, RGB(0, 0, 0), clrShadow);
HBITMAP hOldSrcBitmap = (HBITMAP)::SelectObject(hSrcDC, hBitmap);
if (bShadow)
{
if (dwEffect & IMAGE_EFFECT_SHADOW)
{
POINT ptShadow;
ptShadow.x = x + dwCxShadow;
ptShadow.y = y + dwCyShadow;
HBITMAP hShadowBmp = CreateImageEffect(csOriginal.hbmMask, dwWidth, dwHeight, IMAGE_EFFECT_MASK, TRUE, RGB(255, 255, 255), InvertColor(clrShadow));
DrawShadow(hDC, ptShadow.x, ptShadow.y, dwWidth, dwHeight, hShadowBmp, dwEffect & IMAGE_EFFECT_GRADIENT_SHADOW, dwCxDepth, dwCyDepth);
::DeleteObject(hShadowBmp);
}
else
{
x += dwCxShadow;
y += dwCyShadow;
} //if
} //if
if (m_bIsAlpha)
{
// ::SelectObject(hSrcDC, hBitmap);
AlphaChannelBitBlt(hDC, x, y, dwWidth, dwHeight, hSrcDC, 0, 0);
}
else
{
//-------------------------------------------------------------------
// !!! ATTENTION !!!
// I don't know why a icon uses text's color
// Therefore I change a text's color to BLACK and after draw I restore
// original color
//-------------------------------------------------------------------
COLORREF crOldColor = ::SetTextColor(hDC, RGB(0, 0, 0));
//Merge the image mask with background
::SelectObject(hSrcDC, csOriginal.hbmMask);
::BitBlt(hDC, x, y, dwWidth, dwHeight, hSrcDC, 0, 0, SRCAND);
//Draw the image
::SelectObject(hSrcDC, hBitmap);
::BitBlt(hDC, x, y, dwWidth, dwHeight, hSrcDC, 0, 0, SRCPAINT);
::SetTextColor(hDC, crOldColor);
} //if
::SelectObject(hSrcDC, hOldSrcBitmap);
::DeleteDC(hSrcDC);
::DeleteObject(hBitmap);
::DestroyIcon(hIcon);
::DeleteObject(csOriginal.hbmColor);
::DeleteObject(csOriginal.hbmMask);
} //End DrawIcon
void CPPDrawManager::DrawShadow(HDC hDestDC, int nDestX, int nDestY, DWORD dwWidth, DWORD dwHeight, HBITMAP hMask, BOOL bGradient /* = FALSE */, DWORD dwDepthX /* = PPDRAWMANAGER_SHADOW_YOFFSET */, DWORD dwDepthY /* = PPDRAWMANAGER_SHADOW_XOFFSET */)
{
HDC hSrcDC = ::CreateCompatibleDC(hDestDC);
if (NULL == hSrcDC)
return;
HDC hTempDC = ::CreateCompatibleDC(hDestDC);
if (NULL == hTempDC)
{
::DeleteDC(hSrcDC);
return;
} // if
//Creates Source DIB
LPBITMAPINFO lpbiSrc;
// Fill in the BITMAPINFOHEADER
lpbiSrc = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
lpbiSrc->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbiSrc->bmiHeader.biWidth = dwWidth;
lpbiSrc->bmiHeader.biHeight = dwHeight;
lpbiSrc->bmiHeader.biPlanes = 1;
lpbiSrc->bmiHeader.biBitCount = 32;
lpbiSrc->bmiHeader.biCompression = BI_RGB;
lpbiSrc->bmiHeader.biSizeImage = dwWidth * dwHeight;
lpbiSrc->bmiHeader.biXPelsPerMeter = 0;
lpbiSrc->bmiHeader.biYPelsPerMeter = 0;
lpbiSrc->bmiHeader.biClrUsed = 0;
lpbiSrc->bmiHeader.biClrImportant = 0;
COLORREF* pSrcBits = NULL;
HBITMAP hSrcDib = CreateDIBSection (
hSrcDC, lpbiSrc, DIB_RGB_COLORS, (void **)&pSrcBits,
NULL, NULL);
if ((NULL != hSrcDib) && (NULL != pSrcBits))
{
HBITMAP hOldSrcBmp = (HBITMAP)::SelectObject (hSrcDC, hSrcDib);
HBITMAP hOldTempBmp = (HBITMAP)::SelectObject (hTempDC, hMask);
if (bGradient)
{
if (!(dwDepthX & 0x1)) dwDepthX++;
if (!(dwDepthY & 0x1)) dwDepthY++;
::BitBlt(hSrcDC, 0, 0, dwWidth, dwHeight, hTempDC, 0, 0, WHITENESS);
::StretchBlt (hSrcDC, dwDepthX / 2, dwDepthY / 2, dwWidth - dwDepthX, dwHeight - dwDepthY, hTempDC, 0, 0, dwWidth, dwHeight, SRCCOPY);
}
else
{
::BitBlt(hSrcDC, 0, 0, dwWidth, dwHeight, hTempDC, 0, 0, SRCCOPY);
} //if
::SelectObject (hTempDC, hOldTempBmp);
::SelectObject (hSrcDC, hOldSrcBmp);
//Creates Destination DIB
LPBITMAPINFO lpbiDest;
// Fill in the BITMAPINFOHEADER
lpbiDest = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER)];
lpbiDest->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbiDest->bmiHeader.biWidth = dwWidth;
lpbiDest->bmiHeader.biHeight = dwHeight;
lpbiDest->bmiHeader.biPlanes = 1;
lpbiDest->bmiHeader.biBitCount = 32;
lpbiDest->bmiHeader.biCompression = BI_RGB;
lpbiDest->bmiHeader.biSizeImage = dwWidth * dwHeight;
lpbiDest->bmiHeader.biXPelsPerMeter = 0;
lpbiDest->bmiHeader.biYPelsPerMeter = 0;
lpbiDest->bmiHeader.biClrUsed = 0;
lpbiDest->bmiHeader.biClrImportant = 0;
COLORREF* pDestBits = NULL;
HBITMAP hDestDib = CreateDIBSection (
hDestDC, lpbiDest, DIB_RGB_COLORS, (void **)&pDestBits,
NULL, NULL);
if ((NULL != hDestDib) && (NULL != pDestBits))
{
::SelectObject (hTempDC, hDestDib);
::BitBlt (hTempDC, 0, 0, dwWidth, dwHeight, hDestDC, nDestX, nDestY, SRCCOPY);
::SelectObject (hTempDC, hOldTempBmp);
if (bGradient)
{
double * depth = new double [dwWidth * dwHeight];
SmoothMaskImage(dwWidth, dwHeight, pSrcBits, dwDepthX, dwDepthY, depth);
for(DWORD pixel = 0; pixel < dwWidth * dwHeight; pixel++, pDestBits++)
*pDestBits = DarkenColor(*pDestBits, *(depth + pixel));
delete [] depth;
}
else
{
for(DWORD pixel = 0; pixel < dwWidth * dwHeight; pixel++, pSrcBits++, pDestBits++)
*pDestBits = DarkenColor(*pDestBits, (double)GetRValue(*pSrcBits) / 255.0);
} //if
::SelectObject (hTempDC, hDestDib);
::BitBlt (hDestDC, nDestX, nDestY, dwWidth, dwHeight, hTempDC, 0, 0, SRCCOPY);
::SelectObject (hTempDC, hOldTempBmp);
delete lpbiDest;
::DeleteObject(hDestDib);
} //if
delete lpbiSrc;
::DeleteObject(hSrcDib);
} //if
::DeleteDC(hTempDC);
::DeleteDC(hSrcDC);
} //End DrawIcon
void CPPDrawManager::DrawImageList(HDC hDC, int x, int y, DWORD dwWidth, DWORD dwHeight, HBITMAP hSrcBitmap,
int nIndex, int cx, int cy,
BOOL bUseMask, COLORREF crMask,
DWORD dwEffect /*= IMAGE_EFFECT_NONE*/,
BOOL bShadow /*= FALSE*/,
DWORD dwCxShadow /*= PPDRAWMANAGER_SHADOW_XOFFSET*/,
DWORD dwCyShadow /*= PPDRAWMANAGER_SHADOW_YOFFSET*/,
DWORD dwCxDepth /*= PPDRAWMANAGER_SHADOW_XDEPTH*/,
DWORD dwCyDepth /*= PPDRAWMANAGER_SHADOW_YDEPTH*/,
COLORREF clrShadow /*= PPDRAWMANAGER_SHADOW_COLOR*/)
{
if ((NULL == hSrcBitmap) || !cx || !cy)
return;
SIZE sz;
GetSizeOfBitmap(hSrcBitmap, &sz);
//ENG: Gets a max columns and rows of the images on the bitmap
//RUS: 项塍鬣屐 爨犟桁嚯
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -