CStatic and painting problems : bis
Hi,
I am rewriting a very simple CStatic derived control when I can display
a bitmap that fits the control so I started with the code below :
The problem is I cannot see my text or my bitmap in function I declare
one before the other.
It seems I am mixing some DC but I cannot find where
// CxStatic.cpp : implementation file
//
#include "stdafx.h"
#include "TestCxStatic.h"
#include "CxStatic.h"
// CxStatic
IMPLEMENT_DYNAMIC(CxStatic, CStatic)
CxStatic::CxStatic():CStatic(),
m_hBitmap(NULL)
{
m_eImgMode = FitControl;
m_pFont = NULL;
m_clrText = ::GetSysColor(COLOR_WINDOWTEXT);
m_clrBkgnd = ::GetSysColor(COLOR_CAPTIONTEXT);
}
CxStatic::~CxStatic()
{
}
BEGIN_MESSAGE_MAP(CxStatic, CStatic)
ON_WM_PAINT()
ON_WM_SYSCOLORCHANGE()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
void CxStatic::PreSubclassWindow()
{
// Set current font
m_pFont = GetFont();
if (m_pFont == NULL)
m_pFont = CFont::FromHandle( (HFONT) ::GetStockObject(SYSTEM_FONT) );
}
void CxStatic::UpdateFont()
{
if (m_pFont == NULL)
return;
LOGFONT lf = {0};
m_pFont->GetLogFont(&lf);
m_Font.DeleteObject();
VERIFY( m_Font.CreateFontIndirect(&lf) );
m_pFont = &m_Font;
}
BOOL CxStatic::SetBitmap(HBITMAP hBitmap, ImageSize Emode, COLORREF
rgbTransparent)
{
if ( m_hBitmap != NULL)
{
::DeleteObject(m_hBitmap);
m_hBitmap = NULL;
}
m_hBitmap = hBitmap;
Invalidate();
return ::GetObject(m_hBitmap, sizeof(BITMAP), &m_bmInfo);
}
BOOL CxStatic::SetBitmap(LPCTSTR lpszResourceName, ImageSize Emode,
COLORREF rgbTransparent)
{
#ifndef UNDER_CE
HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
lpszResourceName,
IMAGE_BITMAP,
0,0,
LR_DEFAULTCOLOR);
#else
HBITMAP hBmp = ::SHLoadImageFile( lpszResourceName );
if (!hBmp) return FALSE;
#endif
return CxStatic::SetBitmap(hBmp, Emode, rgbTransparent);
}
void CxStatic::DrawText(CDC* pDC, CRect& rcItem)
{
CString strText;
GetWindowText( strText );
int nTextLen = strText.GetLength();
DWORD dwStyle = GetStyle();
DWORD dwFlags = 0;
// Map Static Styles with Text flags
// If you set CenterImage text is vertically centered
if(dwStyle & (SS_RIGHT)) dwFlags |= (DT_RIGHT);
if(dwStyle & (SS_CENTER)) dwFlags |= (DT_CENTER);
if(dwStyle & (SS_LEFT)) dwFlags |= (DT_LEFT);
if(dwStyle & (SS_NOPREFIX)) dwFlags |= (DT_NOPREFIX);
if(dwStyle & (SS_ENDELLIPSIS)) dwFlags |= (DT_END_ELLIPSIS);
pDC->SetBkMode( TRANSPARENT );
pDC->FillSolidRect( rcItem, m_clrBkgnd );
// Set the text color and select the caption font.
pDC->SetTextColor( m_clrText );
CFont* oldFont = pDC->SelectObject( m_pFont );
pDC->DrawText( strText, rcItem, dwFlags);
pDC->SelectObject( oldFont );
}
void CxStatic::DrawBitmap(CDC* pDC, CRect& rcItem)
{
CDC dcMem;
BITMAP bmInfo = {0};
bmInfo.bmWidth = rcItem.Width();
bmInfo.bmHeight = rcItem.Height();
if (m_hBitmap == NULL)
return;
VERIFY( dcMem.CreateCompatibleDC(pDC) );
if (m_eImgMode == FitControl)
{
if (::GetObject(m_hBitmap, sizeof(BITMAP), &bmInfo) == 0)
return;
}
HBITMAP* pBmpOld = (HBITMAP*) ::SelectObject(dcMem.m_hDC, m_hBitmap);
pDC->StretchBlt(
0,0,
rcItem.Width(), rcItem.Height(),
&dcMem,
0,0,
bmInfo.bmWidth, bmInfo.bmHeight,
SRCCOPY);
}
// CxStatic message handlers
void CxStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect( &rcClient );
CDC memDC;
CBitmap bitmap;
memDC.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
//int nSaveDC = memDC.SaveDC();
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
// draw the backgound, text and icon.
//CxStatic::DrawCaptionBack( &memDC, rcClient );
CxStatic::DrawText( &memDC, rcClient );
CxStatic::DrawBitmap( &memDC, rcClient );
// - Copy the memory device context back into the original DC via
BitBlt().
dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(),
rcClient.Height(), &memDC, 0,0, SRCCOPY);
// Cleanup resources.
//memDC.RestoreDC(nSaveDC);
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
bitmap.DeleteObject();
}
void CxStatic::OnSysColorChange()
{
CStatic::OnSysColorChange();
m_clrText = ::GetSysColor(COLOR_WINDOWTEXT);
m_clrBkgnd = ::GetSysColor(COLOR_CAPTIONTEXT);
}
BOOL CxStatic::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}