GdiPlus控件Static和Button的使用

来源:互联网 发布:mac上如何打开rar文件 编辑:程序博客网 时间:2024/06/03 21:33

关于GdiPlus的使用方法见上一篇文章《GdiPlus使用方法》

本篇文章主要使用GdiPlus设置对话框Static控件和Button控件的效果


开发工具:VS2008

1.新建对话框应用程序

在对话框上添加相应的控件,并且添加相关素材到工程中


2.重写相应的类

CMyStatic

#pragma once// CMyStaticclass 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"// CMyStaticIMPLEMENT_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// CMyButtonclass 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"// CMyButtonIMPLEMENT_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 buttonCDC 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 buttonCRect 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// CMyButtonStyleclass CMyButtonStyle : public CButton{DECLARE_DYNAMIC(CMyButtonStyle)public:CMyButtonStyle();virtual ~CMyButtonStyle();protected:DECLARE_MESSAGE_MAP()private:// all bitmaps must be the same sizeImage *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"// CMyButtonStyleIMPLEMENT_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 DrawItemASSERT(m_pImageDef != NULL);     // required// use the main bitmap for up, the selected bitmap for downImage *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.运行效果

运行








源码下载




0 0
原创粉丝点击