VC++实现切换按钮
来源:互联网 发布:移动数据流量包退订 编辑:程序博客网 时间:2024/06/07 17:57
VC++实现切换按钮
有时候要实现两个选项的切换,常规做法1是放两个Radio按钮控件,并设置这两个按钮为一组。2是放一个Check按钮控件。但感觉都不是那么理想和直观。有没有更好的实现方式呢?下面将给你介绍一种我自绘的控件,我把它命名为“切换控件”(SwitchButton)。实现的效果如下图实现,给你一个多的选择,以供参考。
下面是实现源码:
/////////////////////////////// 说明文件///////////////////////////////////////////////文件:SwitchBtn.h ////功能:切换按钮类,实现两个选项一个按钮实现,自绘实现。 ////作者:cbNotes(http://blog.csdn.net/cbnotes) ////版本:1.0.0 ////时间:2013-01-23 ////备注:该控件类免费开源,欢迎大家使用和改进。但请保持该说明文件的完整和原创性 ///////////////////////////////////////////////////////////////////////////////////////#pragma once// CSwitchBtnclass CSwitchBtn : public CWnd{DECLARE_DYNAMIC(CSwitchBtn)public:CSwitchBtn();virtual ~CSwitchBtn();private:int m_nID; //控件IDCWnd *m_pParentWnd; //父窗口指针BOOL m_bAnimation; //是否动画标记BOOL m_bLeft; //是否选择左边标记CString m_szLeftText,m_szRightText;COLORREF m_clrNorText,m_clrHotText;//文字颜色COLORREF m_clrNorBG,m_clrHotBG; //背景颜色COLORREF m_clrNorBorder,m_clrHotBorder;//边框颜色int m_ngap;//间隔protected:DECLARE_MESSAGE_MAP()public://自绘按钮afx_msg void OnPaint();//按钮按钮释放消息处理,主要是发送消息afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg BOOL OnEraseBkgnd(CDC* pDC);//设置按钮上的文字void SetText(CString szLeft,CString szRight);// 选择哪个选项void SetSelect(bool bLeft);// 设置背景色void SetBKColor(COLORREF clrBackGround);// 设置滑块的颜色void SetSliderColor(COLORREF clrSider);// 设置文本的颜色void SetTextColor(COLORREF clrText);//设置选择文本的颜色void SetHotTextColor(COLORREF clrHotText);//设置外边框的颜色void SetBorderColor(COLORREF clrBorder);//设置滑块边框的颜色void SetSliderBorderColor(COLORREF clrSliderBorder);// 动态创建按钮bool CreateButton(CRect rt,CWnd *pParentWnd,int nID);// 初始化按钮void InitButton(CString szLeft,CString szRight,bool bLeft = true);};
/////////////////////////////// 说明文件///////////////////////////////////////////////文件:SwitchBtn.cpp ////功能:切换按钮类,实现两个选项一个按钮实现,自绘实现。 ////作者:cbNotes(http://blog.csdn.net/cbnotes) ////版本:1.0.0 ////时间:2013-01-23 ////备注:该控件类免费开源,欢迎大家使用和改进。但请保持该说明文件的完整和原创性 ///////////////////////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "SwitchBtnTest.h"#include "SwitchBtn.h"// CSwitchBtnIMPLEMENT_DYNAMIC(CSwitchBtn, CWnd)CSwitchBtn::CSwitchBtn(){m_pParentWnd = NULL;m_bAnimation = FALSE;m_bLeft = TRUE;m_szLeftText = "左边";m_szRightText = "右边";m_clrNorText = RGB(0,0,0);//文字颜色m_clrHotText = RGB(255,255,255);m_clrNorBG = RGB(200,200,200);//背景颜色 m_clrHotBG = RGB(254,184,66);m_clrNorBorder = RGB(128,128,128);//边框颜色m_clrHotBorder = RGB(0,0,255);m_ngap =10;//间隔}CSwitchBtn::~CSwitchBtn(){}BEGIN_MESSAGE_MAP(CSwitchBtn, CWnd)ON_WM_PAINT()ON_WM_LBUTTONUP()ON_WM_ERASEBKGND()END_MESSAGE_MAP()// CSwitchBtn 消息处理程序// 初始化按钮void CSwitchBtn::InitButton(CString szLeft,CString szRight,bool bLeft){m_szLeftText = szLeft;m_szRightText = szRight;m_bLeft = bLeft;}// 动态创建按钮bool CSwitchBtn::CreateButton(CRect rt,CWnd *pParentWnd,int nID){if (!pParentWnd){return false;}m_pParentWnd = pParentWnd;m_nID = nID;//用于消息的标识return Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rt,pParentWnd,nID);}void CSwitchBtn::OnPaint(){CPaintDC dc(this); // device context for painting// TODO: 在此处添加消息处理程序代码// 不为绘图消息调用 CWnd::OnPaint()CRect winrt;GetClientRect(&winrt);CDC memDC;memDC.CreateCompatibleDC(&dc);CBitmap bmp;bmp.CreateCompatibleBitmap(&dc,winrt.Width(),winrt.Height());memDC.SelectObject(&bmp);memDC.FillSolidRect(winrt,RGB(240,240,240));////背景CBrush norbgbrush,hotbgbrush;//norbgbrush.CreateSolidBrush(m_clrNorBG);hotbgbrush.CreateSolidBrush(m_clrHotBG);CBrush* pOldBrush = memDC.SelectObject(&norbgbrush);//边框CPen norborderpen,hotborderpen;norborderpen.CreatePen(PS_SOLID, 2, m_clrNorBorder);hotborderpen.CreatePen(PS_SOLID, 1, m_clrHotBorder);CPen* pOldPen = memDC.SelectObject(&norborderpen);CFont font;font.CreatePointFont(160,"宋体");memDC.SelectObject(&font);memDC.SetBkMode(TRANSPARENT);CRect leftrt,rightrt;leftrt = rightrt = winrt;leftrt.right=leftrt.left+winrt.Width()/2-m_ngap/2;leftrt.DeflateRect(3,3,2,2);rightrt.left=rightrt.right-winrt.Width()/2+m_ngap/2;rightrt.DeflateRect(3,3,2,2);//CRect rt = winrt;rt.DeflateRect(2,2,0,0);if(!m_bAnimation){//画背景memDC.RoundRect(&rt,CPoint(17,17));//焦点背景pOldBrush = memDC.SelectObject(&hotbgbrush);pOldPen = memDC.SelectObject(&hotborderpen);if (m_bLeft){//memDC.RoundRect(&leftrt,CPoint(17,17));} else{memDC.RoundRect(&rightrt,CPoint(17,17));}//写文字if (m_bLeft){ //左边文字memDC.SetTextColor(m_clrHotText);memDC.DrawText(m_szLeftText,m_szLeftText.GetLength(),&leftrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);//右边文字memDC.SetTextColor(m_clrNorText);memDC.DrawText(m_szRightText,m_szRightText.GetLength(),&rightrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);}else{memDC.SetTextColor(m_clrNorText);memDC.DrawText(m_szLeftText,m_szLeftText.GetLength(),&leftrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);memDC.SetTextColor(m_clrHotText);memDC.DrawText(m_szRightText,m_szRightText.GetLength(),&rightrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);}dc.BitBlt(0,0,winrt.Width(),winrt.Height(),&memDC,0,0,SRCCOPY);}else{//动画切换CRect rr= winrt;rr.DeflateRect(2,2,0,0);if (m_bLeft){//往左rt = rightrt;while(rt.left>winrt.left+3){pOldBrush =memDC.SelectObject(&norbgbrush);pOldPen = memDC.SelectObject(&norborderpen);memDC.RoundRect(&rr,CPoint(17,17));rt.OffsetRect(CPoint(-5,0));pOldPen = memDC.SelectObject(&hotborderpen);pOldBrush = memDC.SelectObject(&hotbgbrush);memDC.RoundRect(&rt,CPoint(17,17));//写文字 //左边文字memDC.SetTextColor(m_clrHotText);memDC.DrawText(m_szLeftText,m_szLeftText.GetLength(),&leftrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);//右边文字memDC.SetTextColor(m_clrNorText);memDC.DrawText(m_szRightText,m_szRightText.GetLength(),&rightrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);dc.BitBlt(0,0,winrt.Width(),winrt.Height(),&memDC,0,0,SRCCOPY);Sleep(10);}} else{//往右rt = leftrt;while(rt.right<winrt.right-3){pOldBrush =memDC.SelectObject(&norbgbrush); pOldPen = memDC.SelectObject(&norborderpen);memDC.RoundRect(&rr,CPoint(17,17));rt.OffsetRect(CPoint(5,0));pOldPen = memDC.SelectObject(&hotborderpen);pOldBrush = memDC.SelectObject(&hotbgbrush);memDC.RoundRect(&rt,CPoint(17,17));//写文字memDC.SetTextColor(m_clrNorText);memDC.DrawText(m_szLeftText,m_szLeftText.GetLength(),&leftrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE); memDC.SetTextColor(m_clrHotText);memDC.DrawText(m_szRightText,m_szRightText.GetLength(),&rightrt,DT_VCENTER|DT_CENTER|DT_SINGLELINE);dc.BitBlt(0,0,winrt.Width(),winrt.Height(),&memDC,0,0,SRCCOPY);Sleep(10);}}m_bAnimation = FALSE;}bmp.DeleteObject();norbgbrush.DeleteObject();hotbgbrush.DeleteObject();norborderpen.DeleteObject();hotborderpen.DeleteObject(); font.DeleteObject();memDC.DeleteDC();}void CSwitchBtn::OnLButtonUp(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CRect rt;GetClientRect(&rt);CRect leftrt,rightrt;leftrt = rightrt =rt;leftrt.right=leftrt.left+rt.Width()/2-m_ngap/2;leftrt.DeflateRect(2,2,2,2);rightrt.left=rightrt.right-rt.Width()/2+m_ngap/2;rightrt.DeflateRect(2,2,2,2);if (m_bLeft){if (rightrt.PtInRect(point)){m_bLeft = FALSE;m_bAnimation = TRUE;m_pParentWnd->SendMessage(m_nID,1,0); Invalidate();}} else{if (leftrt.PtInRect(point)){m_bLeft = TRUE;m_bAnimation = TRUE;m_pParentWnd->SendMessage(m_nID,0,0);Invalidate();}}CWnd::OnLButtonUp(nFlags, point);}BOOL CSwitchBtn::OnEraseBkgnd(CDC* pDC){// TODO: 在此添加消息处理程序代码和/或调用默认值 return FALSE;//return CWnd::OnEraseBkgnd(pDC);}void CSwitchBtn::SetText(CString szLeft,CString szRight){m_szLeftText = szLeft;m_szRightText = szRight;}// 选择哪个选项void CSwitchBtn::SetSelect(bool bLeft){m_bLeft = bLeft;}// 设置背景色void CSwitchBtn::SetBKColor(COLORREF clrBackGround){m_clrNorBG = clrBackGround;}// 设置滑块的颜色void CSwitchBtn::SetSliderColor(COLORREF clrSider){m_clrHotBG = clrSider;}// 设置文本的颜色void CSwitchBtn::SetTextColor(COLORREF clrText){m_clrNorText = clrText;}//设置选择文本的颜色void CSwitchBtn::SetHotTextColor(COLORREF clrHotText){m_clrHotText = clrHotText;}//设置外边框的颜色void CSwitchBtn::SetBorderColor(COLORREF clrBorder){m_clrNorBorder = clrBorder;}//设置滑块边框的颜色void CSwitchBtn::SetSliderBorderColor(COLORREF clrSliderBorder){m_clrHotBorder = clrSliderBorder;}
测试代码如下:
CSwitchBtn m_btn1;CSwitchBtn m_btn2; //按钮1m_btn1.CreateButton(CRect(20,10,200,50),this,WM_SWITCHBTN1);m_btn1.SetText("打开","关闭"); //按钮2m_btn2.CreateButton(CRect(20,65,200,105),this,WM_SWITCHBTN2);m_btn2.InitButton("选项一","选项二",false);//设置颜色m_btn2.SetBKColor(RGB(111,222,20));m_btn2.SetSliderColor(RGB(250,0,0));m_btn2.SetBorderColor(RGB(0,250,250));m_btn2.SetSliderBorderColor(RGB(200,200,200));m_btn2.SetTextColor(RGB(100,100,100));m_btn2.SetHotTextColor(RGB(255,2550,0));
控件源码(包括测试源码)打包下载地址:http://download.csdn.net/detail/cbnotes/5022058
欢迎大家多多批评指正,有任何意见和改进请留言,谢谢。
===========================================
转载请标明出处,谢谢。http://blog.csdn.net/cbNotes
===========================================
- VC++实现切换按钮
- VC按钮切换界面
- VC按钮切换界面
- 切换CSS实现开/关按钮切换
- ViewAnimator实现按钮切换动画
- vc 双击按钮实现关闭
- 用图像置换方法实现切换按钮
- JavaScript 两个按钮,实现图片的切换
- Android_UI_点击按钮切换背景效果实现
- Android_UI_点击按钮切换背景效果实现
- Android_UI_点击按钮切换背景效果实现
- Android_UI_点击按钮切换背景效果实现
- Android 图片实现按钮点击切换效果
- Android Fragment实现按钮间的切换
- Android_UI_点击按钮切换背景效果实现
- Android 图片实现按钮点击切换效果
- 通过点击按钮实现ViewPager的切换
- 点击按钮实现图片的切换
- Js获取当前日期时间及其它操作
- 802.11i认证机制概述
- Android框架浅析之锁屏(Keyguard)机制原理
- Android、JUnit深入浅出(七)——总结篇 By: 海市蜃楼 | In: Android开发 6 十一 2009 在学习Android、JUnit的过程中,随着学习的深入,将Androi
- Android基础 - 对话框和浮动Activity
- VC++实现切换按钮
- wince 模拟器无法联网的解决办法
- GEF常见问题6:使用对话框
- 哈佛图书馆的二十条训言
- javascript实现tab滑动门,简单原理
- live555客户端发送TEARDOEN退出
- mysql-innodb-undo和redo (1)
- UEX 3.3.0.4 For Ubuntu 试用期30天到期的解决办法
- FireBug lite,在线网页调试工具