加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

(原创)关于AutoCad的字体替换框的研究

(2010-09-25 13:39:29)
标签:

杂谈

分类: C#-AutoCAD

    之前写过一篇《如何在打开DWG的时候自动替换系统缺少的字体》见http://hi.baidu.com/kakanimo/blog/item/55e13ad22e95ab0a3af3cf83.html,最后的解决方法是出现替换框的时候直接点击取消,然后进入CAD图后进行字体替换。虽然功能勉强实现但心里总是有一点不畅快,一直想用C#推出一个完美的方案。

    我琢磨了两个星期了吧(初学C#+没人带+自己google,支持下google先),到现在勉强有点头绪.这个CAD的替换字体的这个对话框也比较奇怪,把我学习过程中的一些问题记下。过程真是~~~~~~悲惨。

    1.首先遇到的问题是得到对话框中字体选择的那个listbox框中的内容是乱码。试了N多的方法,但是还是乱码。当我怀疑方法的时候决定自己用VB写个带有listbox的程序来测试下。测试结果如下:

a.定义IntPtr lParam,能得到正确的值

    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Ansi)]

    public static extern int SendMessage(int hwnd, int msg, int wParam, IntPtr lParam);

 

    string sItemText="";

    IntPtr ptr = Marshal.StringToHGlobalAnsi(sItemText);

    SendMessage(nimo, LB_GETTEXT, 3, ptr);

    string wahahah = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(ptr);

能得到正确的结果

b. 定义ref byte lParam接受,能得到正确的值

    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)]

    public static extern int SendMessage(int hwnd, int msg, int wParam, ref byte lParam);

 

    byte[] param2 = new byte[255];//新建字节数组

    SendMessage(nimo, LB_GETTEXT, 3, ref param2[0]);

    string s = System.Text.Encoding.Unicode.GetString(param2, 0, param2.Length);

能得到正确的结果

c. 定义StringBuilder接受,能得到正确的值

    [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Ansi)]

    public static extern int SendMessage(int hwnd, int msg, int wParam, StringBuilder lParam);

 

    StringBuilder sItemText = new StringBuilder();

    SendMessage(nimo, LB_GETTEXT, 3, sItemText);

    string wahahah = sItemText.ToString();

能得到正确的结果

    但是当我把上面这些代码用到这个对话框上的时候统统失效,把编码按排列组合都一个个试过了。折腾了几天就到了崩溃的边缘,所幸的是我在不断摸索中也找到了一个迂回的解决方法。如下:

    设置了listbox中某项后用GetWindowText能够得到这项的内容,内容刚好是标题一样且不是乱码,但是很可惜。这个GetWindowText的内容不随你sendmessage发送的设置listbox中某项的内容而改变,就是说你在程序中用sendmessage改变listbox的当前选中项。但是GetWindowText一直不变。正当想要放弃的时候发现居然同样可以用sendmessage发送WM_GETTEXT来接收到这个变化的标题(使用StringBuilder来接收,不是乱码。)。到此,勉强算解决了乱码问题。

    期间还打算放弃辨别乱码。想把hztxt.shx对应的乱码直接对上就好了。但是发现这个乱码好像是随机的,我关了IDE再开得到hztxt.shx对应的乱码居然不一样,囧,居然这样。彻底打消了偷懒的念头。

    2.发送确定时发现listbox中的值并非是我选中的

    到了这一步彻底倒塌。发现用sendmessage设置后的listbox的内容CAD不认,到底为什么不认呢?

    会不会是只认WindowText的内容啊?(因为GetWindowText的内容一直不变)于是用SetWindowText和GetWindowText设置查看了下,并非如此。

    调试中发现我用API设置好了listbox中的选项,然后用鼠标去点确定。得到的替换字体还是设置前的。但是要是我在点确定前用鼠标点击一下选中的内容或者用键盘方向键移动下里面的内容。这个时候再点确定就OK了。猜测是CAD在键盘的up.down或者鼠标的左键中有什么消息读取了这个listbox中的值,而我直接用API设置listbox后没有这一步,CAD得到的还是listbox之前的那个值。于是问题就有了答案,那就是鼠标在listbox当前选中项发个左键消息或者发送键盘的up.down一下,(个人理解相当于刷新下CAD得到的listbox中的那个值),然后再试下。哇。果然OK了,爽

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有