自制button
来源:互联网 发布:语音域名 编辑:程序博客网 时间:2024/04/26 03:53
SkinButton.h
[cpp] view plain copy
- #ifndef SKINBUTTON_HEAD
- #define SKINBUTTON_HEAD
- #pragma once
- //#include "stdafx.h"
- #include <afxwin.h>
- #include <afxext.h>
- #include <GdiPlus.h>
- #include <AtlImage.h>
- #include "resource.h"
- #pragma comment(lib,"gdiplus.lib")
- //命名空间
- using namespace Gdiplus;
- //接口释放
- #define SafeRelease(pObject) { if (pObject!=NULL) { pObject->Release(); pObject=NULL; } }
- //删除指针
- #define SafeDelete(pData) { try { delete pData; } catch (...) { ASSERT(FALSE); } pData=NULL; }
- //关闭句柄
- #define SafeCloseHandle(hHandle) { if (hHandle!=NULL) { CloseHandle(hHandle); hHandle=NULL; } }
- //删除数组
- #define SafeDeleteArray(pData) { try { delete [] pData; } catch (...) { ASSERT(FALSE); } pData=NULL; }
- class CSkinButtonbmp :public CButton/*CWnd*/
- {
- //状态变量
- private:
- UINT m_uState; //当前按钮状态
- UINT m_uFlags; //当前鼠标状态
- //资源变量
- private:
- SIZE m_szButton; //按钮大小
- HDC m_hButtonDC; //按钮图片DC
- HBITMAP m_hButtonBmp; //按钮图片BMP
- public:
- //构造函数
- CSkinButtonbmp();
- //析构函数
- virtual ~CSkinButtonbmp();
- //功能函数
- public:
- //创建按钮
- BOOL CreateButton(LPCTSTR lpszCaption,DWORD dwStyle,int x, int y,CWnd* pParentWnd,UINT uID);
- //创建按钮
- BOOL CreateButton(LPCTSTR lpszCaption,DWORD dwStyle,int x, int y,HINSTANCE hInstance, UINT nIDResource,CWnd* pParentWnd,UINT uID);
- //加载位图
- BOOL SetButtonImage(LPCTSTR lpszFileName);
- //加载位图
- BOOL SetButtonImage(HINSTANCE hInstance, UINT nIDResource );
- //重载函数
- protected:
- //创建消息
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- //绘画背景
- afx_msg BOOL OnEraseBkgnd(CDC *pDC);
- //绘画函数
- virtual VOID DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
- ////鼠标按钮
- //afx_msg void OnLButtonDown(UINT, CPoint);
- ////鼠标抬起
- //afx_msg void OnLButtonUp(UINT ,CPoint);
- //鼠标移动
- afx_msg void OnMouseMove(UINT, CPoint);
- //鼠标离开
- afx_msg void OnMouseLeave();
- DECLARE_MESSAGE_MAP()
- };
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class CSkinButtonpng :public CButton
- {
- //状态变量
- private:
- UINT m_uState; //当前按钮状态
- UINT m_uFlags; //当前鼠标状态
- //资源变量
- private:
- SIZE m_szButton; //按钮大小
- HDC m_hButtonDC; //按钮图片DC
- HBITMAP m_hButtonBmp; //按钮图片BMP
- //图片对象
- private:
- Image* m_pButtonImage; //图片对象
- //A变量
- private:
- ULONG_PTR token; //初始化GDI+
- public:
- //构造函数
- CSkinButtonpng();
- //析构函数
- virtual ~CSkinButtonpng();
- //功能函数
- public:
- //创建按钮
- BOOL CreateButton(LPCTSTR lpszCaption,DWORD dwStyle,int x, int y,CWnd* pParentWnd,UINT uID);
- //加载图片
- bool SetButtonImage(LPCTSTR pszFileName);
- //加载图片
- bool SetButtonImage(HINSTANCE hInstance, LPCTSTR pszResourceName);
- //重载函数
- protected:
- //创建消息
- afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- //绘画背景
- afx_msg BOOL OnEraseBkgnd(CDC *pDC);
- //绘画函数
- virtual VOID DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
- ////鼠标按钮
- //afx_msg void OnLButtonDown(UINT, CPoint);
- ////鼠标抬起
- //afx_msg void OnLButtonUp(UINT ,CPoint);
- //鼠标移动
- afx_msg void OnMouseMove(UINT, CPoint);
- //鼠标离开
- afx_msg void OnMouseLeave();
- DECLARE_MESSAGE_MAP()
- };
- #endif
SkinButton.cpp
[cpp] view plain copy
- #include "SkinButton.h"
- #define STATE_COUNT 5 //按钮状态数量
- //按钮状态
- enum
- {
- STATE_NONE = 0, //当前鼠标不再按键上(常态)
- STATE_DOWN, //当前鼠标在按键上按下
- STATE_MOVE, //当前鼠标在按键上
- STATE_MOVEEx, //当前鼠标在按键上
- STATE_DISABLE, //当前按键禁用
- };
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- BEGIN_MESSAGE_MAP(CSkinButtonbmp, CWnd)
- ON_WM_CREATE()
- ON_WM_ERASEBKGND()
- //ON_WM_LBUTTONDOWN()
- //ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_MOUSELEAVE()
- END_MESSAGE_MAP()
- //构造函数
- CSkinButtonbmp::CSkinButtonbmp()
- {
- //状态变量
- m_uState=0;
- m_uFlags=0;
- //资源变量
- ZeroMemory(&m_szButton,sizeof(m_szButton));
- m_hButtonDC=NULL;
- m_hButtonBmp=NULL;
- }
- //析构函数
- CSkinButtonbmp::~CSkinButtonbmp()
- {
- if(m_hButtonDC){::DeleteDC(m_hButtonDC);m_hButtonDC=NULL;}
- if(m_hButtonBmp){::DeleteObject(m_hButtonBmp);m_hButtonBmp=NULL;}
- }
- //创建按钮
- BOOL CSkinButtonbmp::CreateButton(LPCTSTR lpszCaption,DWORD dwStyle,int x, int y,CWnd* pParentWnd,UINT uID)
- {
- //创建按钮
- return Create(lpszCaption, dwStyle, CRect(x, y, x+1, y+1), pParentWnd, uID);
- }
- //创建按钮
- BOOL CSkinButtonbmp::CreateButton( LPCTSTR lpszCaption,DWORD dwStyle,int x, int y,HINSTANCE hInstance, UINT nIDResource,CWnd* pParentWnd,UINT uID )
- {
- //加载图片
- m_hButtonBmp = (HBITMAP)::LoadImage(hInstance, MAKEINTRESOURCE(nIDResource), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
- ASSERT(m_hButtonBmp);if (m_hButtonBmp==NULL)return false;
- //创建按钮
- return Create(lpszCaption, dwStyle, CRect(x, y, x+1, y+1), pParentWnd, uID);
- }
- //加载位图
- BOOL CSkinButtonbmp::SetButtonImage( LPCTSTR lpszFileName )
- {
- //设置按钮
- SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW);
- //加载图片
- m_hButtonBmp = (HBITMAP)::LoadImage(NULL, lpszFileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
- ASSERT(m_hButtonBmp);if (m_hButtonBmp==NULL)return false;
- ASSERT(m_hWnd);if (m_hWnd==NULL)return false;
- HDC hDC =::GetDC(m_hWnd);
- m_hButtonDC = CreateCompatibleDC(hDC);
- ::SelectObject(m_hButtonDC,m_hButtonBmp);
- ::ReleaseDC(m_hWnd,hDC);
- //获取图片大小
- BITMAP bm;
- ::GetObject(m_hButtonBmp, sizeof(bm), &bm);
- m_szButton.cx = bm.bmWidth/STATE_COUNT;
- m_szButton.cy = bm.bmHeight;
- //不移动X,Y坐标,不改变Z序,不重绘,仅改变窗口大小
- SetWindowPos(NULL, 0, 0, m_szButton.cx, m_szButton.cy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW);
- return TRUE;
- }
- //加载位图
- BOOL CSkinButtonbmp::SetButtonImage( HINSTANCE hInstance, UINT nIDResource )
- {
- //设置按钮
- SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW);
- //加载图片
- m_hButtonBmp = (HBITMAP)::LoadImage(hInstance, MAKEINTRESOURCE(nIDResource), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
- ASSERT(m_hButtonBmp);if (m_hButtonBmp==NULL)return false;
- ASSERT(m_hWnd);if (m_hWnd==NULL)return false;
- HDC hDC =::GetDC(m_hWnd);
- m_hButtonDC = CreateCompatibleDC(hDC);
- ::SelectObject(m_hButtonDC,m_hButtonBmp);
- ::ReleaseDC(m_hWnd,hDC);
- //获取图片大小
- BITMAP bm;
- ::GetObject(m_hButtonBmp, sizeof(bm), &bm);
- m_szButton.cx = bm.bmWidth/STATE_COUNT;
- m_szButton.cy = bm.bmHeight;
- //不移动X,Y坐标,不改变Z序,不重绘,仅改变窗口大小
- SetWindowPos(NULL, 0, 0, m_szButton.cx, m_szButton.cy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW);
- return TRUE;
- }
- //绘画背景
- BOOL CSkinButtonbmp::OnEraseBkgnd( CDC *pDC )
- {
- return TRUE;
- }
- //创建消息
- int CSkinButtonbmp::OnCreate( LPCREATESTRUCT lpCreateStruct )
- {
- if (__super::OnCreate(lpCreateStruct) == -1)return -1;
- return 0;
- }
- //绘画函数
- VOID CSkinButtonbmp::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
- {
- //变量定义
- HDC hDC=lpDrawItemStruct->hDC;
- CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
- ASSERT(pDC);if (pDC==NULL)return ;
- //按钮状态
- bool bDisable=((lpDrawItemStruct->itemState&ODS_DISABLED)!=0);
- bool bButtonDown=((lpDrawItemStruct->itemState&ODS_SELECTED)!=0);
- if (bDisable)m_uState=STATE_DISABLE;
- if (bButtonDown)m_uState=STATE_DOWN;
- ::BitBlt(pDC->m_hDC,0,0,m_szButton.cx,m_szButton.cy,m_hButtonDC,m_uState * m_szButton.cx,0,SRCCOPY);
- }
- ////鼠标按钮
- //void CSkinButtonbmp::OnLButtonDown( UINT, CPoint )
- //{
- // m_uState = STATE_DOWN;
- // Invalidate();
- // return;
- //}
- //
- ////鼠标抬起
- //void CSkinButtonbmp::OnLButtonUp( UINT ,CPoint )
- //{
- // m_uState = STATE_NONE;
- // Invalidate();
- // return;
- //}
- //鼠标移动
- void CSkinButtonbmp::OnMouseMove( UINT, CPoint )
- {
- m_uState = STATE_MOVE;
- Invalidate();
- TRACKMOUSEEVENT te = {sizeof(TRACKMOUSEEVENT) ,TME_LEAVE ,m_hWnd, 1};
- ::_TrackMouseEvent(&te);
- }
- //鼠标离开
- void CSkinButtonbmp::OnMouseLeave()
- {
- m_uState = STATE_NONE;
- Invalidate();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- BEGIN_MESSAGE_MAP(CSkinButtonpng, CWnd)
- ON_WM_CREATE()
- ON_WM_ERASEBKGND()
- //ON_WM_LBUTTONDOWN()
- //ON_WM_LBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_MOUSELEAVE()
- END_MESSAGE_MAP()
- //构造函数
- CSkinButtonpng::CSkinButtonpng()
- {
- //状态变量
- m_uState=0;
- m_uFlags=0;
- //资源变量
- ZeroMemory(&m_szButton,sizeof(m_szButton));
- m_hButtonDC=NULL;
- m_hButtonBmp=NULL;
- //图片对象
- m_pButtonImage=NULL;
- //GDI+初始化
- GdiplusStartupInput m_GdiplusStartupInput;
- ULONG_PTR m_GdiplusToken;
- token=GdiplusStartup(&m_GdiplusToken, &m_GdiplusStartupInput, NULL);
- }
- //析构函数
- CSkinButtonpng::~CSkinButtonpng()
- {
- if(m_hButtonDC){::DeleteDC(m_hButtonDC);m_hButtonDC=NULL;}
- if(m_hButtonBmp){::DeleteObject(m_hButtonBmp);m_hButtonBmp=NULL;}
- //清除使用
- GdiplusShutdown(token);
- }
- //创建按钮
- BOOL CSkinButtonpng::CreateButton(LPCTSTR lpszCaption,DWORD dwStyle,int x, int y,CWnd* pParentWnd,UINT uID)
- {
- return Create(lpszCaption, dwStyle, CRect(x, y, x+1, y+1), pParentWnd, uID);
- }
- //加载图片
- bool CSkinButtonpng::SetButtonImage( LPCTSTR pszFileName )
- {
- //设置按钮
- SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW);
- //根据传入的图片地址,加载图片
- CT2CW strFileName(pszFileName);
- m_pButtonImage = Image::FromFile((LPCWSTR)strFileName);
- ASSERT(m_pButtonImage);if (m_pButtonImage==NULL)return FALSE;
- //获取图片大小
- m_szButton.cx = m_pButtonImage->GetWidth()/STATE_COUNT;
- m_szButton.cy = m_pButtonImage->GetHeight();
- //不移动X,Y坐标,不改变Z序,不重绘,仅改变窗口大小
- SetWindowPos(NULL, 0, 0, m_szButton.cx,m_szButton.cy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW);
- return TRUE;
- }
- //加载图片
- bool CSkinButtonpng::SetButtonImage( HINSTANCE hInstance, LPCTSTR pszResourceName )
- {
- //设置按钮
- SetButtonStyle(GetButtonStyle()|BS_OWNERDRAW);
- //加载判断
- ASSERT(m_pButtonImage==NULL);
- if (m_pButtonImage!=NULL) return false;
- //查找资源
- HRSRC hResource=FindResource(hInstance,pszResourceName,TEXT("PNG"));
- if (hResource==NULL) return false;
- //读取资源
- DWORD dwImageSize=SizeofResource(hInstance,hResource);
- LPVOID pImageBuffer=LoadResource(hInstance,hResource);
- //创建数据
- IStream * pIStream=NULL;
- if (CreateStreamOnHGlobal(NULL,TRUE,&pIStream)!=S_OK)
- {
- ASSERT(FALSE);
- return false;
- }
- //写入数据
- pIStream->Write(pImageBuffer,dwImageSize,NULL);
- //创建位图
- m_pButtonImage=Image::FromStream(pIStream);
- //释放资源
- SafeRelease(pIStream);
- //错误判断
- if ((m_pButtonImage==NULL)||(m_pButtonImage->GetLastStatus()!=Ok))
- {
- ASSERT(FALSE);
- return false;
- }
- //获取图片大小
- m_szButton.cx = m_pButtonImage->GetWidth()/STATE_COUNT;
- m_szButton.cy = m_pButtonImage->GetHeight();
- //不移动X,Y坐标,不改变Z序,不重绘,仅改变窗口大小
- SetWindowPos(NULL, 0, 0, m_szButton.cx,m_szButton.cy, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW);
- return TRUE;
- }
- //创建消息
- int CSkinButtonpng::OnCreate( LPCREATESTRUCT lpCreateStruct )
- {
- if (__super::OnCreate(lpCreateStruct) == -1)return -1;
- return 0;
- }
- //绘画背景
- BOOL CSkinButtonpng::OnEraseBkgnd( CDC *pDC )
- {
- return TRUE;
- }
- //绘画函数
- VOID CSkinButtonpng::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
- {
- //变量定义
- Graphics graphics(lpDrawItemStruct->hDC);
- //按钮状态
- bool bDisable=((lpDrawItemStruct->itemState&ODS_DISABLED)!=0);
- bool bButtonDown=((lpDrawItemStruct->itemState&ODS_SELECTED)!=0);
- if (bDisable)m_uState=STATE_DISABLE;
- if (bButtonDown)m_uState=STATE_DOWN;
- //绘画按钮
- graphics.DrawImage(m_pButtonImage
- , Gdiplus::Rect(0, 0, m_szButton.cx,m_szButton.cy)
- , m_uState * m_szButton.cx
- , 0
- , m_szButton.cx
- , m_szButton.cy
- , Gdiplus::UnitPixel
- , NULL
- , NULL
- , NULL);
- }
- ////鼠标按钮
- //void CSkinButtonpng::OnLButtonDown( UINT, CPoint )
- //{
- // m_uState = STATE_DOWN;
- // Invalidate();
- // return;
- //}
- //
- ////鼠标抬起
- //void CSkinButtonpng::OnLButtonUp( UINT ,CPoint )
- //{
- // m_uState = STATE_NONE;
- // Invalidate();
- // return;
- //}
- //鼠标移动
- void CSkinButtonpng::OnMouseMove( UINT, CPoint )
- {
- m_uState = STATE_MOVE;
- Invalidate();
- TRACKMOUSEEVENT te = {sizeof(TRACKMOUSEEVENT) ,TME_LEAVE ,m_hWnd, 1};
- ::_TrackMouseEvent(&te);
- }
- //鼠标离开
- void CSkinButtonpng::OnMouseLeave()
- {
- m_uState = STATE_NONE;
- Invalidate();
- }
- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 0
- 自制button
- 自制Radio Button
- 自制
- button.
- button
- button
- button
- button
- button
- Button
- button
- Button
- Button
- button
- button
- Button
- Button
- Button
- HTTP 协议入门
- editText设置密码隐藏和显示
- Android 极光推送(JPush)
- bootstrap中关于缩略图大小不一
- Oracle 11g grid 日志的目录结构
- 自制button
- hdu1282-回文数猜想
- Python基础学习--第十四章(定制类)
- java常用英文翻译
- Android之注解框架Annotations从配置到简单一个demo
- N皇后问题
- Android拍照,选择本地图片
- Clang之语法抽象树AST
- rsync+inotify实现服务器之间文件实时同步