关于GdiPlus的使用方法见上一篇文章《GdiPlus使用方法》
本篇文章主要使用GdiPlus设置对话框Static控件和Button控件的效果
开发工具:VS2008
1.新建对话框应用程序
在对话框上添加相应的控件,并且添加相关素材到工程中
2.重写相应的类
CMyStatic
#pragma once
// CMyStatic
class CMyStatic : public CStatic
{
DECLARE_DYNAMIC(CMyStatic)
public:
CMyStatic();
virtual ~CMyStatic();
protected:
DECLARE_MESSAGE_MAP()
public:
CString m_sTitle;
UINT m_nFormat;
DWORD m_dwColor;
LOGFONT m_LogFontTitle;
afx_msg void OnPaint();
void SetTitle(CString sTitle);
};
// MyStatic.cpp : 实现文件
//
#include "stdafx.h"
#include "MyGdiDemo.h"
#include "MyStatic.h"
// CMyStatic
IMPLEMENT_DYNAMIC(CMyStatic, CStatic)
CMyStatic::CMyStatic()
{
m_sTitle = _T("测试标题");
m_LogFontTitle.lfHeight = 39;
m_LogFontTitle.lfWeight = 0;
m_LogFontTitle.lfOrientation= 0;
m_LogFontTitle.lfEscapement = 0;
m_LogFontTitle.lfWidth = 0;
m_LogFontTitle.lfItalic = false;
m_LogFontTitle.lfUnderline = false;
m_LogFontTitle.lfStrikeOut = false;
m_LogFontTitle.lfCharSet = GB2312_CHARSET;
m_LogFontTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
m_LogFontTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
m_LogFontTitle.lfQuality = PROOF_QUALITY;
m_LogFontTitle.lfPitchAndFamily = DEFAULT_PITCH;
wcscpy_s(m_LogFontTitle.lfFaceName,_T("微软雅黑"));
m_nFormat = DT_SINGLELINE|DT_CENTER |DT_VCENTER|DT_END_ELLIPSIS;
m_dwColor = RGB(255,0,255);
}
CMyStatic::~CMyStatic()
{
}
BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
ON_WM_PAINT()
END_MESSAGE_MAP()
// CMyStatic 消息处理程序
void CMyStatic::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
RECT rect;
GetClientRect(&rect);
HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
HFONT hOldFont = (HFONT)::SelectObject(dc.m_hDC,hFont);
dc.SetTextColor(m_dwColor);//画文字
dc.SetBkMode(TRANSPARENT);
dc.DrawText(m_sTitle,&rect,m_nFormat);
hFont = (HFONT)::SelectObject(dc.m_hDC,hOldFont);
::DeleteObject(hFont);
}
void CMyStatic::SetTitle(CString sTitle)
{
m_sTitle = sTitle;
}
CMyButton
#pragma once
// CMyButton
class CMyButton : public CButton
{
DECLARE_DYNAMIC(CMyButton)
public:
CMyButton();
virtual ~CMyButton();
protected:
DECLARE_MESSAGE_MAP()
private:
Image* m_pImageBackDef;
Image* m_pImageBackSel;
int m_nBackWidth , m_nBackHeight;
bool m_bSel;
CString m_sTitle;
LOGFONT m_LogFontTitle;
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
void SetTitle(CString sTitle);
void SetSel(bool bSel);
BOOL LoadBitmaps(UINT nIDImageBackDef, UINT nIDImageBackSel);
BOOL LoadBitmaps(CString sImageBackDef, CString sImageBackSel);
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
// MyButton.cpp : 实现文件
//
#include "stdafx.h"
#include "MyGdiDemo.h"
#include "MyButton.h"
// CMyButton
IMPLEMENT_DYNAMIC(CMyButton, CButton)
CMyButton::CMyButton()
{
m_pImageBackDef = NULL;
m_pImageBackSel = NULL;
m_nBackWidth = 0;
m_nBackHeight = 0;
m_bSel = false;
m_sTitle = _T("");
m_LogFontTitle.lfHeight = 32;
m_LogFontTitle.lfWeight = 600;
m_LogFontTitle.lfOrientation= 0;
m_LogFontTitle.lfEscapement = 0;
m_LogFontTitle.lfWidth = 14;
m_LogFontTitle.lfItalic = false;
m_LogFontTitle.lfUnderline = false;
m_LogFontTitle.lfStrikeOut = false;
m_LogFontTitle.lfCharSet = GB2312_CHARSET;
m_LogFontTitle.lfOutPrecision = OUT_DEFAULT_PRECIS;
m_LogFontTitle.lfClipPrecision = CLIP_DEFAULT_PRECIS;
m_LogFontTitle.lfQuality = PROOF_QUALITY;
m_LogFontTitle.lfPitchAndFamily = DEFAULT_PITCH;
wcscpy_s(m_LogFontTitle.lfFaceName,_T("黑体"));
}
CMyButton::~CMyButton()
{
}
BEGIN_MESSAGE_MAP(CMyButton, CButton)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
// CMyButton 消息处理程序
void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CRect rcClient;
GetClientRect(&rcClient);
ASSERT(lpDIS != NULL);
Image* m_pImageBack = NULL;
DWORD color = RGB(0,0,0);
if(m_bSel)
{
if(!m_pImageBackSel)
{
return;
}
m_pImageBack = m_pImageBackSel;
color = RGB(244,129,0);
}
else
{
if(!m_pImageBackDef)
{
return;
}
m_pImageBack = m_pImageBackDef;
color = RGB(0,0,0);
}
// draw the whole button
CDC dcMem;
CBitmap bmpMem;
dcMem.CreateCompatibleDC(pDC);
if(bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()))
{
CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
Graphics graph(dcMem.m_hDC);
Point points[] = { Point(0, 0),
Point(m_nBackWidth, 0),
Point(0, m_nBackHeight),
};
graph.DrawImage(m_pImageBack, points, 3);
graph.ReleaseHDC(dcMem.m_hDC);
CRect rect;
rect.CopyRect(&lpDIS->rcItem);
HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
HFONT hOldFont = (HFONT)::SelectObject(dcMem.m_hDC,hFont);
dcMem.SetTextColor(color);//画文字
dcMem.SetBkMode(TRANSPARENT);
dcMem.DrawText(m_sTitle,&rect,DT_SINGLELINE|DT_CENTER |DT_BOTTOM|DT_END_ELLIPSIS);
hFont = (HFONT)::SelectObject(dcMem.m_hDC,hOldFont);
::DeleteObject(hFont);
pDC->BitBlt(0,0,m_nBackWidth,m_nBackHeight,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBmp);
bmpMem.DeleteObject();
}
dcMem.DeleteDC();
}
void CMyButton::SetTitle(CString sTitle)
{
m_sTitle = sTitle;
}
void CMyButton::SetSel(bool bSel)
{
if(bSel == m_bSel)
{
return;
}
m_bSel = bSel;
RECT rect;
GetClientRect(&rect);
InvalidateRect(&rect,FALSE);
}
BOOL CMyButton::LoadBitmaps(UINT nIDImageBackDef, UINT nIDImageBackSel)
{
if(m_pImageBackDef)
{
delete m_pImageBackDef;
}
if(m_pImageBackSel)
{
delete m_pImageBackSel;
}
ImageFromIDResource(nIDImageBackDef,_T("PNG"),m_pImageBackDef);
m_nBackWidth = m_pImageBackDef->GetWidth();
m_nBackHeight = m_pImageBackDef->GetHeight();
ImageFromIDResource(nIDImageBackSel,_T("PNG"),m_pImageBackSel);
m_nBackWidth = m_pImageBackSel->GetWidth();
m_nBackHeight = m_pImageBackSel->GetHeight();
return TRUE;
}
BOOL CMyButton::LoadBitmaps(CString sImageBackDef, CString sImageBackSel)
{
if(m_pImageBackDef)
{
delete m_pImageBackDef;
}
if(m_pImageBackSel)
{
delete m_pImageBackSel;
}
ImageFromIDResource(sImageBackDef,m_pImageBackDef);
m_nBackWidth = m_pImageBackDef->GetWidth();
m_nBackHeight = m_pImageBackDef->GetHeight();
ImageFromIDResource(sImageBackSel,m_pImageBackSel);
m_nBackWidth = m_pImageBackSel->GetWidth();
m_nBackHeight = m_pImageBackSel->GetHeight();
return TRUE;
}
void CMyButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CButton::OnPaint()
Image* m_pImageBack = NULL;
DWORD color = RGB(0,0,0);
if(m_bSel)
{
if(!m_pImageBackSel)
{
return;
}
m_pImageBack = m_pImageBackSel;
color = RGB(244,129,0);
}
else
{
if(!m_pImageBackDef)
{
return;
}
m_pImageBack = m_pImageBackDef;
color = RGB(0,0,0);
}
// draw the whole button
CRect rcClient;
GetClientRect(&rcClient);
CDC dcMem;
CBitmap bmpMem;
CDC* pDC = CDC::FromHandle(dc.m_hDC);
dcMem.CreateCompatibleDC(pDC);
if(bmpMem.CreateCompatibleBitmap(pDC,rcClient.Width(),rcClient.Height()))
{
CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
Graphics graph(dcMem.m_hDC);
Point points[] = { Point(0, 0),
Point(m_nBackWidth, 0),
Point(0, m_nBackHeight),
};
graph.DrawImage(m_pImageBack, points, 3);
graph.ReleaseHDC(dcMem.m_hDC);
CRect rect;
GetClientRect(&rect);
HFONT hFont = ::CreateFontIndirect(&m_LogFontTitle);
HFONT hOldFont = (HFONT)::SelectObject(dcMem.m_hDC,hFont);
dcMem.SetTextColor(color);//画文字
dcMem.SetBkMode(TRANSPARENT);
dcMem.DrawText(m_sTitle,&rect,DT_SINGLELINE|DT_CENTER |DT_BOTTOM|DT_END_ELLIPSIS);
hFont = (HFONT)::SelectObject(dcMem.m_hDC,hOldFont);
::DeleteObject(hFont);
dc.BitBlt(0,0,m_nBackWidth,m_nBackHeight,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBmp);
bmpMem.DeleteObject();
}
dcMem.DeleteDC();
}
BOOL CMyButton::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
return CButton::OnEraseBkgnd(pDC);
}
CMyButtonStyle
#pragma once
// CMyButtonStyle
class CMyButtonStyle : public CButton
{
DECLARE_DYNAMIC(CMyButtonStyle)
public:
CMyButtonStyle();
virtual ~CMyButtonStyle();
protected:
DECLARE_MESSAGE_MAP()
private:
// all bitmaps must be the same size
Image *m_pImageDef;
Image *m_pImageSel;
Image *m_pImageFocus;
Image *m_pImageDisabled;
int m_nImageWidth , m_nImageHeight ;
Image* m_pImageBack;
int m_nBackWidth , m_nBackHeight;
RECT m_MyRt;
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
void DrawBackground(HDC hDC, Image* pImage);
BOOL LoadBitmaps(UINT nIDBitmapResource, UINT nIDBitmapResourceSel, UINT nIDBitmapResourceFocus, UINT nIDBitmapResourceDisabled);
void SetBtnCfg(Image* pImage, int nWidth, int nHeight, RECT rt);
};
// MyButtonStyle.cpp : 实现文件
//
#include "stdafx.h"
#include "MyGdiDemo.h"
#include "MyButtonStyle.h"
// CMyButtonStyle
IMPLEMENT_DYNAMIC(CMyButtonStyle, CButton)
CMyButtonStyle::CMyButtonStyle()
{
m_pImageDef = NULL;
m_pImageSel = NULL;
m_pImageFocus = NULL;
m_pImageDisabled = NULL;
m_pImageBack = NULL;
m_nBackWidth = 0;
m_nBackHeight = 0;
}
CMyButtonStyle::~CMyButtonStyle()
{
}
BEGIN_MESSAGE_MAP(CMyButtonStyle, CButton)
END_MESSAGE_MAP()
// CMyButtonStyle 消息处理程序
void CMyButtonStyle::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
ASSERT(lpDIS != NULL);
// must have at least the first bitmap loaded before calling DrawItem
ASSERT(m_pImageDef != NULL); // required
// use the main bitmap for up, the selected bitmap for down
Image *pImage = m_pImageDef;
UINT state = lpDIS->itemState;
if ((state & ODS_SELECTED) && m_pImageSel != NULL)
{
pImage = m_pImageSel;
}
else if ((state & ODS_FOCUS) && m_pImageFocus != NULL)
{
pImage = m_pImageFocus; // third image for focused
}
else if ((state & ODS_DISABLED) && m_pImageDisabled != NULL)
{
pImage = m_pImageDisabled; // last image for disabled
}
else
{
pImage = m_pImageDef;
}
CRect rcClient;
GetClientRect(&rcClient);
CDC dcMem;
CBitmap bmpMem;
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
dcMem.CreateCompatibleDC(pDC);
if(bmpMem.CreateCompatibleBitmap(pDC,m_nBackWidth,m_nBackHeight))
{
CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
Graphics graph(dcMem.m_hDC);
Point points[] = { Point(0, 0),
Point(m_nBackWidth, 0),
Point(0, m_nBackHeight),
};
graph.DrawImage(m_pImageBack, points, 3);
graph.ReleaseHDC(dcMem.m_hDC);
DrawBackground(dcMem.m_hDC,pImage);
pDC->BitBlt(0,0,m_MyRt.right-m_MyRt.left,m_MyRt.bottom-m_MyRt.top,&dcMem,m_MyRt.left,m_MyRt.top,SRCCOPY);
dcMem.SelectObject(pOldBmp);
bmpMem.DeleteObject();
}
dcMem.DeleteDC();
}
void CMyButtonStyle::DrawBackground(HDC hDC, Image* pImage)
{
RECT rct;
GetWindowRect(&rct);
POINT ptWinPos={rct.left,rct.top};
Graphics graph(hDC);
Point points[] = { Point(m_MyRt.left, m_MyRt.top),
Point(m_MyRt.left+m_nImageWidth, m_MyRt.top),
Point(m_MyRt.left, m_MyRt.top+m_nImageHeight),
};
graph.DrawImage(pImage, points, 3);
graph.ReleaseHDC(hDC);
}
BOOL CMyButtonStyle::LoadBitmaps(UINT nIDBitmapResource, UINT nIDBitmapResourceSel, UINT nIDBitmapResourceFocus, UINT nIDBitmapResourceDisabled)
{
if(m_pImageDef)
{
delete m_pImageDef;
}
if(m_pImageSel)
{
delete m_pImageSel;
}
if(m_pImageFocus)
{
delete m_pImageFocus;
}
if(m_pImageDisabled)
{
delete m_pImageDisabled;
}
ImageFromIDResource(nIDBitmapResource,_T("PNG"),m_pImageDef);
m_nImageWidth = m_pImageDef->GetWidth();
m_nImageHeight = m_pImageDef->GetHeight();
ImageFromIDResource(nIDBitmapResourceSel,_T("PNG"),m_pImageSel);
m_nImageWidth = m_pImageSel->GetWidth();
m_nImageHeight = m_pImageSel->GetHeight();
ImageFromIDResource(nIDBitmapResourceFocus,_T("PNG"),m_pImageFocus);
m_nImageWidth = m_pImageFocus->GetWidth();
m_nImageHeight = m_pImageFocus->GetHeight();
ImageFromIDResource(nIDBitmapResourceDisabled,_T("PNG"),m_pImageDisabled);
m_nImageWidth = m_pImageDisabled->GetWidth();
m_nImageHeight = m_pImageDisabled->GetHeight();
return TRUE;
}
void CMyButtonStyle::SetBtnCfg(Image* pImage, int nWidth, int nHeight, RECT rt)
{
m_pImageBack = pImage;
m_nBackWidth = nWidth;
m_nBackHeight = nHeight;
m_MyRt = rt;
}
3.添加相应的处理函数
// MyGdiDemoDlg.h : 头文件
//
#pragma once
#include "afxwin.h"
#include "MyStatic.h"
#include "MyButton.h"
#include "MyButtonStyle.h"
// CMyGdiDemoDlg 对话框
class CMyGdiDemoDlg : public CDialog
{
// 构造
public:
CMyGdiDemoDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_MYGDIDEMO_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
private:
Image *m_pImageBack;
int m_nBackWidth , m_nBackHeight ;
public:
CMyStatic m_stcTitle;
CMyButton m_btn1;
CMyButton m_btn2;
CMyButtonStyle m_btn3;
void MyInitDialog(void);
void GetResource(void);
void InitUi(void);
void MyPaint(void);
void DrawBackground(HDC hDC);
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton2();
};
void CMyGdiDemoDlg::MyInitDialog(void)
{
m_pImageBack = NULL;
m_nBackWidth = 0;
m_nBackHeight = 0;
GetResource();
InitUi();
}
void CMyGdiDemoDlg::GetResource(void)
{
ImageFromIDResource(IDB_PNG_BACKGROUND,_T("PNG"),m_pImageBack);
m_nBackWidth = m_pImageBack->GetWidth();
m_nBackHeight = m_pImageBack->GetHeight();
m_btn1.LoadBitmaps(IDB_PNG_BTN_BLUE,IDB_PNG_BTN_RED);
m_btn2.LoadBitmaps(IDB_PNG_BTN_RIGHT,IDB_PNG_BTN_WRONG);
m_btn3.LoadBitmaps(IDB_PNG_BTN_STYLE1,IDB_PNG_BTN_STYLE2,IDB_PNG_BTN_STYLE3,IDB_PNG_BTN_STYLE4);
}
void CMyGdiDemoDlg::InitUi(void)
{
//对话框背景图片宽和高
const int nBkBmpWidth = 500;
const int nBkBmpHeight = 354;
//获得电脑显示器的像素宽度和像素高度
int ax = GetDC()->GetDeviceCaps(HORZRES) - nBkBmpWidth;
int ay = GetDC()->GetDeviceCaps(VERTRES) - nBkBmpHeight;
int nWidth = 0;
int nHeight = 0;
if(ax <= 0)
{ ax =0; }
else
{ ax = ax/2; }
if(ay <=0 )
{ ay =0; }
else
{ ay = ay/2; }
RECT clientRect;
clientRect.left = ax;
clientRect.top = ay;
clientRect.right = clientRect.left + nBkBmpWidth;
clientRect.bottom = clientRect.top + nBkBmpHeight;
MoveWindow(&clientRect);
GetWindowRect(&clientRect);
ScreenToClient(&clientRect);
//改变对话框标题静态文本框位置
int xPos = 0;
int yPos = 0;
//对话框标题
xPos = clientRect.left + 100;
yPos = clientRect.top + 30;
m_stcTitle.MoveWindow(xPos,yPos,200,45);
xPos = clientRect.left + 50;
yPos = clientRect.top + 150;
m_btn1.MoveWindow(xPos,yPos,158,59);
xPos = clientRect.left + 220;
yPos = clientRect.top + 150;
m_btn2.MoveWindow(xPos,yPos,100,100);
xPos = clientRect.left + 330;
yPos = clientRect.top + 150;
m_btn3.MoveWindow(xPos,yPos,100,100);
RECT rect;
m_btn3.GetWindowRect(&rect);
ScreenToClient(&rect);
m_btn3.SetBtnCfg(m_pImageBack,m_nBackWidth,m_nBackHeight,rect);
}
void CMyGdiDemoDlg::MyPaint(void)
{
CPaintDC dc(this);
CRect rcClient;
GetClientRect(&rcClient);
CDC dcMem;
CBitmap bmpMem;
dcMem.CreateCompatibleDC(&dc);
if(bmpMem.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()))
{
CBitmap* pOldBmp = dcMem.SelectObject(&bmpMem);
CWnd::DefWindowProc(WM_PAINT,(WPARAM)dcMem.m_hDC,0);
DrawBackground(dcMem.m_hDC);
dc.BitBlt(0,0,rcClient.right,rcClient.bottom,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(pOldBmp);
bmpMem.DeleteObject();
}
dcMem.DeleteDC();
}
void CMyGdiDemoDlg::DrawBackground(HDC hDC)
{
RECT rct;
GetWindowRect(&rct);
POINT ptWinPos={rct.left,rct.top};
Graphics graph(hDC);
Point points[] = { Point(0, 0),
Point(m_nBackWidth, 0),
Point(0, m_nBackHeight),
};
graph.DrawImage(m_pImageBack, points, 3);
graph.ReleaseHDC(hDC);
}
void CMyGdiDemoDlg::OnBnClickedButton1()
{
m_btn1.SetSel(true);
m_btn2.SetSel(false);
}
void CMyGdiDemoDlg::OnBnClickedButton2()
{
m_btn1.SetSel(false);
m_btn2.SetSel(true);
}
4.运行效果
运行