DrawString只能写一个汉字

blackman323 2008-07-16 05:02:00
我用DrawString写汉字,如果输入字符串是“只能写一个汉字”,则显示“只”;
如果字符串全是字母,则多长的字符串都没有问题,如果是“只能写一个汉字abcd”。则只能显示“只 a“
有哪个高手知道是怎么回事?我没有发过帖子,也不知道自己有没有钱?
有了一定给,谢谢大家!
...全文
287 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
GhostAdai 2008-07-18
  • 打赏
  • 举报
回复
晕,画那么大!
bindsang 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 blackman323 的回复:]
问题找到了。原因是数值太大,超出了float精度范围:


IEEE754标准在表示浮点数时,每个浮点数均由三部分组成:符号位S,指数部分E和尾数部分M。

单精度(32位): 符号位1位,E占8位,M占23位。
双精度格式(64位):符号位1位,E=11位,M=52位。

另外为了增大存储范围 约定小数点左边隐含有一位,通常这位数就是1,
这样M实际上就是1.M

所以在单精度里面(32位)M实际上…
[/Quote]


MSDN上给的解释:

public void TranslateTransform (
float dx,
float dy
)

Single 值类型表示一个值介于 -3.402823e38 和 +3.402823e38 之间的单精度 32 位数字,以及正零或负零、PositiveInfinity、NegativeInfinity 和非数字 (NaN)。

也就是说float的最大值的数最级是10的32次方,这个范围应该远远大于楼主使用的数值了

BTW:浮点值的取值范围至少不会比整型小
hztltgg 2008-07-17
  • 打赏
  • 举报
回复
还是不好理解,参数是浮点数,和尾数部分有什么关系?只用了尾数?
blackman323 2008-07-17
  • 打赏
  • 举报
回复
问题找到了。原因是数值太大,超出了float精度范围:


IEEE754标准在表示浮点数时,每个浮点数均由三部分组成:符号位S,指数部分E和尾数部分M。

单精度(32位): 符号位1位,E占8位,M占23位。
双精度格式(64位):符号位1位,E=11位,M=52位。

另外为了增大存储范围 约定小数点左边隐含有一位,通常这位数就是1,
这样M实际上就是1.M

所以在单精度里面(32位)M实际上是23+1=24位,
这就是他的尾数表示精度范围。 2^24=16777216 这就是你说的。

因此TranslateTransform(-20402198, -4264552); 里面的值绝对值大于16777216(我实际测试是16777217)就出错,小于16777216 就没事。大家可以试试。

非常感谢大家的热心肠,我第一次请教问题这么多人关注,再次感谢!
hztltgg 2008-07-17
  • 打赏
  • 举报
回复
感觉似乎是系统本身就不行,有问题,楼上的说成的都自己试过么?
blackman323 2008-07-17
  • 打赏
  • 举报
回复
问题是在ddd.TranslateTransform(-20402198, -4264552);
没错,可是我就纳闷,凭什么把 "我的为什么总是错3333" 显示成 "我 3" ??
blackman323 2008-07-17
  • 打赏
  • 举报
回复
Graphics ddd = e.Graphics;
ddd.TranslateTransform(-20402198, -4264552);
Font myfont = new Font(" Arail", 11, FontStyle.Regular);
Brush myBrash = Brushes.Red;

ddd.DrawString("我的为什么总是错3333", myfont, myBrash, 20402198, 4264552);

也不行啊?
GentleCat 2008-07-17
  • 打赏
  • 举报
回复
Font myfont = new Font("Arail", 8888);

这里面的8888是什么意思?字体大小?

改成:
Font myfont = new Font("Arail", 11,FontStyle.Regular); 就行了
halk 2008-07-17
  • 打赏
  • 举报
回复
按照你的代码稍微简化,


private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics ddd = e.Graphics;
//ddd.ScaleTransform(zoom * zoomScale, zoom * zoomScale);
//ddd.TranslateTransform(-X0 + this.AutoScrollPosition.X / (zoom * zoomScale), -Y0 + this.AutoScrollPosition.Y / (zoom * zoomScale));
//this.AutoScrollMinSize = new Size(Convert.ToInt32((X2 - X0) * zoom * zoomScale), Convert.ToInt32((Y0 - Y2) * zoom * zoomScale));
Graphics ddd = e.Graphics;
Font myfont = new Font("Times New Roman", 20);
Brush myBrash = Brushes.Red;

ddd.DrawString("我的为什么总是错3333", myfont, myBrash, 0, 0);

}

这样是对的。所以问题在于你的ScaleTransform上。时间有限没法仔细检查,还是自己看看吧!跟汉字编码没关系。
blackman323 2008-07-17
  • 打赏
  • 举报
