基于Graphics画图

包含头文件

#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);

你可能感兴趣的:(技术)