GDI在AU3中实现汉字笔顺的演示(已解决)
本帖最后由 楼上风云 于 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={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;
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);
} 关键这个GraphicsPathIterator在UDF中好像没有 回复 2# seniors 哦,那试试看 回复 4# seniors
至少涉及路径和子路径的处理,深入点,还涉及字库的自动读取和笔顺库的组织。 如果那段代码是全的话,应该是可以翻译过来的
看上面那段代码好像没有笔顺库
官网3D文字滚动演示(官网示例)
本帖最后由 楼上风云 于 2012-2-18 16:50 编辑本帖最后由 楼上风云 于 2012-2-18 16:51 编辑
回复 6# seniors
笔顺库其实也不很难,3-13行的预处理只是指定汉字对象的处理,这部分代码改为读取字库,就能解决通用了。笔顺字库有国标,当然也可以自己创建,不过是DIY的书写顺序。
7楼脚本是官网GDI的示例,源码里有链接地址。很不错的。
感谢关注,共同探讨,共同进步。 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,$aXy)
_GDIPlus_GraphicsDrawLine ($hGraphic, $aXy1, $aXy1, $aXy2, $aXy2)
Sleep(100);笔划走势延时,演示用
Next
Sleep(500);每一个笔划之间延时,演示用
Next
EndFunc 回复 9# smartzbs
先感谢您的热心关注,测试能显示笔顺走势,功能方面是实现了。
同时,如果解决如附件图示显示效果,尚待深入。
我自己正在分析7楼代码,个人感觉可能还是部分概念和原理未清楚。直觉告诉自己,7楼代码有参考价值。
提问的初衷是,捣鼓个笔顺演示东东,方便小朋友按日学习使用。 回复smartzbs
先感谢您的热心关注,测试能显示笔顺走势,功能方面是实现了。
同时,如果解决如附件图 ...
楼上风云 发表于 2012-3-1 11:32 http://www.autoitx.com/images/common/back.gif
7#代码果真很有趣,对这个主题绝对有参考价值 每一个字都要存一个数组,会累死的 回复 12# netegg
楼主,这个不必使用数组来直接定义,可以通过读取数据库的方式。网上获知,有专门的数据库,另外的一种思路是,直接读取字体库。有国标的哦(wdl.dat)。 本帖最后由 netegg 于 2012-3-1 13:58 编辑
回复 13# 楼上风云
数据库的方法和数组区别不大,做字库最后还是一样要还原成数组处理
另外,越来越觉得有点像形码输入了 回复 11# afan
感谢您的关注,相信有您和大伙的关切,一定能解决的。
7楼脚本是我从官方搜索后,略作修改而成的。
网络上有现成的软件,我手头上也有一份破解版,但是,遗憾的是,与我个人的需求不匹配,我想要的是,嵌入日志处理,可以方便检验小朋友学习进度。甚至可以通过日志记录,或者评分系统,给小朋友学习评分。
所以,如果可能,将它写成为UDF,最适用拓展。也可以用于界面启动特效显示。
推而言之,可能可以形成DLL。
期待。。。
页:
[1]
2