老问题了,关于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.   

    有图有代码,有BUG体验,你就调试呗。
      

  2.   

    有图有代码,有BUG体验,你就调试呗。
      

  3.   

    debug能力为0的人我真是觉得没有指导的必要,因为在开发这条路上是走不远的。
      

  4.   

    最恨这种只耍嘴皮子不干实事的人,你调试给我看看?耍嘴皮子也是要有本是的,你这样态度,别人怎么还会乐于帮助你?
    你们这些马甲就别来捣乱了,我直接接贴,CSDN成什么样了
      

  5.   

    最恨这种只耍嘴皮子不干实事的人,你调试给我看看?耍嘴皮子也是要有本是的,你这样态度,别人怎么还会乐于帮助你?
    你们这些马甲就别来捣乱了,我直接接贴,CSDN成什么样了就是你这种人太多了,找人查错还趾高气昂
      

  6.   

    最恨这种只耍嘴皮子不干实事的人,你调试给我看看?耍嘴皮子也是要有本是的,你这样态度,别人怎么还会乐于帮助你?
    你们这些马甲就别来捣乱了,我直接接贴,CSDN成什么样了跟马甲有什么关系,有本事你别来发帖啊,既然碰到了问题不虚心请教,还乱喷
      

  7.   

    代码肯定没问题了,都能运行~
    断点调试下
    看看获取到的字符串的格式
    很有可能是编码格式,全半角,或者是控件大小的问题
    我用GDI+画过字母数字验证码
    间距问题也调试了好久