老问题了,关于C#中调用GDI的SetTextCharacterExtra设置输出字符串的间距问题,有图有代码,还提供源程序,请各路英雄帮忙解决:
1只有在字体为"宋体"且字体大小存在一定范围内才能有间距效果
2在中英文(日文等也一样)混排的情况下,输入的位置和顺序居然乱了套,我完全没明白为何会这样
有图有真相:
源程序下载
主要代码如下: [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
public static extern int SetTextCharacterExtra(IntPtr hdc, int nCharExtra);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr handle);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); Bitmap CreateImage(int width = 400, int height = 200)
{
Bitmap image = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(image))
{
//绘制图片边框
g.DrawRectangle(Pens.Black, 0, 0, width - 1, height - 1); string text1 = "rojGoBorI34023rf";
string text2 = "纯中文字体";
string text3 = "abC*(d/?eR3.4-22";
string text4 = "中TEs文t混24合测オンエ验ア"; Font font = new Font("宋体",12.0F);
Brush brush = Brushes.Red; //绘制原始输出
g.DrawString(text1, font, brush, 0, 0);
g.DrawString(text2, font, brush, 0, 50);
g.DrawString(text3, font, brush, 0, 100);
g.DrawString(text4, font, brush, 0, 150); //绘制设置了字符间距的输出
DrawStringExtra(g, 16, x =>
{
x.DrawString(text1, font, brush, 0, 25);
x.DrawString(text2, font, brush, 0, 75);
x.DrawString(text3, font, brush, 0, 125);
x.DrawString(text4, font, brush, 0, 175);
});
}
return image;
} void DrawStringExtra(Graphics g, int nCharExtra, Action<Graphics> action)
{
IntPtr hdc = g.GetHdc();
SetTextCharacterExtra(hdc, nCharExtra);
try
{
using (Graphics g1 = Graphics.FromHdc(hdc))
{
action(g1);
}
}
finally
{
SetTextCharacterExtra(hdc, 0);
g.ReleaseHdc(hdc);
}
} private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image = CreateImage();
}
1只有在字体为"宋体"且字体大小存在一定范围内才能有间距效果
2在中英文(日文等也一样)混排的情况下,输入的位置和顺序居然乱了套,我完全没明白为何会这样
有图有真相:
源程序下载
主要代码如下: [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
public static extern int SetTextCharacterExtra(IntPtr hdc, int nCharExtra);
[DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr handle);
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); Bitmap CreateImage(int width = 400, int height = 200)
{
Bitmap image = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(image))
{
//绘制图片边框
g.DrawRectangle(Pens.Black, 0, 0, width - 1, height - 1); string text1 = "rojGoBorI34023rf";
string text2 = "纯中文字体";
string text3 = "abC*(d/?eR3.4-22";
string text4 = "中TEs文t混24合测オンエ验ア"; Font font = new Font("宋体",12.0F);
Brush brush = Brushes.Red; //绘制原始输出
g.DrawString(text1, font, brush, 0, 0);
g.DrawString(text2, font, brush, 0, 50);
g.DrawString(text3, font, brush, 0, 100);
g.DrawString(text4, font, brush, 0, 150); //绘制设置了字符间距的输出
DrawStringExtra(g, 16, x =>
{
x.DrawString(text1, font, brush, 0, 25);
x.DrawString(text2, font, brush, 0, 75);
x.DrawString(text3, font, brush, 0, 125);
x.DrawString(text4, font, brush, 0, 175);
});
}
return image;
} void DrawStringExtra(Graphics g, int nCharExtra, Action<Graphics> action)
{
IntPtr hdc = g.GetHdc();
SetTextCharacterExtra(hdc, nCharExtra);
try
{
using (Graphics g1 = Graphics.FromHdc(hdc))
{
action(g1);
}
}
finally
{
SetTextCharacterExtra(hdc, 0);
g.ReleaseHdc(hdc);
}
} private void button1_Click(object sender, EventArgs e)
{
pictureBox1.Image = CreateImage();
}
解决方案 »
- C#中派生类不能继承基类的构造函数和析构函数,为什么还可以在调用这个派生类的构造函数前调用基类的构造函数?
- 怎样通过QQ进程获取QQ号???
- 有没有把目标文件夹下的所有.exe文件转换为其它扩展名文件的工具
- 能不能锁定注册表?
- 在Visual Studio自带的Web Server里调试没问题,但使用IIS运行时就出错
- microsoft .net framework 的组件diasymreader.dll未正确安装
- SerialPort.BytesToWrite 属性,获取有什么要求,为什么我发送字节后,查该属性是为0?
- FillSchema的问题
- =>有什么优势?
- C#windows服务打包后如何卸载产品的同时卸载服务
- C# Winform Checkedlistbox控件, 怎么设置背景色透明呢?
- C#同一个工程的cs文件里,如何根据.Net的版本设定不同的代码
你们这些马甲就别来捣乱了,我直接接贴,CSDN成什么样了
你们这些马甲就别来捣乱了,我直接接贴,CSDN成什么样了就是你这种人太多了,找人查错还趾高气昂
你们这些马甲就别来捣乱了,我直接接贴,CSDN成什么样了跟马甲有什么关系,有本事你别来发帖啊,既然碰到了问题不虚心请教,还乱喷
断点调试下
看看获取到的字符串的格式
很有可能是编码格式,全半角,或者是控件大小的问题
我用GDI+画过字母数字验证码
间距问题也调试了好久