📄 czipbitmap.cpp
字号:
// ZipBitmap.cpp : implementation file
//
#include "stdafx.h"
#include "CZipBitmap.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
COLORREF rgbWhite = RGB(255,255,255);
/////////////////////////////////////////////////////////////////////////////
// CZipBitmap
CZipBitmap::CZipBitmap()
{
m_iWidth = 0;
m_iHeight = 0;
m_hbmMask = NULL;
m_hBitmap = NULL;
}
CZipBitmap::~CZipBitmap()
{
if( m_hBitmap )
DeleteObject( m_hBitmap );
}
void CZipBitmap::GetMetrics()
{
// Get the width and height.
BITMAP bm;
::GetObject(m_hBitmap,sizeof(bm), &bm);
m_iWidth = bm.bmWidth;
m_iHeight = bm.bmHeight;
}
int CZipBitmap::GetWidth()
{
if ((m_iWidth == 0) || (m_iHeight == 0)){
GetMetrics();
}
return m_iWidth;
}
int CZipBitmap::GetHeight()
{
if ((m_iWidth == 0) || (m_iHeight == 0)){
GetMetrics();
}
return m_iHeight;
}
void CZipBitmap::Draw(HDC hDC, int x, int y)
{
ASSERT(hDC);
// Create a memory DC.
HDC hdcMem = ::CreateCompatibleDC(hDC);
// Select the bitmap into the mem DC.
HBITMAP hbmold =
(HBITMAP)::SelectObject(hdcMem,
(HBITMAP)(m_hBitmap));
// Blt the bits.
::BitBlt(hDC,
x, y,
GetWidth(), GetHeight(),
hdcMem,
0, 0,
SRCCOPY);
::SelectObject(hdcMem, hbmold);
::DeleteDC(hdcMem);
}
void CZipBitmap::Draw(HDC hDC, int x, int y, int width, int height )
{
ASSERT(hDC);
// Create a memory DC.
HDC hdcMem = ::CreateCompatibleDC(hDC);
// Select the bitmap into the mem DC.
HBITMAP hbmold =
(HBITMAP)::SelectObject(hdcMem,
(HBITMAP)(m_hBitmap));
// Blt the bits.
::StretchBlt(hDC,
x, y,
width, height,
hdcMem,
0, 0,GetWidth(),GetHeight(),
SRCCOPY);
/* ::BitBlt(hDC,
x, y,
width, height,
hdcMem,
0, 0,
SRCCOPY);*/
::SelectObject(hdcMem, hbmold);
::DeleteDC(hdcMem);
}
void CZipBitmap::CreateMask(HDC hDC)
{
// Nuke any existing mask.
if (m_hbmMask) {
::DeleteObject(m_hbmMask);
}
// Create memory DCs to work with.
HDC hdcMask = ::CreateCompatibleDC(hDC);
HDC hdcImage = ::CreateCompatibleDC(hDC);
// Create a monochrome bitmap for the mask.
m_hbmMask = ::CreateBitmap(GetWidth(),
GetHeight(),
1,
1,
NULL);
// Select the mono bitmap into its DC.
HBITMAP hbmOldMask = (HBITMAP)::SelectObject(hdcMask, m_hbmMask);
// Select the image bitmap into its DC.
HBITMAP hbmOldImage = (HBITMAP)::SelectObject(hdcImage, m_hBitmap);
// Set the transparency color to be the top-left pixel.
::SetBkColor(hdcImage, ::GetPixel(hdcImage, 0, 0));
// Make the mask.
::BitBlt(hdcMask,
0, 0,
GetWidth(), GetHeight(),
hdcImage,
0, 0,
SRCCOPY);
// Tidy up.
::SelectObject(hdcMask, hbmOldMask);
::SelectObject(hdcImage, hbmOldImage);
::DeleteDC(hdcMask);
::DeleteDC(hdcImage);
}
void CZipBitmap::DrawTrans(HDC hDC, int x, int y)
{
ASSERT(hDC);
if (!m_hbmMask) CreateMask(hDC);
ASSERT(m_hbmMask);
int dx = GetWidth();
int dy = GetHeight();
// Create a memory DC to which to draw.
HDC hdcOffScr = ::CreateCompatibleDC(hDC);
// Create a bitmap for the off-screen DC that is really
// color-compatible with the destination DC.
HBITMAP hbmOffScr = ::CreateBitmap(dx, dy,
(BYTE)GetDeviceCaps(hDC, PLANES),
(BYTE)GetDeviceCaps(hDC, BITSPIXEL),
NULL);
// Select the buffer bitmap into the off-screen DC.
HBITMAP hbmOldOffScr = (HBITMAP)::SelectObject(hdcOffScr, hbmOffScr);
// Copy the image of the destination rectangle to the
// off-screen buffer DC, so we can play with it.
::BitBlt(hdcOffScr, 0, 0, dx, dy, hDC, x, y, SRCCOPY);
// Create a memory DC for the source image.
HDC hdcImage = ::CreateCompatibleDC(hDC);
HBITMAP hbmOldImage = (HBITMAP)::SelectObject(hdcImage, m_hBitmap);
// Create a memory DC for the mask.
HDC hdcMask = ::CreateCompatibleDC(hDC);
HBITMAP hbmOldMask = (HBITMAP)::SelectObject(hdcMask, m_hbmMask);
DWORD DSx = SRCINVERT,DSa = SRCAND;
// XOR the image with the destination.
::SetBkColor(hdcOffScr,rgbWhite);
::BitBlt(hdcOffScr, 0, 0, dx, dy ,hdcImage, 0, 0, DSx);
// AND the destination with the mask.
::BitBlt(hdcOffScr, 0, 0, dx, dy, hdcMask, 0,0, DSa);
// XOR the destination with the image again.
::BitBlt(hdcOffScr, 0, 0, dx, dy, hdcImage, 0, 0, DSx);
// Copy the resultant image back to the screen DC.
::BitBlt(hDC, x, y, dx, dy, hdcOffScr, 0, 0, SRCCOPY);
// Tidy up.
::SelectObject(hdcOffScr, hbmOldOffScr);
::SelectObject(hdcImage, hbmOldImage);
::SelectObject(hdcMask, hbmOldMask);
::DeleteObject(hbmOffScr);
::DeleteDC(hdcOffScr);
::DeleteDC(hdcImage);
::DeleteDC(hdcMask);
}
/////////////////////////////////////////////////////////////////////////////
// CZipBitmap message handlers
void CZipBitmap::DrawTrans(HDC hDC, int x, int y, COLORREF colTrans)
{
ASSERT(hDC);
if (!m_hbmMask) CreateMask(hDC,colTrans);
ASSERT(m_hbmMask);
int dx = GetWidth();
int dy = GetHeight();
// Create a memory DC to which to draw.
HDC hdcOffScr = ::CreateCompatibleDC(hDC);
// Create a bitmap for the off-screen DC that is really
// color-compatible with the destination DC.
HBITMAP hbmOffScr = ::CreateBitmap(dx, dy,
(BYTE)GetDeviceCaps(hDC, PLANES),
(BYTE)GetDeviceCaps(hDC, BITSPIXEL),
NULL);
// Select the buffer bitmap into the off-screen DC.
HBITMAP hbmOldOffScr = (HBITMAP)::SelectObject(hdcOffScr, hbmOffScr);
// Copy the image of the destination rectangle to the
// off-screen buffer DC, so we can play with it.
::BitBlt(hdcOffScr, 0, 0, dx, dy, hDC, x, y, SRCCOPY);
// Create a memory DC for the source image.
HDC hdcImage = ::CreateCompatibleDC(hDC);
HBITMAP hbmOldImage = (HBITMAP)::SelectObject(hdcImage, m_hBitmap);
// Create a memory DC for the mask.
HDC hdcMask = ::CreateCompatibleDC(hDC);
HBITMAP hbmOldMask = (HBITMAP)::SelectObject(hdcMask, m_hbmMask);
DWORD DSx = SRCINVERT,DSa = SRCAND;
// XOR the image with the destination.
::SetBkColor(hdcOffScr,rgbWhite);
::BitBlt(hdcOffScr, 0, 0, dx, dy ,hdcImage, 0, 0, DSx);
// AND the destination with the mask.
::BitBlt(hdcOffScr, 0, 0, dx, dy, hdcMask, 0,0, DSa);
// XOR the destination with the image again.
::BitBlt(hdcOffScr, 0, 0, dx, dy, hdcImage, 0, 0, DSx);
// Copy the resultant image back to the screen DC.
::BitBlt(hDC, x, y, dx, dy, hdcOffScr, 0, 0, SRCCOPY);
// Tidy up.
::SelectObject(hdcOffScr, hbmOldOffScr);
::SelectObject(hdcImage, hbmOldImage);
::SelectObject(hdcMask, hbmOldMask);
::DeleteObject(hbmOffScr);
::DeleteDC(hdcOffScr);
::DeleteDC(hdcImage);
::DeleteDC(hdcMask);
}
void CZipBitmap::CreateMask(HDC hDC, COLORREF colTrans)
{
// Nuke any existing mask.
if (m_hbmMask) {
::DeleteObject(m_hbmMask);
}
// Create memory DCs to work with.
HDC hdcMask = ::CreateCompatibleDC(hDC);
HDC hdcImage = ::CreateCompatibleDC(hDC);
// Create a monochrome bitmap for the mask.
m_hbmMask = ::CreateBitmap(GetWidth(),
GetHeight(),
1,
1,
NULL);
// Select the mono bitmap into its DC.
HBITMAP hbmOldMask = (HBITMAP)::SelectObject(hdcMask, m_hbmMask);
// Select the image bitmap into its DC.
HBITMAP hbmOldImage = (HBITMAP)::SelectObject(hdcImage, m_hBitmap);
// Set the transparency color to be the top-left pixel.
::SetBkColor(hdcImage,colTrans);
// Make the mask.
::BitBlt(hdcMask,
0, 0,
GetWidth(), GetHeight(),
hdcImage,
0, 0,
SRCCOPY);
// Tidy up.
::SelectObject(hdcMask, hbmOldMask);
::SelectObject(hdcImage, hbmOldImage);
::DeleteDC(hdcMask);
::DeleteDC(hdcImage);
}
BOOL CZipBitmap::LoadBitmap(LPCTSTR lpBitmapName)
{
if( m_hBitmap )
DeleteObject( m_hBitmap );
m_hBitmap = ::LoadBitmap(NGetInstanceHandle(), lpBitmapName);
return (m_hBitmap != NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -