//=========================================================
#pragma once
class CTransparentStatic : public CStatic
{
DECLARE_DYNAMIC(CTransparentStatic)
public:
CTransparentStatic();
virtual ~CTransparentStatic();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
};
//=========================================================
#include "stdafx.h"
#include "TransparentStatic.h"
IMPLEMENT_DYNAMIC(CTransparentStatic, CStatic)
CTransparentStatic::CTransparentStatic()
{
}
CTransparentStatic::~CTransparentStatic()
{
}
BEGIN_MESSAGE_MAP(CTransparentStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
void CTransparentStatic::OnPaint()
{
CPaintDC dc(this);
CRect client_rect;
GetClientRect(client_rect);
CString szText;
GetWindowText(szText);
CFont *pFont, *pOldFont;
pFont = GetFont();
pOldFont = dc.SelectObject(pFont);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(szText, client_rect, 0);
dc.SelectObject(pOldFont);
}
转载请注意:
下面的背景对话框是从CButtonST整理二来,
//=========================================================
#pragma once
class CBkDialogST : public CDialog
{
public:
CBkDialogST(CWnd* pParent = NULL);
CBkDialogST(UINT uResourceID, CWnd* pParent = NULL);
CBkDialogST(LPCTSTR pszResourceID, CWnd* pParent = NULL);
virtual ~CBkDialogST();
DWORD SetMode(BYTE byMode, BOOL bRepaint = TRUE);
DWORD SetBitmap(HBITMAP hBitmap);
DWORD SetBitmap(int nBitmap);
DWORD ActivateEasyMoveMode(BOOL bActivate);
DWORD ShrinkToFit(BOOL bRepaint = TRUE);
enum {
BKDLGST_MODE_TILE ,
BKDLGST_MODE_CENTER ,
BKDLGST_MODE_STRETCH ,
BKDLGST_MODE_TILETOP ,
BKDLGST_MODE_TILEBOTTOM ,
BKDLGST_MODE_TILELEFT ,
BKDLGST_MODE_TILERIGHT ,
BKDLGST_MODE_TOPLEFT ,
BKDLGST_MODE_TOPRIGHT ,
BKDLGST_MODE_TOPCENTER ,
BKDLGST_MODE_BOTTOMLEFT ,
BKDLGST_MODE_BOTTOMRIGHT,
BKDLGST_MODE_BOTTOMCENTER,
BKDLGST_MAX_MODES
};
enum {
BKDLGST_OK ,
BKDLGST_INVALIDRESOURCE ,
BKDLGST_INVALIDMODE
};
protected:
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual void DoDataExchange(CDataExchange* pDX);
virtual void OnPostEraseBkgnd(CDC* pDC);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
static short GetVersionI() {return 11;}
static LPCTSTR GetVersionC() {return (LPCTSTR)_T("1.1");}
private:
void Init();
void FreeResources(BOOL bCheckForNULL = TRUE);
HBITMAP m_hBitmap ;
DWORD m_dwWidth ;
DWORD m_dwHeight ;
BYTE m_byMode ;
BOOL m_bEasyMoveMode ;
DECLARE_MESSAGE_MAP()
};
//=========================================================
#include "stdafx.h"
#include "BkDialogST.h"
CBkDialogST::CBkDialogST(CWnd* pParent )
{
Init();
}
CBkDialogST::CBkDialogST(UINT uResourceID, CWnd* pParent)
: CDialog(uResourceID, pParent)
{
Init();
}
CBkDialogST::CBkDialogST(LPCTSTR pszResourceID, CWnd* pParent)
: CDialog(pszResourceID, pParent)
{
Init();
}
CBkDialogST::~CBkDialogST()
{
FreeResources();
}
void CBkDialogST::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CBkDialogST, CDialog)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()
void CBkDialogST::Init()
{
FreeResources(FALSE);
m_byMode = BKDLGST_MODE_TILE;
m_bEasyMoveMode = TRUE;
}
void CBkDialogST::FreeResources(BOOL bCheckForNULL)
{
if (bCheckForNULL == TRUE)
{
if (m_hBitmap) ::DeleteObject(m_hBitmap);
}
m_hBitmap = NULL;
m_dwWidth = 0;
m_dwHeight = 0;
}
void CBkDialogST::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_bEasyMoveMode == TRUE)
PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
CDialog::OnLButtonDown(nFlags, point);
}
DWORD CBkDialogST::ActivateEasyMoveMode(BOOL bActivate)
{
m_bEasyMoveMode = bActivate;
return BKDLGST_OK;
}
DWORD CBkDialogST::SetBitmap(int nBitmap)
{
HBITMAP hBitmap = NULL;
HINSTANCE hInstResource = NULL;
hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nBitmap), RT_BITMAP);
hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nBitmap), IMAGE_BITMAP, 0, 0, 0);
return SetBitmap(hBitmap);
}
DWORD CBkDialogST::SetBitmap(HBITMAP hBitmap)
{
int nRetValue;
BITMAP csBitmapSize;
FreeResources();
if (hBitmap)
{
m_hBitmap = hBitmap;
nRetValue = ::GetObject(hBitmap, sizeof(csBitmapSize), &csBitmapSize);
if (nRetValue == 0)
{
FreeResources();
return BKDLGST_INVALIDRESOURCE;
}
m_dwWidth = (DWORD)csBitmapSize.bmWidth;
m_dwHeight = (DWORD)csBitmapSize.bmHeight;
}
Invalidate();
return BKDLGST_OK;
}
DWORD CBkDialogST::SetMode(BYTE byMode, BOOL bRepaint)
{
if (byMode >= BKDLGST_MAX_MODES) return BKDLGST_INVALIDMODE;
m_byMode = byMode;
if (bRepaint == TRUE) Invalidate();
return BKDLGST_OK;
}
DWORD CBkDialogST::ShrinkToFit(BOOL bRepaint)
{
CRect rWnd;
CRect rClient;
DWORD dwDiffCX;
DWORD dwDiffCY;
::GetWindowRect(m_hWnd, &rWnd);
::GetClientRect(m_hWnd, &rClient);
dwDiffCX = rWnd.Width() - rClient.Width();
dwDiffCY = rWnd.Height() - rClient.Height();
m_byMode = BKDLGST_MODE_CENTER;
MoveWindow(rWnd.left, rWnd.top, dwDiffCX + m_dwWidth, dwDiffCY + m_dwHeight, bRepaint);
return BKDLGST_OK;
}
void CBkDialogST::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_hBitmap != NULL)
{
Invalidate();
}
}
void CBkDialogST::OnPostEraseBkgnd(CDC* pDC)
{
}
BOOL CBkDialogST::OnEraseBkgnd(CDC* pDC)
{
CRect rWnd;
int nX = 0;
int nY = 0;
BOOL bRetValue = CDialog::OnEraseBkgnd(pDC);
if (m_hBitmap)
{
GetClientRect(rWnd);
CDC dcMemoryDC;
CBitmap bmpMemoryBitmap;
CBitmap* pbmpOldMemoryBitmap = NULL;
dcMemoryDC.CreateCompatibleDC(pDC);
bmpMemoryBitmap.CreateCompatibleBitmap(pDC, rWnd.Width(), rWnd.Height());
pbmpOldMemoryBitmap = (CBitmap*)dcMemoryDC.SelectObject(&bmpMemoryBitmap);
dcMemoryDC.FillSolidRect(rWnd, pDC->GetBkColor());
CDC dcTempDC;
HBITMAP hbmpOldTempBitmap = NULL;
dcTempDC.CreateCompatibleDC(pDC);
hbmpOldTempBitmap = (HBITMAP)::SelectObject(dcTempDC.m_hDC, m_hBitmap);
switch (m_byMode)
{
case BKDLGST_MODE_TILE:
// 平铺位图
while (nY < rWnd.Height())
{
while(nX < rWnd.Width())
{
dcMemoryDC.BitBlt(nX, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
nX += m_dwWidth;
}
nX = 0;
nY += m_dwHeight;
}
break;
case BKDLGST_MODE_CENTER:
nX = ((rWnd.Width() - m_dwWidth)/2);
nY = ((rWnd.Height() - m_dwHeight)/2);
dcMemoryDC.BitBlt(nX, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_STRETCH:
// 拉伸位图
dcMemoryDC.StretchBlt(0, 0, rWnd.Width(), rWnd.Height(), &dcTempDC, 0, 0, m_dwWidth, m_dwHeight, SRCCOPY);
break;
case BKDLGST_MODE_TILETOP:
while(nX < rWnd.Width())
{
dcMemoryDC.BitBlt(nX, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
nX += m_dwWidth;
}
break;
case BKDLGST_MODE_TILEBOTTOM:
while(nX < rWnd.Width())
{
dcMemoryDC.BitBlt(nX, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
nX += m_dwWidth;
}
break;
case BKDLGST_MODE_TILELEFT:
while (nY < rWnd.Height())
{
dcMemoryDC.BitBlt(0, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
nY += m_dwHeight;
}
break;
case BKDLGST_MODE_TILERIGHT:
while (nY < rWnd.Height())
{
dcMemoryDC.BitBlt(rWnd.right - m_dwWidth, nY, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
nY += m_dwHeight;
}
break;
case BKDLGST_MODE_TOPLEFT:
dcMemoryDC.BitBlt(0, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_TOPRIGHT:
dcMemoryDC.BitBlt(rWnd.right - m_dwWidth, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_TOPCENTER:
nX = ((rWnd.Width() - m_dwWidth)/2);
dcMemoryDC.BitBlt(nX, 0, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_BOTTOMLEFT:
dcMemoryDC.BitBlt(0, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_BOTTOMRIGHT:
dcMemoryDC.BitBlt(rWnd.right - m_dwWidth, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
case BKDLGST_MODE_BOTTOMCENTER:
nX = ((rWnd.Width() - m_dwWidth)/2);
dcMemoryDC.BitBlt(nX, rWnd.bottom - m_dwHeight, m_dwWidth, m_dwHeight, &dcTempDC, 0, 0, SRCCOPY);
break;
}
pDC->BitBlt(0, 0, rWnd.Width(), rWnd.Height(), &dcMemoryDC, 0, 0, SRCCOPY);
OnPostEraseBkgnd(&dcMemoryDC);
::SelectObject(dcTempDC.m_hDC, hbmpOldTempBitmap);
dcMemoryDC.SelectObject(pbmpOldMemoryBitmap);
}
return bRetValue;
}