class='cKeyword'>#include "stdafx.h"
class='cKeyword'>#include "BitmapPicture.h"
class='cKeyword'>class='cKeyword'>#ifdef _DEBUG
class='cKeyword'>#define new DEBUG_NEW
class='cKeyword'>#undef THIS_FILE
static class='cKeyword'>char THIS_FILE[] = __FILE__;
class='cKeyword'>#endif
class='cKeyword'>#define UPDATE_ENTIRE_CLIENT_AREA
CBitmapPicture::CBitmapPicture()
{
m_hBitmap = NULL;
m_nResourceID = -1;
m_strResourceName.Empty();
}
CBitmapPicture::~CBitmapPicture()
{
if (m_hBitmap) ::DeleteObject(m_hBitmap);
}
BEGIN_MESSAGE_MAP(CBitmapPicture, CStatic)
ON_WM_ERASEBKGND()
ON_WM_DRAWITEM_REFLECT()
ON_WM_SYSCOLORCHANGE()
END_MESSAGE_MAP()
BOOL CBitmapPicture::SetBitmap(HBITMAP hBitmap)
{
::DeleteObject(m_hBitmap);
m_hBitmap = hBitmap;
return ::GetObject(m_hBitmap, sizeof(BITMAP), &m_bmInfo);
}
BOOL CBitmapPicture::SetBitmap(UINT nIDResource)
{
m_nResourceID = nIDResource;
m_strResourceName.Empty();
HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(nIDResource),
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS);
if (!hBmp) return FALSE;
return CBitmapPicture::SetBitmap(hBmp);
}
BOOL CBitmapPicture::SetBitmap(LPCTSTR lpszResourceName)
{
m_nResourceID = -1;
m_strResourceName = lpszResourceName;
HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
lpszResourceName,
IMAGE_BITMAP,
0,0,
LR_LOADMAP3DCOLORS);
if (!hBmp) return FALSE;
return CBitmapPicture::SetBitmap(hBmp);
}
BOOL CBitmapPicture::ReloadBitmap()
{
if (m_nResourceID > 0)
return SetBitmap(m_nResourceID);
else if (!m_strResourceName.IsEmpty())
return SetBitmap(m_strResourceName);
else
return FALSE;
}
void CBitmapPicture::PreSubclassWindow()
{
CStatic::PreSubclassWindow();
ModifyStyle(0, SS_OWNERDRAW);
}
BOOL CBitmapPicture::OnEraseBkgnd(CDC* pDC)
{
CRect rect;
GetClientRect(rect);
if (!m_hBitmap)
{
CBrush backBrush(::GetSysColor(COLOR_3DFACE));
CBrush* pOldBrush = pDC->SelectObject(&backBrush);
pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATCOPY);
pDC->SelectObject(pOldBrush);
return TRUE;
}
CDC dcMem;
VERIFY( dcMem.CreateCompatibleDC(pDC));
HBITMAP* pBmpOld = (HBITMAP*) ::SelectObject(dcMem.m_hDC, m_hBitmap);
pDC->SetStretchBltMode(COLORONCOLOR);
class='cKeyword'>class='cKeyword'>#ifdef UPDATE_ENTIRE_CLIENT_AREA
pDC->StretchBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dcMem, 0, 0, m_bmInfo.bmWidth-1, m_bmInfo.bmHeight-1,
SRCCOPY);
class='cKeyword'>#else
CRect TargetRect;
pDC->GetClipBox(&TargetRect);
TargetRect.IntersectRect(TargetRect, rect);
CRect SrcRect;
SrcRect.left = MulDiv(TargetRect.left, m_bmInfo.bmWidth, rect.Width());
SrcRect.top = MulDiv(TargetRect.top, m_bmInfo.bmHeight, rect.Height());
SrcRect.right = MulDiv(TargetRect.right, m_bmInfo.bmWidth, rect.Width());
SrcRect.bottom = MulDiv(TargetRect.bottom, m_bmInfo.bmHeight, rect.Height());
pDC->StretchBlt(TargetRect.left, TargetRect.top, TargetRect.Width(), TargetRect.Height(),
&dcMem,
SrcRect.left, SrcRect.top, SrcRect.Width(), SrcRect.Height(),
SRCCOPY);
class='cKeyword'>#endif
::SelectObject(dcMem.m_hDC, pBmpOld);
return TRUE;
}
void CBitmapPicture::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct != NULL);
CString str;
GetWindowText(str);
if (!str.GetLength()) return;
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
DWORD dwStyle = GetStyle();
int nFormat = DT_NOPREFIX | DT_NOCLIP | DT_WORDBREAK | DT_SINGLELINE;
if (dwStyle & SS_CENTERIMAGE) nFormat |= DT_VCENTER;
if (dwStyle & SS_CENTER) nFormat |= DT_CENTER;
else if (dwStyle & SS_RIGHT) nFormat |= DT_RIGHT;
else nFormat |= DT_LEFT;
int nOldMode = pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(str, rect, nFormat);
pDC->SetBkMode(nOldMode);
}
void CBitmapPicture::OnSysColorChange()
{
CStatic::OnSysColorChange();
ReloadBitmap();
}