有正确代码立刻结贴前提:在onpaint事件中要将一个字符串打印到一个方框内。如果字符串过长超出界外则只显示方框内的。要求:在方框内可以换行,直至文本将方框全部填充。
最重要的一点:该字符串一分为二,分二批打印。但看起来像直接打印该字符串一样。
我意思是假如第一段字符串打印完,恰好打印了一行半;所以下一段字符要打印出来必须接上上一段字符串。
下面的代码实现直接将该字符打印出来:StringFormat sf = StringFormatAlignment(this.TextAlign);
Rectangle rect = new Rectangle(0, 0, 100, 100);
g.DrawString(this.Text, this.Font, new SolidBrush(this.ForeColor), rect, sf);
sf.Trimming = StringTrimming.Character;
...
Graphics graphics = Graphics.FromImage(bitmap);
Font font = new Font(字体名, 字体大小, FontStyle.Regular);
string a="123sddddddddddddd";
SizeF size = graphics.MeasureString(a, font);//可以获得打印这段字符所需大小,使用循环逐低个测试所可以打印的字体内容
//将字符变成位图
graphics.DrawString(codeResult, font, this.GetForeColor(), 0, 0);
Graphics graphics = Graphics.FromImage(bitmap);
Font font = new Font(字体名, 字体大小, FontStyle.Regular);
string a="123sddddddddddddd";
SizeF size = graphics.MeasureString(a, font);//可以获得打印这段字符所需大小,使用循环逐低个测试所可以打印的字体内容
//将字符变成位图
graphics.DrawString(codeResult, font, this.GetForeColor(), 0, 0);
Graphics graphics = Graphics.FromImage(bitmap);
Font font = new Font(字体名, 字体大小, FontStyle.Regular);
string a="123sddddddddddddd";
SizeF size = graphics.MeasureString(a, font);//可以获得打印这段字符所需大小,使用循环逐低个测试所可以打印的字体内容
//将字符变成位图
graphics.DrawString(a, font, this.GetForeColor(), 0, 0);
这样很容易便可以将你的字符串连接起来打印。具体的我也不记得了,好久没做C#。
你自己上网查一查,试一试,很简单!
[font style="font-size:15px;color:red;"]
SizeF size = graphics.MeasureString(a, font);
这种方法是得不到一个字符串的真正长度的。
[/font]
Graphics graphics = Graphics.FromImage(bitmap);
Font font = new Font(字体名, 字体大小, FontStyle.Regular);
string ="ok";
SizeF size = graphics.MeasureString(a, font);
graphics.DrawString(str, font, this.GetForeColor(), 0, 0);
StringFormat 中就可以设置这个效果,你自己试一下就知道了。
using System;
using System.IO;//用于文件存取
using System.Data;//用于数据访问
using System.Drawing;//提供画GDI+图形的基本功能
using System.Drawing.Text;//提供画GDI+图形的高级功能
using System.Drawing.Drawing2D;//提供画高级二维,矢量图形功能
using System.Drawing.Imaging;//提供画GDI+图形的高级功能namespace Drawpicture
{
/// <summary>
/// BarChart 的摘要说明。
/// </summary>
public class BarChart
{
private int Pic_Width = 410;
private int Pic_Height = 320;
public static bool hasNeg = false;
private const string FontWord = "Arial";
private const int FontSize = 9;
public int SIDE_WIDTH = 400;
public int SIDE_HEIGHT = 400;
private const int CHART_TOP = 60;
private int CHART_HEIGHT = 300;
private const int CHART_LEFT = 60;
private const int CHART_WIDTH = 300;
public void Render(string[] word,int[] data, out string fileName)
{
for(int i=0;i<data.Length;i++)
{
if(data[i]<0)
{
Pic_Height *=2;
hasNeg = true;
SIDE_HEIGHT = (int)(SIDE_HEIGHT*1.5);
CHART_HEIGHT =(int)(CHART_HEIGHT*0.3);
break;
}
}
ChartUtil cu = new ChartUtil();
PointF[] zuoBiaoStart;
PointF[] zuoBiaoEnd;
Graphics g;
Bitmap bm;
createCanvas(out bm, out g, out zuoBiaoEnd, out zuoBiaoStart,cu);
//画坐标轴
int chiDu = drawAxes(data, zuoBiaoStart, g, zuoBiaoEnd,cu);
//画条形图
float barWidth = CHART_WIDTH / (2 * 2);
PointF barOrigin = new PointF(CHART_LEFT + (barWidth / 2),0);
float barHeight = 2;
for(int i=0;i<2;i++)
{
barHeight = ((float)data[i]/chiDu) *(CHART_HEIGHT/5) ;
if(barHeight<0)
{
barOrigin.Y = CHART_TOP + CHART_HEIGHT;
}
else
{
barOrigin.Y = CHART_TOP + CHART_HEIGHT - barHeight;
}
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),barOrigin.X,barOrigin.Y,barWidth,Math.Abs(barHeight));
barOrigin.X = barOrigin.X + (barWidth * 2);
}
//画右上角的说明图形
drawInstruction(CHART_LEFT, CHART_HEIGHT, CHART_TOP, g, word, data);
//输出图形
fileName = cu.PicPath + Guid.NewGuid().ToString() + ".gif";
bm.Save(fileName, ImageFormat.Gif);
//资源回收
bm.Dispose();
g.Dispose();
}
private int drawAxes(int[] data, PointF[] zuoBiaoStart, Graphics g, PointF[] zuoBiaoEnd,ChartUtil cu)
{
int chiDu =1;
int[] t = cu.getZuoBiaoValue(data,out chiDu);
for(int i=0;i<zuoBiaoStart.Length;i++)
{
PointF txtPos = new PointF();
txtPos.X = zuoBiaoStart[i].X -50;
txtPos.Y = zuoBiaoStart[i].Y - 5;
g.DrawString(t[i].ToString(),new Font(FontWord,8),Brushes.Black,txtPos);
g.DrawLine(Pens.Black,zuoBiaoStart[i],zuoBiaoEnd[i]);
}
return chiDu;
}
private void createCanvas(out Bitmap bm, out Graphics g, out PointF[] zuoBiaoEnd, out PointF[] zuoBiaoStart,ChartUtil cu)
{
//建立一个Graphics对象实例
bm = new Bitmap(Pic_Width,Pic_Height);
g = Graphics.FromImage(bm);
//设置条图图形和文字属性
g.ScaleTransform((Convert.ToSingle(Pic_Width))/SIDE_WIDTH,(Convert.ToSingle(Pic_Height))/SIDE_HEIGHT);
g.SmoothingMode = SmoothingMode.Default;
g.TextRenderingHint = TextRenderingHint.AntiAlias;
//设定画布和边
g.Clear(Color.White);
g.DrawRectangle(Pens.Black,0,0,SIDE_WIDTH-1,SIDE_HEIGHT-1);
//设置条形图的边
g.DrawRectangle(new Pen(Color.Black,1),CHART_LEFT,CHART_TOP,CHART_WIDTH, CHART_HEIGHT);
if(hasNeg)
{
g.DrawRectangle(new Pen(Color.Black,1),CHART_LEFT,CHART_TOP+CHART_HEIGHT,CHART_WIDTH, CHART_HEIGHT);
}
zuoBiaoEnd = null;
zuoBiaoStart = cu.getZuoBiaoPoint(new PointF(CHART_TOP,CHART_LEFT),CHART_HEIGHT,CHART_WIDTH,out zuoBiaoEnd,hasNeg);
}
private void drawInstruction(int CHART_LEFT, int CHART_HEIGHT, int CHART_TOP, Graphics g, string[] word, int[] data)
{
PointF colsNamePoint = new PointF(CHART_LEFT + 55,CHART_HEIGHT + CHART_TOP + 2);
if(hasNeg)
{
colsNamePoint = new PointF(CHART_LEFT + 55,CHART_HEIGHT*2 + CHART_TOP + 2);
}
PointF boxOrigin = new PointF(Pic_Width*5/6-30,CHART_TOP*1/3);
PointF textOrigin = new PointF(Pic_Width*4/5+8,CHART_TOP*1/3 -3 );
for(int i=0;i<2;i++)
{
g.FillRectangle(new SolidBrush(ChartUtil.GetChartItemColor(i)),boxOrigin.X,boxOrigin.Y,20,10);
//g.DrawRectangle(Pens.Black,boxOrigin.X,boxOrigin.Y,20,10);
g.DrawString(word[i],new Font(FontWord,FontSize),Brushes.DarkBlue,colsNamePoint);
g.DrawString(data[i].ToString(),new Font(FontWord,FontSize),Brushes.Black,textOrigin);
colsNamePoint.X += 150;
boxOrigin.Y += 15;
textOrigin.Y += 15;
}
}
}
public class ChartUtil
{
public readonly string PicPath = System.AppDomain.CurrentDomain.BaseDirectory + "Temp/";
public PointF[] getZuoBiaoPoint(PointF orign,int height,int width,out PointF[] endPoint,bool hasNeg)
{
int num = 6;
if(hasNeg) num = 11;
PointF[] startPoint = new PointF[num];
endPoint = new PointF[num];
for(int i =0;i<num;i++)
{
PointF pfStart = new PointF();
PointF pfEnd = new PointF();
pfStart.X = orign.X;
pfEnd.X = orign.X + width;
pfStart.Y = orign.Y + i*height/5;
pfEnd.Y = pfStart.Y;
startPoint[i] = pfStart;
endPoint[i] = pfEnd;
}
return startPoint;
}
public int[] getZuoBiaoValue(int[] data,out int chidu)
{
int[] result = new Int32[11];
int Max = data[0];
for(int i=0;i<data.Length;i++)
{
if(Max < data[i])
Max = data[i];
}
string strMax = Max + "";
chidu =(int)((Convert.ToInt32(strMax.Substring(0,1)) +1)* Math.Pow(10,strMax.Length-1))/5;
for(int i=0;i<result.Length;i++)
{
result[i] = chidu* (5-i) ;
}
return result;
}
#region get color
public static Color GetChartItemColor(int itemIndex)
{
Color selectedColor;
switch(itemIndex)
{
case 0:
selectedColor = Color.Blue;
break;
case 1:
selectedColor = Color.Red;
break;
case 2:
selectedColor = Color.Yellow;
break;
case 3:
selectedColor = Color.Purple;
break;
default:
selectedColor = Color.Green;
break;
}
return selectedColor;
}
#endregion
}
}
个人认为把有可能出现的字符类型打印出来所占有的宽度算出来(我没有观察过)
计算出字符串的长度 截取到未超出打印范围的字符串长度代码我是贴不出来了 在网吧呢 我这个方法可行 肯定有更好的方法 画图用的不多