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) ...
随机推荐
- html中的字幕滚动marquee属性
该标签不是HTML3.2的一部分,并且只支持MSIE3以后内核,所以如果你使用非IE内核浏览器(如:Netscape)可能无法看到下面一些很有意思的效果,该标签是个容器标签. 语法: <marq ...
- P1343 地震逃生(最大流板题)
P1343 地震逃生 题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...
- P1006 传纸条(二维、三维dp)
P1006 传纸条 输入输出样例 输入 #1 复制 3 3 0 3 9 2 8 5 5 7 0 输出 #1 复制 34 说明/提示 [限制] 对于 30% 的数据,1≤m,n≤10: 对于 100% ...
- stm32:简单按键输入实现
开发环境keil4,芯片STM32F103C8T6 1.main.c //串口实验 #include "sys.h" #include "delay.h" #i ...
- WinForm中DataGridView复制选中单元格内容解决方案
WinForm中DataGridView鼠标选中单元格内容复制方案 1.CTR+C快捷键复制 前提:该控件ClipboardCopyMode属性设置值非Disable: 2.鼠标框选,自定义代码实现复 ...
- Linux 定时实行一次任务命令
当我们想在指定的时间自动执行 一次 任务的时候,可以使用at命令 启动服务 使用时首先检查atq的服务是否启动 service atd status # 检查atd的状态 service atd st ...
- X-Admin&ABP框架开发-版本管理
多租户系统中,针对于不同租户开放不同功能,或是按照不同功能进行收费管理,需要从宿主本身去管理租户的版本信息,如同酒店人员对不同房间收取不同费用,依据房间内部设施,房间大小等设置不同收费标准.Abp系统 ...
- JSP 简介(转载)
什么是Java Server Pages? JSP全称Java Server Pages,是一种动态网页开发技术.它使用JSP标签在HTML网页中插入Java代码.标签通常以<%开头以%> ...
- Vulnhub DC-5靶机渗透
信息搜集 老样子,先找到靶机IP和扫描靶机 nmap -sP 192.168.146.0/24 #找靶机ip nmap -sS -Pn -A 192.168.146.141 #扫描端口 这次开的是80 ...
- Ubuntu 修改$PS1 自定义命令提示符
文章更新于:2020-03-25 文章目录 一.自定义命令提示符 1.可修改的是那部分? 2.修改 $PS1 变量 3.$PS1 变量格式 4.如何修改背景颜色 5.修改字体 二.Enjoy! 一.自 ...