回复
什么体也不罩。。。
blackman323 2008-07-17
  • 打赏
  • 举报
回复
ddd.DrawString("我的为什么总是错3333", myfont, myBrash, 0, 0);
里面的"我的为什么总是错3333" 如果全是英文字母和数字都没有问题,只要有汉字问题就出现。
GentleCat 2008-07-17
  • 打赏
  • 举报
回复
天啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`

引用一下维也纳的名言
"乖乖,这个问题使我好坐在井里面一样"

"Arail"字体改成"宋体"你试试~
blackman323 2008-07-17
  • 打赏
  • 举报
回复
呵呵,又精简了下,麻烦大家了
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsApplication1TestHanzi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics ddd = e.Graphics;
ddd.ScaleTransform(0.005f, 0.005f);
ddd.TranslateTransform(-20402198, -4264552);
Font myfont = new Font("Arail", 8888);
Brush myBrash = Brushes.Red;

ddd.DrawString("我的为什么总是错3333", myfont, myBrash, 20402198, 4264552);
}
}
}


如果把里面的ddd.TranslateTransform(-20402198, -4264552);注释掉
同时,把ddd.DrawString("我的为什么总是错3333", myfont, myBrash, 20402198, 4264552);写成
ddd.DrawString("我的为什么总是错3333", myfont, myBrash, 0, 0);

就好了,大家给解释下。。。
blackman323 2008-07-17
  • 打赏
  • 举报
回复
我把代码精简了下,大家可以直接拷贝到自己的form1.cs下面测试我的那个问题:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace WindowsApplication1TestHanzi
{
public partial class Form1 : Form
{

//矩形左上角坐标
private float X0 = 20402198;
private float Y0 = 4264552;

//矩形右下角坐标
private float X2 = 20734229;
private float Y2 = 4058055;
//使用zoom以及一个比例因子一起为图形比例参数
private float zoom = 1f;
private float zoomScale = 0.005f;


public Form1()
{
InitializeComponent();
}

private void Form1_Paint(object sender, PaintEventArgs e)
{
Graphics ddd = e.Graphics;
ddd.ScaleTransform(zoom * zoomScale, zoom * zoomScale);
ddd.TranslateTransform(-X0 + this.AutoScrollPosition.X / (zoom * zoomScale), -Y0 + this.AutoScrollPosition.Y / (zoom * zoomScale));
this.AutoScrollMinSize = new Size(Convert.ToInt32((X2 - X0) * zoom * zoomScale), Convert.ToInt32((Y0 - Y2) * zoom * zoomScale));
Font myfont = new Font("Arail", 8888);
Brush myBrash = Brushes.Red;

ddd.DrawString("我的为什么总是错3333", myfont, myBrash, X0, Y0);

}
}
}
sjm2003 2008-07-17
  • 打赏
  • 举报
回复
不循环,测试:
Graphics gr = this.CreateGraphics();
gr.DrawEllipse(Pens.Red, 0, 0, 100, 100);
gr.DrawString("车斜202", Font, Brushes.Blue, new PointF(1, 1));
gr.Dispose();
没有什么错误。

在循环里面弄个messagebox把wellname显示出来看看是否有问题。
grearo 2008-07-17
  • 打赏
  • 举报
回复
dc.DrawString(wellList[i].Wellname.Tostring(), font, drawBrush, wellList[i].X - 5 / (zoom * zoomScale), Y0 + (Y0 - wellList[i].Y) - 14 / (zoom * zoomScale));
blackman323 2008-07-17
  • 打赏
  • 举报
回复
wellList[i].Wellname是没有问题,关键就是那个尺寸,我比较怀疑,我再调调看
whycom 2008-07-17
  • 打赏
  • 举报
回复
估计是写入的区域不够大
你调试一下看看wellList[i].Wellname到底是什么?
还有那几个尺寸值
blackman323 2008-07-17
  • 打赏
  • 举报
回复
welllist包含的对象有4个属性:

private string wellname; //井号
private float x; //X坐标
private float y; //Y坐标
private Color wellColor; //颜色
blackman323 2008-07-17
  • 打赏
  • 举报
回复
我在网上看,有人说web环境下有类似的问题,是与“uft-8 ”“ gb2312” 字符集有关,我也不知道我的cs下怎么改,
还有,第一次执行
zoom * zoomScale的值是0.005
wellList[i].X的值很大是:20572086
Y0 的值 是:4264552
wellList[i].Y的值是:4195152

由于前面有比例缩放的代码:
dc.ScaleTransform(zoom * zoomScale, zoom * zoomScale);
所以值都比较大。

不知道这样描述行不行?

加载更多回复(6)

111,112

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