| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2760 人关注过本帖, 1 人收藏
标题:请教一个GDI+ 中文乱码问题
只看楼主 加入收藏
ajd5271
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-4-12
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:13 
请教一个GDI+ 中文乱码问题

以下是TonyDeng大哥写的一个用GDI+画图写字的代码,代码很好用。

就是写中文时会出现乱码,不知有什么方法解决它。(还有就是想把写的文字坚排)!

TonyDeng

https://bbs.bccn.net/thread-344650-1-1.html
程序代码:
*----------------------------
* 使用 GDI+ 庫繪圖範例
* 打開 VCX 文件可以查看類庫源代碼
*----------------------------

*----------------------------
* VFP 9.0(SP2) 自帶GDI+類庫
* 文件名:_GDIplus.vcx, _GDIplus.vct (若使用頭文件,有 GDIplus.h, GDIplus_locs.h)
* 路徑:VFP 安裝目錄下 FFC 文件夾
*----------------------------
SET PATH TO HOME() + "FFC"
_Bitmap = NEWOBJECT("gpBitmap", "_GDIplus.vcx")                && 建立繪圖板對象,圖形將在此畫板上繪製
WITH _Bitmap
    .Create(128,128)                                        && 設定畫板大小,寬度和高度
    .SetResolution(300,300)                                    && 設定分辨率(x,y 的 DPI 値)
ENDWITH
_Color = NEWOBJECT("gpColor", "_GDIplus.vcx")                && 建立顔色對象
_Pen = NEWOBJECT("gpPen", "_GDIplus.vcx")                    && 建立畫筆對象
_Font = NEWOBJECT("gpFont", "_GDIplus.vcx")                    && 建立字體對象
_StringFormat = NEWOBJECT("gpStringFormat", "_GDIplus.vcx")
_TextBrush = NEWOBJECT("gpSolidBrush", "_GDIplus.vcx")
_Point = NEWOBJECT("gpPoint", "_GDIplus.vcx")
_Graphics = NEWOBJECT("gpGraphics", "_GDIplus.vcx")            && 建立圖形對象
WITH _Graphics
    .CreateFromImage(_Bitmap)                                && 指定圖形對象的設備,此處指向已建立的_Bitmap對象
    _Color.Set(255,255,255)                                    && 設定顔色,三個參數分別是紅、緑、藍値,即RGB各自獨立
    .Clear(_Color)                                            && 用設定的顔色填充整個圖形,可用於背景顔色
    _Color.Set(0,0,0)                                        && 改變顔色
    _Pen.Create(_Color, 10)                                    && 將指定的顔色賦予畫筆,請查看類庫中gpPen對象Create方法的參數,此處10是筆寬
    .DrawLine(_Pen, 20, 20, 108, 20)                        && 用設定的畫筆畫圖,類庫中有很豐富強大的畫圖函數
    .DrawLine(_Pen, 20, 50, 108, 50)
    _Color.Set(0,255,0)
    _Font.Create("Arial", 10, 0, 3)                            && 設置文本字體
    _TextBrush.Create(_Color)                                && 設定文本顔色
    _Point.Create(10, 80)                                    && 設定文本左上角位置
    .DrawStringA("Test", _Font, _Point, _StringFormat, _TextBrush)
ENDWITH
_Bitmap.SaveToFile("Test.BMP", "image/bmp")                    && 將繪圖板保存爲文件,此處指定文件格式爲.BMP
RELEASE ALL
RETURN
DrawStringA 方法
 以指定的字体和位置绘制一个串(ANSI 版本)。

语法:THIS.DrawStringA( tcAnsiString, [toFont],tvRectPoint,[toStringFormat],[toBrush])

返回值:逻辑型,表示成功或失败。

参数:

tcAnsiString,必须,要绘制的 ANSI 串。

toFont,可选,指定要使用字体的 gpFont 对象。

tvRectPoint,必须,指定绑定矩形的 gpRect 对象,或指定坐上角的 gpPoint 对象。

toStringFormat,可选,gpStringFormat 对象。

toBrush,可选,绘制文本时要使用的 gpBrush 对象。
 
DrawStringW 方法
 以指定的字体和位置绘制一个串(Unicode 版本)。

语法:THIS.DrawStringW( tcUnicodeString,[toFont],tvRectPoint,[toStringFormat],[toBrush])

返回值:逻辑型,表示成功或失败。

参数:

tcUnicodeString,必须,要绘制的 Unicode 串。

toFont,可选,指定要使用字体的 gpFont 对象。

tvRectPoint,必须,指定绑定矩形的 gpRect 对象,或指定坐上角的 gpPoint 对象。

toStringFormat,可选,gpStringFormat 对象

toBrush,可选,绘制文本时要使用的 gpBrush 对象。
 


搜索更多相关主题的帖子: 中文 问题 
2012-04-23 20:11
ajd5271
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-4-12
收藏
得分:0 
DrawStringA 方法
以指定的字体和位置绘制一个串(ANSI 版本)。
DrawStringW 方法
以指定的字体和位置绘制一个串(Unicode 版本)。

网上的人说好像是要 转变为宽字符 将双字节转变为宽字节 【如果不转换,将出现乱码】 我不知道怎么转,我转了乱码更离谱!!!
2012-04-23 20:16
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:10 
回复 2楼 ajd5271
看下strconv( )函数

