截图功能实现(五)自绘控件实现(button combobox)
来源:互联网 发布:淘宝网美二玖洗衣皂 编辑:程序博客网 时间:2024/06/02 03:52
截图工具条上有许多不同的按钮,比如矩形,椭圆等如图这里我采用了自绘Cbutton废话不多说直接上代码
PicButton.h
#pragma once// PicButtonclass PicButton : public CButton{DECLARE_DYNAMIC(PicButton)public:PicButton();virtual ~PicButton();virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);BOOL CreateBtn(const CPoint &pt, CWnd* pParentWnd, UINT nID, CBitmap*pBmp, int nbtnStlye = 0);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);void SetbuttonStlye(const BOOL bStlye){if (bStlye){m_nBtnStatus = BTNSTATUS_DOWN;}else{m_nBtnStatus = BTNSTATUS_NOMAL;}Invalidate(FALSE);}int GetButtonStatus() const{return m_nBtnStatus;}enum//按钮三态{ BTNSTATUS_NOMAL = 0, BTNSTATUS_OVER, BTNSTATUS_DOWN};enum//按钮类型{ NOMAL = 0, INVALID, SAVEDOWN};protected:DECLARE_MESSAGE_MAP()private:int m_nBtnStatus;int m_nBtnStyle;CImageList m_ImageList;public:afx_msg void OnLButtonUp(UINT nFlags, CPoint point);};
PicButton.cpp
/********************************************************/*/* 文件名称:PicButton.cpp/* 摘 要:图片按钮实现/* 当前版本:1.0/* 作 者:/* 创建日期:2013年5月7日星期二*********************************************************/// PicButton.cpp : 实现文件//#include "stdafx.h"#include "PicButton.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif// PicButtonIMPLEMENT_DYNAMIC(PicButton, CButton)PicButton::PicButton(){m_nBtnStatus = BTNSTATUS_NOMAL;m_nBtnStyle = NOMAL;}PicButton::~PicButton(){m_ImageList.DeleteImageList();}BEGIN_MESSAGE_MAP(PicButton, CButton)ON_WM_DRAWITEM()ON_WM_MOUSEMOVE()ON_WM_LBUTTONDOWN()ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)ON_WM_LBUTTONUP()END_MESSAGE_MAP()void PicButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){CDC BitmapDC;BitmapDC.Attach(lpDrawItemStruct->hDC);CDC memDC;memDC.CreateCompatibleDC(&BitmapDC);CBitmap bmp;bmp.LoadBitmap(IDB_BMP_BK);CBitmap *pOldBitmap = memDC.SelectObject(&bmp);CRect rtBtn(0,0,0,0);GetClientRect(&rtBtn);m_ImageList.Draw(&memDC, 0, rtBtn.TopLeft(), ILD_TRANSPARENT);if (m_nBtnStyle != 1){if (BTNSTATUS_OVER == m_nBtnStatus){m_ImageList.Draw(&memDC, 1, rtBtn.TopLeft(), ILD_TRANSPARENT);}else if (BTNSTATUS_DOWN == m_nBtnStatus){m_ImageList.Draw(&memDC, 2, rtBtn.TopLeft(), ILD_TRANSPARENT);}}BitmapDC.BitBlt(0, 0, rtBtn.Width(), rtBtn.Height(), &memDC, 0,0, SRCCOPY);memDC.SelectObject(pOldBitmap);memDC.DeleteDC();}BOOL PicButton::CreateBtn(const CPoint &pt, CWnd* pParentWnd, UINT nID, CBitmap*pBmp, int nbtnStlye /* = 0 */)//其中的图片格式是一张图片包含按钮的3个状态{BITMAP bm;pBmp->GetBitmap(&bm);m_nBtnStyle = nbtnStlye;m_ImageList.Create(bm.bmWidth / 3, bm.bmHeight, ILC_COLOR24|ILC_MASK, 3, 3);m_ImageList.Add(pBmp, RGB(0,0,255));CRect rtBtn(pt, CSize(bm.bmWidth /3, bm.bmHeight));return Create(_T(""),WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_OWNERDRAW, rtBtn, pParentWnd, nID);}// PicButton 消息处理程序void PicButton::OnMouseMove(UINT nFlags, CPoint point){TRACKMOUSEEVENT csTME;csTME.cbSize = sizeof (csTME);csTME.dwFlags = TME_LEAVE|TME_HOVER;csTME.hwndTrack = m_hWnd ;// 指定要 追踪 的窗口csTME.dwHoverTime = 5; // 鼠标在按钮上停留超过 5ms ,才认为状态为 HOVER::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持CButton::OnMouseMove(nFlags,point);}LRESULT PicButton::OnMouseHover(WPARAM wParam, LPARAM lParam){if (m_nBtnStatus != BTNSTATUS_DOWN){m_nBtnStatus = BTNSTATUS_OVER;Invalidate(FALSE);}return TRUE;}LRESULT PicButton::OnMouseLeave(WPARAM wParam, LPARAM lParam){if (m_nBtnStatus != BTNSTATUS_DOWN){m_nBtnStatus = BTNSTATUS_NOMAL;Invalidate(FALSE);}return TRUE;}void PicButton::OnLButtonDown(UINT nFlags, CPoint point){if (m_nBtnStatus != BTNSTATUS_DOWN){m_nBtnStatus = BTNSTATUS_DOWN;Invalidate(FALSE);}else{if (m_nBtnStyle == NOMAL){m_nBtnStatus = BTNSTATUS_OVER;Invalidate(FALSE);}}CButton::OnLButtonDown(nFlags,point);}void PicButton::OnLButtonUp(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CRect rect(0,0,0,0);GetClientRect(&rect);if (!rect.PtInRect(point)){m_nBtnStatus = BTNSTATUS_NOMAL;Invalidate(FALSE);}CButton::OnLButtonUp(nFlags, point);}图片示范样式
combobox自绘实现如图的combobox字号大小选中的combobox
OwnerCombobox.h
#pragma once// COwerComboboxclass COwnerCombobox : public CComboBox{DECLARE_DYNAMIC(COwnerCombobox)public:COwnerCombobox();virtual ~COwnerCombobox();enum{ NOMAL = 0, OVER, DOWN};protected:DECLARE_MESSAGE_MAP()public:afx_msg void OnPaint();afx_msg void OnLButtonDown(UINT nFlags, CPoint point);afx_msg void OnLButtonUp(UINT nFlags, CPoint point);afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);protected:void DrawShowText(CDC* pDC);private:CImageList m_ImageList;int m_nBmpWidth;int m_nBmpHight;CRect m_rtDrop;CRect m_rt;int m_nStyle;BOOL m_bptInRectDrop;};
// OwerCombobox.cpp : 实现文件//#include "stdafx.h"#include "OwnerCombobox.h"// COwerCombobox#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifIMPLEMENT_DYNAMIC(COwnerCombobox, CComboBox)COwnerCombobox::COwnerCombobox(){BITMAP bm;CBitmap bmp;bmp.LoadBitmap(IDB_BMP_COMBOB);bmp.GetBitmap(&bm);m_nBmpWidth = bm.bmWidth / 3;m_nBmpHight = bm.bmHeight;m_ImageList.Create(m_nBmpWidth, m_nBmpHight, ILC_COLOR24|ILC_MASK, 3, 3);m_ImageList.Add(&bmp, RGB(0,0,255));m_rtDrop.SetRectEmpty();m_rt.SetRectEmpty();m_bptInRectDrop = FALSE;m_nStyle = NOMAL;}COwnerCombobox::~COwnerCombobox(){}BEGIN_MESSAGE_MAP(COwnerCombobox, CComboBox)ON_WM_PAINT()ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_WM_MOUSEMOVE()ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)END_MESSAGE_MAP()// COwerCombobox 消息处理程序void COwnerCombobox::DrawShowText(CDC* pDC){//获取显示文字TCHARstrText[MAX_PATH+1];GetWindowText(strText, MAX_PATH);if (strText==NULL)return;CFont*hOldFont = pDC->SelectObject(GetFont());CSizeszExtent = pDC->GetTextExtent(strText, lstrlen(strText));intnMode = pDC->SetBkMode(TRANSPARENT);CPointpt(2, 3);pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);pDC->SelectObject(hOldFont);pDC->SetBkMode(nMode);}void COwnerCombobox::OnPaint(){// TODO: 在此处添加消息处理程序代码CPaintDC dc(this);if (m_rt.IsRectEmpty()){GetClientRect(&m_rt);m_rtDrop = CRect(CPoint(m_rt.right - m_nBmpWidth,m_rt.top), CSize(m_nBmpWidth, m_nBmpHight));}CBrush brush;brush.CreateSolidBrush(RGB(255,255,255));dc.FillRect(&m_rt,&brush);if (m_nStyle == NOMAL){m_ImageList.Draw(&dc, 0,m_rtDrop.TopLeft(), ILD_TRANSPARENT);}else if (m_nStyle == OVER){m_ImageList.Draw(&dc, 1,m_rtDrop.TopLeft(), ILD_TRANSPARENT);}else if (m_nStyle == DOWN){m_ImageList.Draw(&dc, 2,m_rtDrop.TopLeft(), ILD_TRANSPARENT);}brush.DeleteObject();CPoint pt(0,0);GetCursorPos(&pt);ScreenToClient(&pt);if (m_rt.PtInRect(pt)){CPen pen;pen.CreatePen(PS_SOLID, 1, STLYECOLOR);CPen*pOldPen = dc.SelectObject(&pen);dc.SelectStockObject(NULL_BRUSH);dc.Rectangle(&m_rt);dc.SelectObject(pOldPen);}DrawShowText(&dc);// 不为绘图消息调用 CComboBox::OnPaint()}void COwnerCombobox::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值m_nStyle = DOWN;Invalidate(FALSE);CComboBox::OnLButtonDown(nFlags, point);}void COwnerCombobox::OnLButtonUp(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值m_nStyle = NOMAL;Invalidate(FALSE);CComboBox::OnLButtonUp(nFlags, point);}void COwnerCombobox::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值TRACKMOUSEEVENT csTME;csTME.cbSize = sizeof (csTME);csTME.dwFlags = TME_LEAVE|TME_HOVER;csTME.hwndTrack = m_hWnd ;// 指定要 追踪 的窗口csTME.dwHoverTime = 5; // 鼠标在按钮上停留超过 5ms ,才认为状态为 HOVER::_TrackMouseEvent (&csTME); // 开启 Windows 的 WM_MOUSELEAVE , WM_MOUSEHOVER 事件支持CComboBox::OnMouseMove(nFlags, point);}LRESULT COwnerCombobox::OnMouseHover(WPARAM wParam, LPARAM lParam){CPoint pt(0,0);GetCursorPos(&pt);ScreenToClient(&pt);if (!m_bptInRectDrop && m_rt.PtInRect(pt)){m_bptInRectDrop = TRUE;m_nStyle = OVER;Invalidate(FALSE);}return 0;}LRESULT COwnerCombobox::OnMouseLeave(WPARAM wParam, LPARAM lParam){m_bptInRectDrop = FALSE;m_nStyle = NOMAL;Invalidate(FALSE);return 0;}图片个格式和上面的一样,我还是把图片也放上来吧
注意吧type 设置为DropList
OK2个控件的自绘就是这样很简单的说
- 截图功能实现(五)自绘控件实现(button combobox)
- MFC (2)Button控件自绘实现
- Flex控件--AdvancedDataGrid实现列头过滤功能(顺便写了Button列、CheckBox列、ComboBox列等)
- 实现自绘 ComboBox 源代码 (C#)
- Android实现简单计算器功能(Button控件实现)
- C# 实现完整功能的截图控件(1)-实现绘图工具栏控件(转载)
- 截图功能实现(三)截图放大器实现
- C# Combobox控件实现模糊查询功能
- combobox,textbox 控件实现自动提示功能
- MFC截图程序的实现(五)
- C# 实现完整功能的截图控件
- android 自定义控件实现截图框功能
- wxPython实现截图功能(一)
- wxPython实现截图功能(二)
- 使用easyUI的combobox下拉框控件实现输入提示功能(google suggest)
- Combobox的简单自绘实现
- 控件(五)——Gridview控件以SqlDataSource控件为数据源实现换肤功能
- 全屏背景实现 截图功能实现(一)
- Maven入门:开始简单的web项目
- ffmpeg+ffserver媒体服务搭建小记
- Inline Hook 之(监视任意函数)
- Struts2实现文件上传(默认拦截器篇)
- mysql备份与还原
- 截图功能实现(五)自绘控件实现(button combobox)
- IOS开发常用函数
- 大三时MySQL课程设计《MySQL集群的研究与实现》
- scp 出现错误ssh: connect to host 9.123.159.41 port 22:connection refused的解决办法
- 设计模式详解(总纲)
- 黑马程序员——java语法二
- csapp2e 家庭作业 3.56
- auto_ptr源码实现
- [C# 线程处理系列]专题五:线程同步