包含头文件
#include
#include "GdiplusGraphics.h"
#include "GdiplusFont.h"
#pragma comment(lib,"gdiplus.lib")
using namespace Gdiplus;
对话框启动类
ULONG_PTR token;
Gdiplus::GdiplusStartupInput startupInput;
GdiplusStartup(&token, &startupInput, NULL);
RendGound.h
#pragma once
#include "afxwin.h"
class CRenderImageBackGround :public CStatic
{
public:
CRenderImageBackGround(void);
~CRenderImageBackGround(void);
private:
// 结果模式
int m_nCode;
// 背景图片
Image* m_ImageBKImage;
Image* m_ImageConfirmLeave;
Image* m_ImageWelcomBack;
RectF m_ShowRectConfirmLeave;
RectF m_ShowRectWelcomBack;
PointF m_PointWelcomeTips;
PointF m_PointBoxNum1;
PointF m_PointBoxNum2;
// 逻辑相关
BOOL m_bGetIDInfo;
BOOL m_bFirstTime;
HWND m_hNotifyWnd; // 通知主窗口
CString m_strWelcomeBack;
CString m_strIllegalCard;
CString m_strBoxNum;
int m_nShowMode;
CString m_strTips;
PointF m_ptDaytime; // time
// 提示类型
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnTimer(UINT_PTR nIDEvent);
public:
void SetNotifyWnd(const HWND& hNotify);
BOOL ResImageFromIDResource( UINT nID, LPCTSTR sTR,Image *&pImg );
void ResizeWindow();
void DrawImageInSpecRt( Graphics &pGraphics,BYTE *pNormalImage, RectF destRt );
void DrawTextInSpecPt( Graphics &pgraphics, StringAlignment alignament,
CString strText, int fontSize, PointF originpt );
void DrawTextInSpecRt(Graphics *pgraphics, StringAlignment alignament,
CString strText, int fontSize, RectF originrt);
void SetShowMode(int nMode, string strBoxNum = "", string strTips = "");
void SetUpdatTime();
};
RendGound.cpp
// BackGround.cpp : implementation file
//
#include "stdafx.h"
#include "RendGound.h"
#include "resource.h"
static const UINT SHOWMODE= WM_APP+0531;
CRenderImageBackGround::CRenderImageBackGround():
m_strWelcomeBack(_T(""))
,m_strIllegalCard(_T(""))
,m_nShowMode(-1)
,m_strBoxNum(_T(""))
,m_strTips(_T(""))
{
}
CRenderImageBackGround::~CRenderImageBackGround()
{
}
BEGIN_MESSAGE_MAP(CRenderImageBackGround, CStatic)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_RBUTTONDOWN()
ON_WM_TIMER()
END_MESSAGE_MAP()
BOOL CRenderImageBackGround::ResImageFromIDResource( UINT nID, LPCTSTR sTR,Image *&pImg )
{
HINSTANCE hInst = AfxGetResourceHandle();
HRSRC hRsrc = ::FindResource(hInst,MAKEINTRESOURCE(nID),sTR); // type
if (!hRsrc)
return FALSE;
// load resource into memory
DWORD len = SizeofResource(hInst, hRsrc);
BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
if (!lpRsrc)
return FALSE;
// Allocate global memory on which to create stream
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(hMem);
memcpy(pmem,lpRsrc,len);
GlobalUnlock(hMem);
IStream* pstm;
CreateStreamOnHGlobal(hMem,FALSE,&pstm);
// load from stream
pImg = Gdiplus::Image::FromStream(pstm);
// free/release stuff
pstm->Release();
FreeResource(lpRsrc);
GlobalFree(hMem);
return TRUE;
}
void CRenderImageBackGround::OnPaint()
{
if(m_bFirstTime)
{
ResizeWindow();
m_bFirstTime= FALSE;
}
CPaintDC dc(this); // device context for painting
CDC memDC;
memDC.CreateCompatibleDC(&dc);
//获取当前显示控件矩形框大小
CRect rectClient;
GetClientRect(rectClient);
CBitmap bmpMem;
bmpMem.CreateCompatibleBitmap(
&dc, rectClient.Width(), rectClient.Height());
HBITMAP hOldBmp = (HBITMAP)memDC.SelectObject(bmpMem);
Graphics graphic(memDC.m_hDC);
// 背景图片
Image *pThumbLeft;
pThumbLeft = m_ImageBKImage->GetThumbnailImage(
m_ImageBKImage->GetWidth(),
m_ImageBKImage->GetHeight(), NULL, NULL);
graphic.DrawImage(pThumbLeft, rectClient.left, rectClient.top,
rectClient.Width(), rectClient.Height());
delete pThumbLeft;
DrawTextInSpecPt(graphic, StringAlignmentCenter,
m_strWelcomeBack, 32, m_PointWelcomeTips);
m_ptDaytime.X= 10;
m_ptDaytime.Y= 10;
CString strTime;
COleDateTime currTime= COleDateTime::GetCurrentTime();
//写日期
strTime.Format(_T("%02d:%02d:%02d "), currTime.GetHour(), currTime.GetMinute(),currTime.GetSecond());
Gdiplus::Font myFont(_T("微软雅黑"), static_cast (18),FontStyleRegular);
SolidBrush blackBrush(Color( 0, 255, 0));
StringFormat format;
format.SetAlignment(StringAlignmentNear);
int length = strTime.GetLength() + 1;
// Draw string.
graphic.DrawString(strTime, length, &myFont, m_ptDaytime,&format,&blackBrush);
dc.BitBlt(0, 0, rectClient.Width(),
rectClient.Height(), &memDC, 0, 0, SRCCOPY);
dc.SelectObject(hOldBmp);
bmpMem.DeleteObject();
memDC.DeleteDC();
}
void CRenderImageBackGround::OnSize(UINT nType, int cx, int cy)
{
CStatic::OnSize(nType, cx, cy);
}
void CRenderImageBackGround::ResizeWindow()
{
// 提示文字
m_PointWelcomeTips.X = 371;
m_PointWelcomeTips.Y = 226;
m_PointBoxNum1.X = 272;
m_PointBoxNum1.Y = 175;
m_PointBoxNum2.X = 320;
m_PointBoxNum2.Y = 175;
ResImageFromIDResource(IDB_PNG_BACKIMAGE,_T("PNG"),m_ImageBKImage);
ResImageFromIDResource(IDB_PNG_CONFIRMLEAVE,_T("PNG"),m_ImageConfirmLeave);
ResImageFromIDResource(IDB_PNG_WELCOMBACK,_T("PNG"),m_ImageWelcomBack);
}
void CRenderImageBackGround::DrawImageInSpecRt( Graphics &pGraphics,
BYTE *pNormalImage, RectF destRt )
{
if (pNormalImage)
{
BITMAPINFOHEADER *pBMI = (BITMAPINFOHEADER *)pNormalImage;
unsigned char *pbyBits;
if (pBMI->biBitCount == 8)
pbyBits = pNormalImage + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256;
else
pbyBits = pNormalImage + sizeof(BITMAPINFOHEADER);
Bitmap bitmap(reinterpret_cast<const BITMAPINFO *>(pBMI), pbyBits);
pGraphics.DrawImage(&bitmap, destRt);
}
return;
}
void CRenderImageBackGround::DrawTextInSpecPt( Graphics &pgraphics, StringAlignment alignament,
CString strText, int fontSize, PointF originpt )
{
// Initialize arguments.
Gdiplus::Font myFont(_T("微软雅黑"), static_cast (fontSize),FontStyleRegular);
SolidBrush blackBrush(Color( 255, 255, 255));
StringFormat format;
format.SetAlignment(StringAlignmentNear);
int length = strText.GetLength() + 1;
// Draw string.
pgraphics.DrawString(strText, length, &myFont, originpt,&format,&blackBrush);
}
void CRenderImageBackGround::DrawTextInSpecRt(Graphics *pgraphics, StringAlignment alignament,
CString strText, int fontSize, RectF originrt)
{
// Initialize arguments.
Gdiplus::Font myFont(_T("Arial"), static_cast (fontSize));
int length = strText.GetLength() + 1;
StringFormat format;
format.SetAlignment(StringAlignmentCenter);
SolidBrush blackBrush(Color( 255, 255, 255));
pgraphics->DrawString(strText,length,&myFont,originrt,&format,&blackBrush);
}
void CRenderImageBackGround::SetNotifyWnd(const HWND& hNotify)
{
m_hNotifyWnd = hNotify;
}
void CRenderImageBackGround::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (SHOWMODE == nIDEvent)
{
m_nShowMode = -1;
m_strBoxNum = _T("");
m_strTips = _T("");
Invalidate();
}
KillTimer(nIDEvent);
CStatic::OnTimer(nIDEvent);
}
void CRenderImageBackGround::SetShowMode( int nMode, string strBoxNum, string strTips)
{
KillTimer(SHOWMODE);
m_nShowMode = nMode;
if ("" != strBoxNum)
{
m_strBoxNum = CA2CT(strBoxNum.c_str());
}
if ("" != strTips)
{
m_strTips = CA2CT(strTips.c_str());
}
if ((IllegalCard == m_nShowMode)||(NORMALLEAVE == m_nShowMode)||(LEAVE_YES == m_nShowMode))
{
SetTimer(SHOWMODE, 3000, NULL);
}
else if (CONFIRMLEAVER == m_nShowMode)
{
SetTimer(SHOWMODE, 10000, NULL);
}
else if (LEAVE_NO == m_nShowMode)
{
m_nShowMode = -1;
m_strBoxNum = _T("");
}
else if (SysError == m_nShowMode)
{
SetTimer(SHOWMODE, 3000, NULL);
}
Invalidate();
}
void CRenderImageBackGround::SetUpdatTime()
{
Invalidate();
}
CRenderImage m_ImageRender;
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_STATIC_1, m_ImageRender);
}
m_ImageRender.ShowWindow(SW_SHOW);
m_ImageRender.SetShowImage(m_pImage, m_nImageSize);