找回密码
 加入
搜索
查看: 9011|回复: 23

[图形处理] GDI在AU3中实现汉字笔顺的演示(已解决)

 火.. [复制链接]
发表于 2012-2-18 11:12:28 | 显示全部楼层 |阅读模式
本帖最后由 楼上风云 于 2012-3-2 13:46 编辑

项目:利用AU3控制汉字笔顺的演示
意义:1、形成UDF,方便GUI界面特效引用;
         2、结合“日志”功能,掌握用户学习进度
参考:1、C语言结合GDI+实现指定汉字的笔画笔顺示例代码。
         2、AU3脚本下的3D文字演示示例(请移步7楼),支持汉字,图片即其运行效果截图。
解决:请稳步21楼 或  浏览http://www.autoitx.com/thread-30662-1-1.html
重点:1、UDF基本实现
         2、原始字库获取方法(方法仍然掌握在21楼楼主)尚未明确,拓展性尚待完善。
致谢:感谢smartzbs、AFAN、seniors、netegg等楼主的直接关切,以及所有跟贴的坛友。
//以下为C语言结合GDI+的示例:
        Graphics graphics(*pDC);
        CString str = "菈";
        //        CString fname = L"楷体_GB2312";
        int fsize = 32;
        int x=0;
        int y=0;
        int spx = 5;
        int spy = 5;
        int dx=0;
        int dy=0;
        //        int order[7]={1,3,2,6,4,7,5};
        Pen tmppen1(Color(255,0,0)),tmppen2(Color(0,255,0)),tmppen3(Color(0,0,255));
        SolidBrush tmpbrush(Color(0,255,0));

        //幼圆        楷体_GB2312
        FontFamily tmpfontFamily(L"仿宋_GB2312");
        Font tmpfont(&tmpfontFamily,fsize,FontStyleRegular);
        Unit unit = tmpfont.GetUnit();
        graphics.SetPageUnit(unit);
        graphics.SetSmoothingMode(SmoothingModeHighQuality);

        GraphicsPath tmppath;



        WCHAR *strSrc;
        //        LPSTR szRes;

        //获得临时变量的大小
        int i = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
        strSrc = new WCHAR[i+1];
        MultiByteToWideChar(CP_ACP, 0, str, -1, strSrc, i);
        tmppath.AddString(strSrc,-1,&tmpfontFamily,FontStyleRegular,fsize,PointF(x,y),NULL);
                delete []strSrc;
        GraphicsPathIterator iterator(&tmppath);
        Rect tmprect;
        tmppath.GetBounds(&tmprect);
        dx = tmprect.Width+spx;
        int count = iterator.GetSubpathCount();
        GraphicsPath subpath;
        BOOL isClosed = FALSE;
        for (int i=0;i<count;i++)
        {
                if (i%10==0&&i!=0)
                {
                        graphics.ResetTransform();
                        graphics.TranslateTransform(0,(tmprect.Height+spy)*i/10);
                }
                graphics.DrawPath(&tmppen1,&tmppath);
                //        iterator.Rewind();
                //        for (int j=0;j<i+1;j++)
                {
                        iterator.NextSubpath(&subpath,&isClosed);
                }
                //        graphics.DrawPath(&tmppen2,&subpath);
                graphics.FillPath(&tmpbrush,&subpath);
                graphics.TranslateTransform(dx,dy);
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-18 11:27:53 | 显示全部楼层
关键这个GraphicsPathIterator在UDF中好像没有
发表于 2012-2-18 11:54:45 | 显示全部楼层
回复 2# seniors

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-18 12:02:39 | 显示全部楼层
哦,那试试看
 楼主| 发表于 2012-2-18 15:23:11 | 显示全部楼层
回复 4# seniors

至少涉及路径和子路径的处理,深入点,还涉及字库的自动读取和笔顺库的组织。
发表于 2012-2-18 15:52:31 | 显示全部楼层
如果那段代码是全的话,应该是可以翻译过来的
看上面那段代码好像没有笔顺库
 楼主| 发表于 2012-2-18 15:59:44 | 显示全部楼层

官网3D文字滚动演示(官网示例)

本帖最后由 楼上风云 于 2012-2-18 16:50 编辑

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +30 贡献 +2 收起 理由
zch11230 + 10 给力 就是CPU有点高
afan + 20 + 2

查看全部评分

 楼主| 发表于 2012-2-18 16:05:49 | 显示全部楼层
本帖最后由 楼上风云 于 2012-2-18 16:51 编辑

回复 6# seniors


    笔顺库其实也不很难,3-13行的预处理只是指定汉字对象的处理,这部分代码改为读取字库,就能解决通用了。笔顺字库有国标,当然也可以自己创建,不过是DIY的书写顺序。
7楼脚本是官网GDI的示例,源码里有链接地址。很不错的。
感谢关注,共同探讨,共同进步。
发表于 2012-3-1 08:25:12 | 显示全部楼层
au3代码模拟:
#include <GDIPlus.au3>

;宋体"福"字笔顺库
$sHzBs = "0:(144,24) (204,96) (216,120) (228,174)#1:(30,204) (276,204) (312,180) (276,204) (222,282) (174,342) (132,390) (90,438) (42,486) (6,522)#2:(180,336) (180,762)#3:(192,342) (246,384) (276,414) (306,450)#4:(318,102) (744,102) (696,84) (648,102)#5:(402,162) (402,360)#6:(402,192) (648,192) (672,168) (648,192) (648,360)#7:(648,324) (402,324)#8:(336,390) (336,750)#9:(336,426) (702,426) (726,408) (702,426) (702,744)#10:(702,558) (336,558)#11:(522,702) (522,426)#12:(336,702) (702,702)"

$hGUI = GUICreate("汉字笔顺演示", @DesktopWidth, @DesktopHeight, 0, 0, 0x80000000);$WS_POPUP = 0x80000000
GUISetState()

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)

_DrawHzBs($sHzBs, $hGraphic)

_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_Shutdown ()


Func _DrawHzBs($sHzBs, $hGraphic)
        Local $aBs = StringSplit($sHzBs, '#', 2);每一个笔画
        Local $aXy1, $aXy2, $aCoordinate
        For $i=0 To UBound($aBs)-1
                $aCoordinate = StringRegExp($aBs[$i], "\((\d+,\d+)\)", 3);x,y坐标
                For $j = 0 To UBound($aCoordinate)-2
                        $aXy1 = StringSplit($aCoordinate[$j],",",2)
                        $aXy2 = StringSplit($aCoordinate[$j+1],",",2)
                        ;MouseMove($aXy[0],$aXy[1])
                        _GDIPlus_GraphicsDrawLine ($hGraphic, $aXy1[0], $aXy1[1], $aXy2[0], $aXy2[1])
                        Sleep(100);笔划走势延时,演示用
                Next
                Sleep(500);每一个笔划之间延时,演示用
        Next
EndFunc

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2012-3-1 11:32:53 | 显示全部楼层
回复 9# smartzbs

先感谢您的热心关注,测试能显示笔顺走势,功能方面是实现了。
同时,如果解决如附件图示显示效果,尚待深入。
我自己正在分析7楼代码,个人感觉可能还是部分概念和原理未清楚。直觉告诉自己,7楼代码有参考价值。
提问的初衷是,捣鼓个笔顺演示东东,方便小朋友按日学习使用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-3-1 13:05:24 | 显示全部楼层
回复  smartzbs

先感谢您的热心关注,测试能显示笔顺走势,功能方面是实现了。
同时,如果解决如附件图 ...
楼上风云 发表于 2012-3-1 11:32



    7#代码果真很有趣,对这个主题绝对有参考价值
发表于 2012-3-1 13:19:48 | 显示全部楼层
每一个字都要存一个数组,会累死的
 楼主| 发表于 2012-3-1 13:53:11 | 显示全部楼层
回复 12# netegg

楼主,这个不必使用数组来直接定义,可以通过读取数据库的方式。网上获知,有专门的数据库,另外的一种思路是,直接读取字体库。有国标的哦(wdl.dat)。
发表于 2012-3-1 13:56:05 | 显示全部楼层
本帖最后由 netegg 于 2012-3-1 13:58 编辑

回复 13# 楼上风云
数据库的方法和数组区别不大,做字库最后还是一样要还原成数组处理

另外,越来越觉得有点像形码输入了
 楼主| 发表于 2012-3-1 13:59:39 | 显示全部楼层
回复 11# afan


    感谢您的关注,相信有您和大伙的关切,一定能解决的。
   7楼脚本是我从官方搜索后,略作修改而成的。
   网络上有现成的软件,我手头上也有一份破解版,但是,遗憾的是,与我个人的需求不匹配,我想要的是,嵌入日志处理,可以方便检验小朋友学习进度。甚至可以通过日志记录,或者评分系统,给小朋友学习评分。
所以,如果可能,将它写成为UDF,最适用拓展。也可以用于界面启动特效显示。
推而言之,可能可以形成DLL。
期待。。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 15:10 , Processed in 0.091125 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表