GDI+绘制一个关闭按钮
2014-10-22 14:23
281 查看
正在自绘一个ListViewCtrl控件,ListItem需要一个AutoHideCloseBtn,用到了一点数学计算,感觉有点意思 :)
先贴上按钮效果:
![](http://img.blog.csdn.net/20141022142432515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ua2hhdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
一点数学分析
示意图:
![](http://img.blog.csdn.net/20141022143904336?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ua2hhdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其中左上角的点的坐标(圆心坐标为(x0, y0), 半径为r0):
![](http://img.blog.csdn.net/20141022143717078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ua2hhdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
其他点类似推出,主要是正方形太特殊了,都是45°,所以特别的简单。
最终的按钮效果:
![](http://img.blog.csdn.net/20141022144325979?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSG9ua2hhdA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
附录1 关闭按钮绘制相关代码:
附录2 数学分析图的简单代码:
先贴上按钮效果:
一点数学分析
示意图:
其中左上角的点的坐标(圆心坐标为(x0, y0), 半径为r0):
其他点类似推出,主要是正方形太特殊了,都是45°,所以特别的简单。
最终的按钮效果:
附录1 关闭按钮绘制相关代码:
void DrawSkyRoundEarthSquare(Graphics& g) { Color oColor(97, 102, 114); SolidBrush oBkBrush(oColor); //(97,102,114) Rect rcBtn; rcBtn.X = 100; rcBtn.Y = 100; rcBtn.Width = 50; rcBtn.Height = 50; g.FillEllipse(&oBkBrush, rcBtn); Pen oWhitePen(Color::White, 1.7F); double x0 = rcBtn.X + rcBtn.Width / 2.0; double y0 = rcBtn.Y + rcBtn.Height / 2.0; double r0 = rcBtn.Width / 2.0; PointF pt1; pt1.X = x0 - sqrt(2.0) / 2.0 * r0 + 1.0; //(x0-sqrt(2)/2*r0, y0-sqrt(2)/2*r0) (x0,y0)为圆心 r0为半径 1.0为padding pt1.Y = y0 - sqrt(2.0) / 2.0 * r0 + 1.0; PointF pt2; pt2.X = x0 + sqrt(2.0) / 2.0 * r0 - 1.0; pt2.Y = y0 + sqrt(2.0) / 2.0 * r0 - 1.0; g.DrawLine(&oWhitePen, pt1, pt2); //pt1.X = x0 - sqrt(2.0) / 2.0 * r0; pt1.Y = y0 + sqrt(2.0) / 2.0 * r0 - 1.0; pt2.Y = y0 - sqrt(2.0) / 2.0 * r0 + 1.0; g.DrawLine(&oWhitePen, pt1, pt2); }
附录2 数学分析图的简单代码:
void DrawSkyRoundEarthSquare2(Graphics& g) { RectF oRect; oRect.X = 200.0f; oRect.Y = 200.0f; oRect.Width = 200.0f; oRect.Height = 200.0f; //draw bkground SolidBrush oBkBrush(Color::Gray); g.FillRectangle(&oBkBrush, oRect); //"□" and "〇" Pen oWirePen(Color::Blue); g.DrawRectangle(&oWirePen, oRect); Pen oArcPen(Color::Magenta); g.DrawEllipse(&oArcPen, oRect); // 90-->0 绘不出来(DrawArc()第二个参数是跨度!!逆时针) //init "+" line points PointF oPt1; oPt1.X = oRect.X; oPt1.Y = oRect.Y + oRect.Height / 2.0f; PointF oPt2; oPt2.X = oRect.X + oRect.Width; oPt2.Y = oPt1.Y; PointF oPt3; oPt3.X = oRect.X + oRect.Width / 2.0f; oPt3.Y = oRect.Y; PointF oPt4; oPt4.X = oPt3.X; oPt4.Y = oRect.Y + oRect.Height; g.DrawLine(&oWirePen, oPt1, oPt2); g.DrawLine(&oWirePen, oPt3, oPt4); //init "×" line points PointF ptCenter; ptCenter.X = oRect.X + oRect.Width / 2.0f; ptCenter.Y = oRect.Y + oRect.Height / 2.0f; REAL r0 = oRect.Width / 2.0f; //radius PointF ptLeft; ptLeft.X = ptCenter.X - sqrt(2.0) / 2.0f * r0; ptLeft.Y = ptCenter.Y - sqrt(2.0) / 2.0f * r0; PointF ptRight; ptRight.X = ptCenter.X + sqrt(2.0) / 2.0f * r0; ptRight.Y = ptCenter.Y + sqrt(2.0) / 2.0f * r0; Pen oSpecPen(Color::Red); g.DrawLine(&oSpecPen, ptLeft, ptRight); ptLeft.Y = ptCenter.Y + sqrt(2.0) / 2.0f * r0; ptRight.Y = ptCenter.Y - sqrt(2.0) / 2.0f * r0; g.DrawLine(&oSpecPen, ptLeft, ptRight); }
相关文章推荐
- 创建一个在标题栏中没有“关闭”按钮的 HTA
- 如何禁用窗口关闭按钮在一个 MFC 多文档界面 (MDI) 应用程序
- 在C++/MFC框架应用程序里,当浮动工具条被拖离主窗口后,一般都有一个“关闭”按钮,
- 如何在datagridview 的head上绘制一个全选按钮
- Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
- GDI+绘制的一个Report Designer原型
- 如何禁用窗口关闭按钮在一个 MFC 多文档界面 (MDI) 应用程序
- 下拉列表select onChange 就出现一个相关option 的text的带自关闭按钮的js 代码
- 使用GDI+绘制的360风格按钮控件
- 在mfc中,如何设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体 分类: MFC
- 判断IE的关闭按钮的一个问题
- 点击按钮,弹出一个可关闭的层窗口,网页背景变灰
- 用GDI+模仿Kaxaml的关闭按钮
- 用GDI+绘制了一个钟表盘的类似物,显示当前的时间
- Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
- 在mfc中,设置一个隐藏菜单栏,工具栏,状态栏,最大化、最小化、关闭按钮的窗体
- 重新绘制TabControl的Tabpage标签,添加图片及关闭按钮
- WinForm——把一个窗体的关闭按钮去掉
- 在窗体上增加一个按钮,并设置按钮显示文字为“结束程序”。单击该按钮显示如下消息框,若选择是,则结束程序,否则只是关闭消息框。
- 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框