坚守VFP最后的阵地
2012-04-23 20:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
我写中文没事呀,下图是把"test"改为"測試"的结果:
Test.zip (1.76 KB)

授人以渔,不授人以鱼。
2012-04-23 21:08
ajd5271
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-4-12
收藏
得分:0 


我想自杀.................

网上的人说好像是要 转变为宽字符 将双字节转变为宽字节 【如果不转换,将出现乱码】 我不知道怎么转,我转了乱码更离谱!!!

我用strconv( )函数转换过的。不知道为什么乱码更离谱!!! (可能***********)

多谢你提醒。刚才又试了一次
lcText= STRCONV('生产订单',5)
.DrawStringw(lcText, _Font, _Point, _StringFormat, _TextBrush)

它行了。

现在还差一个问题,字体竖排(文字方向竖向).不知道有无这种函数。


2012-04-23 21:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
针对中文修改的部分,如下红字:

*----------------------------
* 使用 GDI+ 庫繪圖範例
* 打開 VCX 文件可以查看類庫源代碼
*----------------------------
 
*----------------------------
* VFP 9.0(SP2) 自帶GDI+類庫
* 文件名:_GDIplus.vcx, _GDIplus.vct (若使用頭文件,有 GDIplus.h, GDIplus_locs.h)
* 路徑:VFP 安裝目錄下 FFC 文件夾
*----------------------------
SET PATH TO HOME() + "FFC"
_Bitmap = NEWOBJECT("gpBitmap", "_GDIplus.vcx")                && 建立繪圖板對象,圖形將在此畫板上繪製
WITH _Bitmap
    .Create(128,128)                                        && 設定畫板大小,寬度和高度
    .SetResolution(300,300)                                    && 設定分辨率(x,y 的 DPI 値)
ENDWITH
_Color = NEWOBJECT("gpColor", "_GDIplus.vcx")                && 建立顔色對象
_Pen = NEWOBJECT("gpPen", "_GDIplus.vcx")                    && 建立畫筆對象
_Font = NEWOBJECT("gpFont", "_GDIplus.vcx")                    && 建立字體對象
_StringFormat = NEWOBJECT("gpStringFormat", "_GDIplus.vcx")
_TextBrush = NEWOBJECT("gpSolidBrush", "_GDIplus.vcx")
_Point = NEWOBJECT("gpPoint", "_GDIplus.vcx")
_Graphics = NEWOBJECT("gpGraphics", "_GDIplus.vcx")            && 建立圖形對象
WITH _Graphics
    .CreateFromImage(_Bitmap)                                && 指定圖形對象的設備,此處指向已建立的_Bitmap對象
    _Color.Set(255,255,255)                                    && 設定顔色,三個參數分別是紅、緑、藍値,即RGB各自獨立
    .Clear(_Color)                                            && 用設定的顔色填充整個圖形,可用於背景顔色
    _Color.Set(0,0,0)                                        && 改變顔色
    _Pen.Create(_Color, 10)                                    && 將指定的顔色賦予畫筆,請查看類庫中gpPen對象Create方法的參數,此處10是筆寬
    .DrawLine(_Pen, 20, 20, 108, 20)                        && 用設定的畫筆畫圖,類庫中有很豐富強大的畫圖函數
    .DrawLine(_Pen, 20, 50, 108, 50)
    _Color.Set(0,255,0)
    _Font.Create("方正综艺_GBK", 10, 0, 3)                            && 設置文本字體
    _TextBrush.Create(_Color)                                && 設定文本顔色
    _Point.Create(1, 80)                                    && 設定文本左上角位置
    .DrawStringW(STRCONV("測試", 5), _Font, _Point, _StringFormat, _TextBrush)
ENDWITH
_Bitmap.SaveToFile("Test.bmp", "image/bmp")                    && 將繪圖板保存爲文件,此處指定文件格式爲.BMP
RELEASE ALL
RETURN


[ 本帖最后由 TonyDeng 于 2012-4-23 21:20 编辑 ]
收到的鲜花
  • ajd52712012-04-23 22:06 送鲜花  3朵   附言:好文章

授人以渔,不授人以鱼。
2012-04-23 21:18
ajd5271
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-4-12
收藏
得分:0 
我的会这样的

乱码.zip (6.92 KB)



它并不是每次都是这种乱码,你多写几个字和多写几行的时候都不一样的。
我用WIN7和XP都一样
2012-04-23 21:28
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 5楼 ajd5271
@宋体,是否可行

坚守VFP最后的阵地
2012-04-23 21:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
文字竖向是这样:
#INCLUDE "GDIplus.h"
_StringFormat = NEWOBJECT("gpStringFormat", "_GDIplus.vcx")
_StringFormat.Create(GDIPLUS_STRINGFORMATFLAGS_DirectionVertical)

图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 TonyDeng 于 2012-4-23 21:44 编辑 ]
收到的鲜花
  • ajd52712012-04-23 22:05 送鲜花  3朵   附言:专家

授人以渔,不授人以鱼。
2012-04-23 21:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
使用Windows中文字库的时候,最好使用6楼所示那样的带W的函数,要用strconv()转换为Unicode编码,函数的参数是5。

授人以渔,不授人以鱼。
2012-04-23 21:39
快速回复:请教一个GDI+ 中文乱码问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023741 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved