VC自绘三角形按钮,该如何处理
1个回答
展开全部
VC自绘三角形按钮
请问大家,网上找了个自绘三角形按钮的例子,修改了下,但是却不能绘制出来 这是为什么呢?C/C++ codeCTriangleButton::CTriangleButton() { } CTriangleButton::~CTriangleButton() { } BEGIN_MESSAGE_MAP(CTriangleButton, CButton) //{{AFX_MSG_MAP(CTriangleButton) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTriangleButton message handlers //设置按钮的有效区域 void CTriangleButton::PreSubclassWindow() { // TODO: Add your specialized code here and/or call the base class CButton::PreSubclassWindow(); //执行这句之后 会自动调用DrawItem函数 ModifyStyle(0, BS_OWNERDRAW);//激活控件的自绘功能 */ } //在DrawItem中根据按钮当前的状态绘制按钮的外观 void CTriangleButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item /* ASSERT(lpDrawItemStruct != NULL); CRect rect = lpDrawItemStruct->rcItem; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);//使用画图句柄 UINT state = lpDrawItemStruct->itemState; //按钮的初始状态 UINT nStyle = GetStyle(); */ CDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect=lpDrawItemStruct->rcItem; CPoint point[3]; point[0].x=rect.right/2;point[0].y=5; point[1].x=0;point[1].y=rect.bottom; point[2].x=rect.right;point[2].y=rect.bottom; CString str("caption"); CSize size=pDC->GetTextExtent(str); pDC->TextOutA(rect.right/2-size.cx/2,rect.bottom-size.cy,str); CRgn rgn; rgn.CreatePolygonRgn(point,3,ALTERNATE); SetWindowRgn(rgn, 1); CPen HighlightPen(PS_SOLID, 5,RGB(255,0,0) /*::GetSysColor(COLOR_3DHIGHLIGHT)*/); pDC->SelectObject(HighlightPen); pDC->MoveTo(point[0]); pDC->LineTo(point[1]); pDC->MoveTo(point[0]); pDC->LineTo(point[2]); pDC->MoveTo(point[2]); pDC->LineTo(point[1]); } ------解决方案--------------------------------------------------------setclasslong()这个函数你看下用法,然后setwindowrgn()这个函数看下,然后任意形状的按钮都能绘制出来了!代码就不给你了,否则就是不让你好好学习了!
------解决方案--------------------------------------------------------建议用CButtonST的透明贴图按钮,自己绘制一个三角形的贴图,然后直接定义全局CButtonST m_btn;
在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(按钮ID,this);
m_btn.SetIcon(位图ID);
m_btn.DrawTransparent(TRUE);
当然,这样的话,响应区域仍然会是原来放置按键的矩形范围
------解决方案--------------------------------------------------------设置个断点调试下看看
2 如果是Create的 重载Create, 风格加BS_OWNERDRAW
C/C++ code #ifndef _PNGBUTTON_H #define _PNGBUTTON_H #if _MSC_VER >= 1000 #pragma once #endif class CPngButton : public CButton { DECLARE_DYNAMIC(CPngButton) public: enum BUTTON_STATE { BUTTON_ENABLE = 0, BUTTON_HOVER = 1, BUTTON_CLICK = 2, BUTTON_DISABLE= 3 }; //按钮状态 CPngButton(); virtual ~CPngButton(); int nHeight; int nWidth; protected: afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam); afx_msg LRESULT OnMouseHover(WPARAM wparam, LPARAM lparam); Image * m_pImage; Graphics * m_pGraphics; DECLARE_MESSAGE_MAP() public: virtual void PreSubclassWindow(); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); void SetButtonImage(CString str , int nImageType = 0);//设定按钮图片及图片的截取方式0为横向截取1竖直截取 void SetText(CString strText,COLORREF color = RGB(0,0,0));//设定按钮文字和按钮颜色 afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); BOOL m_bDisable; // 按钮是否禁用 BOOL m_bCursorOnButton; // 鼠标是否在按钮上 BOOL m_bPress; // 按钮是否被按下 BOOL m_bText ; BOOL m_bClick; int m_nWidth; //图片宽 int m_nHeight; //图片高 int m_nSliceWidth; //按钮宽 int m_nSliceHeight; //按钮高 int m_nImageType; //图片形式(横?竖?
请问大家,网上找了个自绘三角形按钮的例子,修改了下,但是却不能绘制出来 这是为什么呢?C/C++ codeCTriangleButton::CTriangleButton() { } CTriangleButton::~CTriangleButton() { } BEGIN_MESSAGE_MAP(CTriangleButton, CButton) //{{AFX_MSG_MAP(CTriangleButton) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTriangleButton message handlers //设置按钮的有效区域 void CTriangleButton::PreSubclassWindow() { // TODO: Add your specialized code here and/or call the base class CButton::PreSubclassWindow(); //执行这句之后 会自动调用DrawItem函数 ModifyStyle(0, BS_OWNERDRAW);//激活控件的自绘功能 */ } //在DrawItem中根据按钮当前的状态绘制按钮的外观 void CTriangleButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item /* ASSERT(lpDrawItemStruct != NULL); CRect rect = lpDrawItemStruct->rcItem; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);//使用画图句柄 UINT state = lpDrawItemStruct->itemState; //按钮的初始状态 UINT nStyle = GetStyle(); */ CDC*pDC=CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect=lpDrawItemStruct->rcItem; CPoint point[3]; point[0].x=rect.right/2;point[0].y=5; point[1].x=0;point[1].y=rect.bottom; point[2].x=rect.right;point[2].y=rect.bottom; CString str("caption"); CSize size=pDC->GetTextExtent(str); pDC->TextOutA(rect.right/2-size.cx/2,rect.bottom-size.cy,str); CRgn rgn; rgn.CreatePolygonRgn(point,3,ALTERNATE); SetWindowRgn(rgn, 1); CPen HighlightPen(PS_SOLID, 5,RGB(255,0,0) /*::GetSysColor(COLOR_3DHIGHLIGHT)*/); pDC->SelectObject(HighlightPen); pDC->MoveTo(point[0]); pDC->LineTo(point[1]); pDC->MoveTo(point[0]); pDC->LineTo(point[2]); pDC->MoveTo(point[2]); pDC->LineTo(point[1]); } ------解决方案--------------------------------------------------------setclasslong()这个函数你看下用法,然后setwindowrgn()这个函数看下,然后任意形状的按钮都能绘制出来了!代码就不给你了,否则就是不让你好好学习了!
------解决方案--------------------------------------------------------建议用CButtonST的透明贴图按钮,自己绘制一个三角形的贴图,然后直接定义全局CButtonST m_btn;
在OnInitDialog函数中初始化按钮
m_btn.SubclassDlgItem(按钮ID,this);
m_btn.SetIcon(位图ID);
m_btn.DrawTransparent(TRUE);
当然,这样的话,响应区域仍然会是原来放置按键的矩形范围
------解决方案--------------------------------------------------------设置个断点调试下看看
2 如果是Create的 重载Create, 风格加BS_OWNERDRAW
C/C++ code #ifndef _PNGBUTTON_H #define _PNGBUTTON_H #if _MSC_VER >= 1000 #pragma once #endif class CPngButton : public CButton { DECLARE_DYNAMIC(CPngButton) public: enum BUTTON_STATE { BUTTON_ENABLE = 0, BUTTON_HOVER = 1, BUTTON_CLICK = 2, BUTTON_DISABLE= 3 }; //按钮状态 CPngButton(); virtual ~CPngButton(); int nHeight; int nWidth; protected: afx_msg LRESULT OnMouseLeave(WPARAM wparam, LPARAM lparam); afx_msg LRESULT OnMouseHover(WPARAM wparam, LPARAM lparam); Image * m_pImage; Graphics * m_pGraphics; DECLARE_MESSAGE_MAP() public: virtual void PreSubclassWindow(); virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); void SetButtonImage(CString str , int nImageType = 0);//设定按钮图片及图片的截取方式0为横向截取1竖直截取 void SetText(CString strText,COLORREF color = RGB(0,0,0));//设定按钮文字和按钮颜色 afx_msg void OnMouseMove(UINT nFlags, CPoint point); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT nFlags, CPoint point); afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message); BOOL m_bDisable; // 按钮是否禁用 BOOL m_bCursorOnButton; // 鼠标是否在按钮上 BOOL m_bPress; // 按钮是否被按下 BOOL m_bText ; BOOL m_bClick; int m_nWidth; //图片宽 int m_nHeight; //图片高 int m_nSliceWidth; //按钮宽 int m_nSliceHeight; //按钮高 int m_nImageType; //图片形式(横?竖?
东莞大凡
2024-08-07 广告
2024-08-07 广告
作为东莞市大凡光学科技有限公司的一员,我们深知Matlab圆点标定板在相机标定中的重要性。该标定板通过均匀分布的圆点,帮助精确计算相机参数,优化成像效果。Matlab强大的编程功能,使得我们能够灵活设计标定板,调整圆点大小、数量和分布,以满...
点击进入详情页
本回答由东莞大凡提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询