GDI+ 绘制砂岩含量图版
图版是在工作中经常会使用到的工具,它能够大大提高我们日常工作效率。地质图版在地质工作中具有举足轻重的作用,不仅可以轻松判断岩性,也可以依据经验图版直接得到结果,十分方便。
本程序目的绘制出一个地质常用三角图版:砂岩含量图版。图版的每个角代表每种含量,目标图版如下:
程序源代码下载地址见文章末尾。

首先建立一个TrianglePlate类。确定TrianglePlate类的属性两个:三角形中心(Center)和三角形边长(SideLength)。
/// <summary>
/// 三角形图版内心
/// </summary>
public PointF Center { set; get; } /// <summary>
/// 三角形图版边长
/// </summary>
public float SideLength { get; set; }
定义一个PointF数组代表三角形图版三个点的具体坐标,采用PointF类型的原因是PointF比Point更加精确,能够保证图像的精度。为了对类进行封装,坐标数组采用private类型。
private PointF[] _points;
TrianglePlate类的构造函数如下:
public TrianglePlate(PointF center, float sidelength)
{
this.Center = center;
this.SideLength = sidelength;
this.Scale = sacle; //计算三个点
_points = new PointF[];
_points[] = new PointF(this.Center.X - this.SideLength/,
(float) (this.Center.Y - this.SideLength/(*Math.Sqrt()))
);
_points[] = new PointF(this.Center.X + this.SideLength/,
(float) (this.Center.Y - this.SideLength/(*Math.Sqrt()))
);
_points[] = new PointF(this.Center.X,
(float) (this.Center.Y - *this.SideLength/(Math.Sqrt()))
);
}
为了更好绘制图形,向TrianglePlate类加入DrawTrianglePlate方法,方便图形的绘制。
/// <summary>
/// 绘制三角形图版
/// </summary>
public void DrawTrianglePlate (Graphics g)
{
DrawSildes (g);
} /// <summary>
/// 绘制三角形图版三边
/// </summary>
private void DrawSildes (Graphics g)
{
g.DrawLine (this.SidePen, _points[], _points[]);
g.DrawLine (this.SidePen, _points[], _points[]);
g.DrawLine (this.SidePen, _points[], _points[]);
}
在From进行TrianglePlate初始化后,就可以调用Form的Paint函数进行绘制了。
public FrmMain()
{
InitializeComponent();
tp.SidePen = new Pen (Color.Black, );
tp.SidePen.StartCap = LineCap.Round;
tp.SaclePen = new Pen (Color.Black, ); } TrianglePlate tp = new TrianglePlate (new PointF (, ), ); private void tabPage1_Paint (object sender, PaintEventArgs e)
{
Graphics g = e.Graphics;
tp.DrawTrianglePlate (g, pcoursor); myBuffer.Render (e.Graphics);
g.Dispose();
myBuffer.Dispose(); //释放资源
}
一个简单的三角形就绘制完成了,如下:

接下来进行绘制三角形图版的倾斜刻度线,定义一个float数组Scale用来存储刻度值,方便使用。定义一个PointF数组_scalepoints用来存储刻度线与三角形边框相交的点。
public float[] Scale { get; set; }
private PointF[] _scalepoints;
对Scale和_scalepoints的初始化操作放在构造函数DrawTrianglePlate中。修改后的构造函数如下:
public TrianglePlate (PointF center, float sidelength, float[] sacle)
{
this.Center = center;
this.SideLength = sidelength;
this.Scale = sacle; //计算三个点
_points = new PointF[];
_points[] = new PointF (this.Center.X - this.SideLength / ,
(float) (this.Center.Y - this.SideLength / ( * Math.Sqrt () ) )
);
_points[] = new PointF (this.Center.X + this.SideLength / ,
(float) (this.Center.Y - this.SideLength / ( * Math.Sqrt () ) )
);
_points[] = new PointF (this.Center.X,
(float) (this.Center.Y - * this.SideLength / (Math.Sqrt () ) )
); //计算刻度点
_scalepoints = new PointF[];
_scalepoints[] = new PointF (_points[].X + sidelength * this.Scale[], _points[].Y);
_scalepoints[] = new PointF (_points[].X + sidelength * this.Scale[], _points[].Y);
_scalepoints[] = new PointF (_points[].X + sidelength * ( - this.Scale[]), _points[].Y);
_scalepoints[] = new PointF (_points[].X + sidelength * ( - this.Scale[]), _points[].Y);
_scalepoints[] = new PointF (_points[].X - (float) (sidelength / ) * this.Scale[],
_points[].Y + (float) (sidelength * Math.Sqrt () / ) * this.Scale[]);
_scalepoints[] = new PointF (_points[].X - (float) (sidelength / ) * this.Scale[],
_points[].Y + (float) (sidelength * Math.Sqrt () / ) * this.Scale[]);
_scalepoints[] = new PointF (_points[].X + (float) (sidelength / ) * this.Scale[],
_points[].Y + (float) (sidelength * Math.Sqrt () / ) * this.Scale[]);
_scalepoints[] = new PointF (_points[].X + (float) (sidelength / ) * this.Scale[],
_points[].Y + (float) (sidelength * Math.Sqrt () / ) * this.Scale[]); _scalepoints[] = new PointF (_points[].X,
_points[].Y - (0.5f - this.Scale[]) * this.SideLength * (float) Math.Sqrt () );
_scalepoints[] = new PointF (_points[].X,
_points[].Y - (0.5f - this.Scale[]) * this.SideLength * (float) Math.Sqrt () );
_scalepoints[] =
new PointF (_scalepoints[].X - (_scalepoints[].Y - _scalepoints[].Y) / / (float) Math.Sqrt (),
(_scalepoints[].Y + _scalepoints[].Y) / );
_scalepoints[] =
new PointF (_scalepoints[].X + (_scalepoints[].Y - _scalepoints[].Y) / / (float) Math.Sqrt (),
(_scalepoints[].Y + _scalepoints[].Y) / );
}
加入DrawScale函数绘制刻度线,并在DrawTrianglePlate绘制函数进行调用。
private void DrawScale (Graphics g)
{
g.DrawLine (this.SaclePen, _scalepoints[], _scalepoints[]);
g.DrawLine (this.SaclePen, _scalepoints[], _scalepoints[]);
g.DrawLine (this.SaclePen, _scalepoints[], _scalepoints[]);
g.DrawLine (this.SaclePen, _scalepoints[], _scalepoints[]);
}
接下来对图版的刻度和文字进行绘制。
private void DrawTag (Graphics g)
{
g.DrawString ("长石", new Font ("宋体", ), Brushes.Black, new PointF (_points[].X - 25f, _points[].Y - 25f) );
g.DrawString ("岩屑", new Font ("宋体", ), Brushes.Black, new PointF (_points[].X + 5f, _points[].Y - 25f) );
g.DrawString ("石英", new Font ("宋体", ), Brushes.Black, new PointF (_points[].X - 25f, _points[].Y - 15f) ); g.DrawString ( ( - this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X, _scalepoints[].Y + ) );
g.DrawString ( ( - this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X, _scalepoints[].Y + ) );
g.DrawString ( (this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X, _scalepoints[].Y + ) );
g.DrawString ( (this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X, _scalepoints[].Y + ) ); g.DrawString ( (this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X - 25f, _scalepoints[].Y - ) );
g.DrawString ( (this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X - 25f, _scalepoints[].Y - ) ); g.DrawString ( (this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X + 5f, _scalepoints[].Y - ) );
g.DrawString ( (this.Scale[] * ).ToString(), new Font ("宋体", ), Brushes.Black,
new PointF (_scalepoints[].X + 5f, _scalepoints[].Y - ) );
}
DrawTag函数在DrawTrianglePlate绘制函数中进行调用,此时形成图形如下:


接下来是最后一步,绘制随鼠标移动的动态刻度线。目的实现结果如下:

