送分!分享圆角按钮解决办法
送分!分享圆角按钮
方案:
重写虚函数DrawItem
先创一个圆角矩型CreateRoundRectRgn.
然后把按钮区域设置在刚建的圆角矩型区域内SetWindowRgn.
最后把按钮画出来RoundRect.
其中,
函数 SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,可以是CreateRectRgn(),CreatePolyRgn(),CreatePolygonRgn(),CreateRoundRectRgn()和 CreateEllipticRgn(),等.
重写虚函数
响应鼠标
这里要注意的地方就是DrawItem是虚函数,而不是消息OnDrawItem.
另外要将OwnerDraw设为true;
------解决方案--------------------
学习
回复内容 回复内容太短了!
回复内容 回复太快,请先休息一下!
------解决方案--------------------
接分。。。
------解决方案--------------------
学习,还有分加,不错!!!
------解决方案--------------------
楼主是做界面工作的吗?
------解决方案--------------------
分享的统统要顶起学习
------解决方案--------------------
学习,还有分加,不错!!!
------解决方案--------------------
有分 必须接
------解决方案--------------------
方案:
重写虚函数DrawItem
先创一个圆角矩型CreateRoundRectRgn.
然后把按钮区域设置在刚建的圆角矩型区域内SetWindowRgn.
最后把按钮画出来RoundRect.
其中,
函数 SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,可以是CreateRectRgn(),CreatePolyRgn(),CreatePolygonRgn(),CreateRoundRectRgn()和 CreateEllipticRgn(),等.
- C/C++ code
#pragma once // CCustomButton class CCustomButton : public CButton { DECLARE_DYNAMIC(CCustomButton) public: CCustomButton(); virtual ~CCustomButton(); protected: DECLARE_MESSAGE_MAP() public: // afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct); public: BOOL m_IsPressed;//鼠标是否按下 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg BOOL OnEraseBkgnd(CDC* pDC); CBrush m_Brush; virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/); };
- C/C++ code
CCustomButton::CCustomButton() { m_IsPressed = FALSE; }
重写虚函数
- C/C++ code
void CCustomButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 CRect rect; //GetClientRect(&rect); //得到原先按扭区域 rect = lpDrawItemStruct->rcItem; CDC dc; //连接到设备环境,(我喜欢称设备上下文为设备环境) dc.Attach(lpDrawItemStruct->hDC); m_Brush.CreateStockObject(NULL_BRUSH); dc.SelectObject(&m_Brush); if(m_IsPressed)//鼠标按下 { CPen pen(PS_SOLID,2,RGB(255,100,0)); //选择画笔 dc.SelectObject(&pen); //创建圆角矩型 HRGN h_rgn = CreateRoundRectRgn(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height()); //设置按钮区域 SetWindowRgn(h_rgn,TRUE); //圆出按钮 dc.RoundRect(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height()); dc.SetTextColor(RGB(255,100,0)); } else//鼠标没有按下 { CPen pen(PS_SOLID,2,RGB(198,198,198)); dc.SelectObject(&pen); HRGN h_rgn = CreateRoundRectRgn(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height()); SetWindowRgn(h_rgn,TRUE); dc.RoundRect(0,0,rect.right,rect.bottom,rect.Width()/2,rect.Height()); dc.SetTextColor(RGB(255,100,0)); } CString str; GetWindowText(str); //写上文本 dc.DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); 删除设备环境 dc.DeleteDC(); }
响应鼠标
- C/C++ code
void CCustomButton::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 m_IsPressed = FALSE; CButton::OnLButtonUp(nFlags, point); } BOOL CCustomButton::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return CButton::OnEraseBkgnd(pDC); }
这里要注意的地方就是DrawItem是虚函数,而不是消息OnDrawItem.
另外要将OwnerDraw设为true;
------解决方案--------------------
学习
回复内容 回复内容太短了!
回复内容 回复太快,请先休息一下!
------解决方案--------------------
接分。。。
------解决方案--------------------
学习,还有分加,不错!!!
------解决方案--------------------
楼主是做界面工作的吗?
------解决方案--------------------
分享的统统要顶起学习
------解决方案--------------------
学习,还有分加,不错!!!
------解决方案--------------------
有分 必须接
------解决方案--------------------