为此,首先需要判断鼠标是否点在图版内,并获得鼠标的位置。向DrawTriangle类添加成员函数MouseIsIn。其中tpgp是一个GraphicsPath类型的变量,利用GraphicsPath提供的IsVisible函数判断鼠标是否在Path内。
public bool MouseIsIn (Graphics g, PointF pt)
{
if (tpgp.IsVisible (pt) )
{
DrawDotDial (g, pt);
return true;
} else
return false;
}
然后根据鼠标点与已知的刻度点计算得出动态刻度点坐标。
private void DrawDotDial (Graphics g, PointF pt)
{
_dials = new PointF[];
float py = _points[].Y - pt.Y;
float px = pt.X - _points[].X; _dials[] = new PointF (pt.X - py / (float) Math.Sqrt (), _points[].Y);
_dials[] = new PointF (pt.X + py / (float) Math.Sqrt (), _points[].Y);
_dials[] = new PointF ( (_dials[].X + _points[].X) / ,
_dials[].Y - (_dials[].X - _points[].X) * (float) Math.Sqrt () / );
_dials[] = new PointF ( (_points[].X + _dials[].X) / ,
_points[].Y - (_points[].X - _dials[].X) * (float) Math.Sqrt () / );
_dials[] = new PointF (_points[].X + py / (float) Math.Sqrt (),
pt.Y);
_dials[] = new PointF (_points[].X - (_dials[].X - _points[].X),
pt.Y); Pen tmpen = new Pen (Color.Black, );
tmpen.DashStyle = DashStyle.Dash; g.DrawLine (tmpen, _dials[], _dials[]);
g.DrawLine (tmpen, _dials[], _dials[]);
g.DrawLine (tmpen, _dials[], _dials[]);
}
然后在DrawTrianglePlate函数内对DrawDotDial进行调用,就完成了。
完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D; namespace Ch_地质图版
{
class TrianglePlate
{
public TrianglePlate(PointF center, float sidelength, float[] sacle)
{
this.Center = center;
this.SideLength = sidelength;
this.Scale = sacle; //计算三个点
_points = new PointF[];
_points[] = new PointF(this.Center.X - this.SideLength/,
(float) (this.Center.Y - this.SideLength/(*Math.Sqrt()))
);
_points[] = new PointF(this.Center.X + this.SideLength/,
(float) (this.Center.Y - this.SideLength/(*Math.Sqrt()))
);
_points[] = new PointF(this.Center.X,
(float) (this.Center.Y - *this.SideLength/(Math.Sqrt()))
); //计算刻度点
_scalepoints = new PointF[];
_scalepoints[] = new PointF(_points[].X + sidelength * this.Scale[], _points[].Y);
_scalepoints[] = new PointF(_points[].X + sidelength * this.Scale[], _points[].Y);
_scalepoints[] = new PointF(_points[].X + sidelength * ( - this.Scale[]), _points[].Y);
_scalepoints[] = new PointF(_points[].X + sidelength * ( - this.Scale[]), _points[].Y);
_scalepoints[] = new PointF(_points[].X - (float)(sidelength / ) * this.Scale[],
_points[].Y + (float)(sidelength * Math.Sqrt() / ) * this.Scale[]);
_scalepoints[] = new PointF(_points[].X - (float)(sidelength / ) * this.Scale[],
_points[].Y + (float)(sidelength * Math.Sqrt() / ) * this.Scale[]);
_scalepoints[] = new PointF(_points[].X + (float)(sidelength / ) * this.Scale[],
_points[].Y + (float)(sidelength * Math.Sqrt() / ) * this.Scale[]);
_scalepoints[] = new PointF(_points[].X + (float)(sidelength / ) * this.Scale[],
_points[].Y + (float)(sidelength * Math.Sqrt() / ) * this.Scale[]); _scalepoints[] = new PointF(_points[].X,
_points[].Y - (0.5f - this.Scale[]) * this.SideLength * (float)Math.Sqrt());
_scalepoints[] = new PointF(_points[].X,
_points[].Y - (0.5f - this.Scale[]) * this.SideLength * (float)Math.Sqrt());
_scalepoints[] =
new PointF(_scalepoints[].X - (_scalepoints[].Y - _scalepoints[].Y) / / (float)Math.Sqrt(),
(_scalepoints[].Y + _scalepoints[].Y) / );
_scalepoints[] =
new PointF(_scalepoints[].X + (_scalepoints[].Y - _scalepoints[].Y) / / (float)Math.Sqrt(),
(_scalepoints[].Y + _scalepoints[].Y) / ); tpgp = new GraphicsPath();
tpgp.AddLines(_points); //DrawDotDial()
} /// <summary>
/// 三角形图版内心
/// </summary>
public PointF Center { set; get; } /// <summary>
/// 三角形图版边长
/// </summary>
public float SideLength { get; set; } /// <summary>
/// 三角形图版画边笔
/// </summary>
public Pen SidePen { get; set; } public Pen SaclePen { get; set; } public float[] Scale { get; set; } private PointF[] _points; private PointF[] _scalepoints; private GraphicsPath tpgp; private PointF[] _dials; public void DrawTrianglePlate(Graphics g,PointF tms)
{
DrawSildes(g);
DrawScale(g);
DrawTag(g);
if(!tms.IsEmpty)
DrawDotDial(g, tms);
} private void DrawSildes(Graphics g)
{
g.DrawLine(this.SidePen, _points[], _points[]);
g.DrawLine(this.SidePen, _points[], _points[]);
g.DrawLine(this.SidePen, _points[], _points[]);
} private void DrawScale(Graphics g)
{
g.DrawLine(this.SaclePen, _scalepoints[], _scalepoints[]);
g.DrawLine(this.SaclePen, _scalepoints[], _scalepoints[]);
g.DrawLine(this.SaclePen, _scalepoints[], _scalepoints[]);
g.DrawLine(this.SaclePen, _scalepoints[], _scalepoints[]);
} private void DrawTag(Graphics g)
{
//g.DrawString("①", new Font("楷体", 12), Brushes.Purple, _scalepoints[4].X, _scalepoints[4].Y);
//g.DrawString("②", new Font("楷体", 12), Brushes.Purple, _scalepoints[5].X, _scalepoints[5].Y);
//g.DrawString("③", new Font("楷体", 12), Brushes.Purple, _scalepoints[6].X, _scalepoints[6].Y);
//g.DrawLine(Pens.Black, _scalepoints[8], _scalepoints[11]);
//g.DrawLine(Pens.Black, _scalepoints[9], _scalepoints[10]); //GraphicsPath gp = new GraphicsPath();
//gp.AddLines(new PointF[] {_scalepoints[4], _scalepoints[8], _scalepoints[6], _points[2]});
//g.FillPath(Brushes.Red, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[4], _scalepoints[5], _scalepoints[9], _scalepoints[8] });
//g.FillPath(Brushes.Purple, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[6], _scalepoints[8], _scalepoints[10], _scalepoints[7] });
//g.FillPath(Brushes.Pink, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[8], _scalepoints[9], _scalepoints[11], _scalepoints[10] });
//g.FillPath(Brushes.RoyalBlue, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[5], _scalepoints[9], _scalepoints[0], _points[0] });
//g.FillPath(Brushes.SkyBlue, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[9], _scalepoints[11], _scalepoints[1], _scalepoints[0] });
//g.FillPath(Brushes.Green, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[11], _scalepoints[10], _scalepoints[3], _scalepoints[2] });
//g.FillPath(Brushes.Yellow, gp); //gp = new GraphicsPath();
//gp.AddLines(new PointF[] { _scalepoints[3], _scalepoints[10], _scalepoints[7], _points[1] });
//g.FillPath(Brushes.Tomato, gp); g.DrawString("长石", new Font("宋体", ), Brushes.Black, new PointF(_points[].X - 25f, _points[].Y - 25f));
g.DrawString("岩屑", new Font("宋体", ), Brushes.Black, new PointF(_points[].X + 5f, _points[].Y - 25f));
g.DrawString("石英", new Font("宋体", ), Brushes.Black, new PointF(_points[].X - 25f, _points[].Y - 15f)); g.DrawString(( - this.Scale[]*).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X, _scalepoints[].Y+));
g.DrawString(( - this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X, _scalepoints[].Y+));
g.DrawString((this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X, _scalepoints[].Y+));
g.DrawString((this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X, _scalepoints[].Y+)); g.DrawString((this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X-25f, _scalepoints[].Y-));
g.DrawString((this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X - 25f, _scalepoints[].Y - )); g.DrawString((this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X+5f, _scalepoints[].Y - ));
g.DrawString((this.Scale[] * ).ToString(), new Font("宋体", ), Brushes.Black,
new PointF(_scalepoints[].X + 5f, _scalepoints[].Y - )); } public bool MouseIsIn(Graphics g, PointF pt)
{
if (tpgp.IsVisible(pt))
{
DrawDotDial(g, pt);
return true;
} else
return false;
} private void DrawDotDial(Graphics g,PointF pt)
{
_dials = new PointF[];
float py = _points[].Y - pt.Y;
float px = pt.X - _points[].X; _dials[] = new PointF(pt.X - py/(float) Math.Sqrt(), _points[].Y);
_dials[] = new PointF(pt.X + py/(float) Math.Sqrt(), _points[].Y);
_dials[] = new PointF((_dials[].X + _points[].X)/,
_dials[].Y - (_dials[].X - _points[].X)*(float) Math.Sqrt()/);
_dials[] = new PointF((_points[].X + _dials[].X)/,
_points[].Y - (_points[].X - _dials[].X) * (float)Math.Sqrt() / );
_dials[] = new PointF(_points[].X + py / (float)Math.Sqrt(),
pt.Y);
_dials[] = new PointF(_points[].X-(_dials[].X-_points[].X),
pt.Y); Pen tmpen = new Pen(Color.Black, );
tmpen.DashStyle = DashStyle.Dash; g.DrawLine(tmpen, _dials[], _dials[]);
g.DrawLine(tmpen, _dials[], _dials[]);
g.DrawLine(tmpen, _dials[], _dials[]); //GetContentScale(pt);
//g.DrawLine(tmpen,pt, new Point(0, 0));
} private float[] GetContentScale(PointF pt)
{
float[] content = new float[];
content[] = (_dials[].X - _points[].X)/this.SideLength;
content[] = (_points[].X - _dials[].X) / this.SideLength;
//content[1] = content[1]/this.SideLength/this.SideLength;
content[] = Math.Abs(_points[].X - _dials[].X) * Math.Abs(_points[].X - _dials[].X) +
Math.Abs(_points[].Y - _dials[].Y) * Math.Abs(_points[].Y - _dials[].Y);
content[] = content[] / this.SideLength / this.SideLength;
//content[1] = Math.Sqrt((double)content[1]);
//Math.Sqrt((double)(Math.Abs(_points[2].X - _dials[3].X)*Math.Abs(_points[2].X - _dials[3].X)) +
// (double)(Math.Abs(_points[2].Y - _dials[3].Y)*Math.Abs(_points[2].Y - _dials[3].Y)
// ))/this.SideLength;
return content;
} public string GetScaleDes(PointF pt)
{
GraphicsPath gptmp = new GraphicsPath(); gptmp.AddLines(new PointF[] {_points[], _scalepoints[], _scalepoints[], _scalepoints[]});
if (gptmp.IsVisible(pt))
return "石英砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _scalepoints[] });
if (gptmp.IsVisible(pt))
return "长石石英砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _scalepoints[] });
if (gptmp.IsVisible(pt))
return "长石岩屑质石英砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _scalepoints[] });
if (gptmp.IsVisible(pt))
return "岩屑石英砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _points[] });
if (gptmp.IsVisible(pt))
return "长石砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _scalepoints[] });
if (gptmp.IsVisible(pt))
return "碎屑质长石砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[] });
if (gptmp.IsVisible(pt))
return "混合砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _scalepoints[] });
if (gptmp.IsVisible(pt))
return "长石质岩屑砂岩"; gptmp.AddLines(new PointF[] { _scalepoints[], _scalepoints[], _scalepoints[], _points[] });
if (gptmp.IsVisible(pt))
return "岩屑砂岩"; return "";
}
}
}
程序源代码地址:http://pan.baidu.com/s/1osgAU
GDI+ 绘制砂岩含量图版的更多相关文章
- 通过GDI+绘制 验证码
只为了记录下自己的学习历程,方便日后查看 现在开始言归正传,以下为其完整代码附上 using System; using System.Collections.Generic; using Syste ...
- C#利用GDI+绘制旋转文字等效果
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现.但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少.经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经 ...
- C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤
通过上面的效果截图可以看到,重绘后的MenuStrip和ContextMenuStrip可以添加自己的LOGO信息,实现了类似OFFICE2007的菜单显示效果. .NET对菜单控件的绘制提供了一个抽 ...
- MFC 用gdi绘制填充多边形区域
MFC 用gdi绘制填充多边形区域 这里的代码是实现一个三角形的绘制,并用刷子填充颜色 在OnPaint()函数里面 运用的是给定的三角形的三个点,很多个点可以绘制多边形 CBrush br(RGB( ...
- GDI绘制时钟效果,与系统时间保持同步,基于Winform
2018年工作之余,想起来捡起GDI方面的技术,特意在RichCodeBox项目中做了两个示例程序,其中一个就是时钟效果,纯C#开发.这个CSharpQuartz是今天上午抽出一些时间,编写的,算是偷 ...
- 『备注』GDI+ 绘制文本有锯齿,透明背景文本绘制
背景: GDI+ 绘制文本 时,如果 背景是透明的 —— 则会出现 锯齿. //其实,我不用这三个 属性 好多年了 //而且,这三个属性 在关键时刻还有可能 帮倒忙 //关键是:这三个属性,鸟用都没有 ...
- C#GDI+ 绘制线段(实线或虚线)、矩形、字符串、圆、椭圆
C#GDI+ 绘制线段(实线或虚线).矩形.字符串.圆.椭圆 绘制基本线条和图形 比较简单,直接看代码. Graphics graphics = e.Graphics; //绘制实线 )) { pen ...
- C# GDI绘制仪表盘(纯代码实现)
纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...
- 如何使用GDI绘制半透明矩形
/*使用GDI绘制半透明矩形*/ void CDirectXDraw::DrawHalfOpacityRect(HDC hdc,CRect rect) { CDC dc; dc.Attach(hdc) ...
随机推荐
- A - 无聊的游戏 HDU - 1525(博弈)
A - 无聊的游戏 HDU - 1525 疫情当下,有两个很无聊的人,小A和小B,准备玩一个游戏,玩法是这样的,从两个自然数开始比赛.第一个玩家小A从两个数字中的较大者减去两个数字中较小者的任何正倍数 ...
- Q - Queue HDU - 5493(树状树组维护区间前缀和 + 二分找预留空位)
Q - Queue HDU - 5493 Problem Description NNN people numbered from 1 to NNN are waiting in a bank for ...
- python实现杨辉三角形
代码实现: # python实现杨辉三角形 def yanghui(): # 定义第一行列表为[1] line = [1] while True: # yield的作用:把一个函数变成生成器,同时返回 ...
- 1062 Talent and Virtue (25分)(水)
About 900 years ago, a Chinese philosopher Sima Guang wrote a history book in which he talked about ...
- TC1.6SourceCode java课程表
/** * @version 2.0 * @author sharks */ /** * Instruction * this version will use IO * apply file to ...
- 好玩Python——PIL项目实训
PIL学习总结: 1. 2,PIL库概述: pil库可以完成图像归档和图像处理两方面功能的需求: 图像归档:对图像进行批处理,生成图像预览,图像转换格式等: 图像处理:图像基本处理,像素处理,颜色处理 ...
- django生成验证码
django生成验证码 # 制作验证码 def verify_code(): # 1,定义变量,用于画面的背景色.宽.高 # random.randrange(20, 100)意思是在20到100之间 ...
- linux被当矿机排查案例
1.发现服务器变的特别卡,正常服务运行很慢. 到服务器上查询一番发现top下发现 bashd的进程占用100%CPU了. find /-name bashd* //第一次查询文件占用目录kil ...
- Linux服务器架设篇,DNS服务器(三),正反解区域的配置
一.大体架构 DNS服务器其实只有一个"真正"的配置文件,即 /etc/named.conf .其他的配置文件都是依据此配置展开的.每个域都需要两个配置文件,即正解文件和反解文件. ...
- 2017蓝桥杯杨辉三角(C++C组)
题目: 杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要.第0行: 1第1行: 1 1第2行: 1 2 1第3行: 1 3 ...