首页
社区
课程
招聘
[原创]DirectUI技术开发界面
发表于: 2010-11-17 14:06 61956

[原创]DirectUI技术开发界面

2010-11-17 14:06
61956
收藏
免费 7
支持
分享
最新回复 (85)
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
51
收藏学习了~~~
2010-11-22 14:00
0
雪    币: 191
活跃值: (55)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
52
“呵呵,我是照着360界面,一点一点抠的图弄得,费了不少劲儿。"
欣赏楼主,赞一个,愚公移山的精神,真正的程序员就是这个样子,向你学习。
2010-11-23 17:46
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
53
真的很感谢。
2010-11-23 22:10
0
雪    币: 200
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
54
支持研究DirectUI
2010-11-26 10:50
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
55
release下运行报错,找不到UIlib_u.lib
2010-11-26 17:15
0
雪    币: 440
活跃值: (119)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
56
将工程设置为Use Multi-Byte Character Set即可,因为UIlib是Multi-Byte,而非Unicode的。
2010-11-26 17:33
0
雪    币: 386
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
57
试了一下,好用,顶上
2010-11-27 02:46
0
雪    币: 243
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
58
不错,以前看到那个windowless,都不支持中文,现在修改过这个贴图都支持了
2010-11-28 19:04
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
59
为什么xml改动一个字符就造成了解析错误?
比如我将360改为370, 结果就解析错误, 感觉是编码造成的, 但是我查了一下编码转换函数, 用的似乎没有问题, 不知道问题出在哪里?

我跟踪了一下, 发现问题:
m_pstrXML = static_cast<LPTSTR>(malloc((wide + 1)*sizeof(TCHAR)));
        WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)w_str, nWide, m_pstrXML, wide, NULL, NULL);
        m_pstrXML[wide] = _T('\0');
当用WideCharToMultiByte 将宽字符转换为Ansi的时候, 总是在xml的最前面多出一个?

造成xml解析错误

我一直搞不明白怎么会多出一个问号?
2010-11-30 00:13
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
60
由于无法直接将utf-8转换为ansi,这里面做了2次转换
第一次是把utf-8的转换为宽字符的
第二次把宽字符的转换为ansi字符的

这样间接的吧utf-8转换为ansi, 可问题是, 转换代码似乎没有什么问题, 但是第二次转换的时候, 却总是在xml的最前面多出一个问号, 比如宽字符下看到的结果是:
<?xml version="1.0" encoding="UTF-8"?>

但是转换后变成了?<?xml version="1.0" encoding="UTF-8"?>

我一直没有搞明白是为什么?
难道是我修改后保存的编码有问题? 可是我用的是微软的XML notepad修改的, 应该不会修改它的编码呀
2010-11-30 00:22
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
61
我把utf-8格式的xml修改, 再次保存的时候, 会在最前面加三个字节:0xEF,0xBB,0xBF
而这3个字节就是utf-8格式在windows下的标识
可是问题是WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)w_str, nWide, m_pstrXML, wide, NULL, NULL); 转换的时候不知道哪儿出现了问题
如果用16进制编辑器看, 多3个字节0xEF,0xBB,0xBF
可是, 调试的时候,看到实际的字符却只多一个'?'

在16进制编辑器中, 把前面多出的3个字节删掉, 然后保存, 运行没有问题
或者是转换后, 做一下处理:
                if ( lstrlen(m_pstrXML) > 1 && m_pstrXML[0] == TEXT('?') )
                        ::MoveMemory(m_pstrXML, &m_pstrXML[1], lstrlen(m_pstrXML));

这样也没有问题, 虽然bug解决了, 可是还是不明白,为何WideCharToMultiByte的转换会多一个问号
谁能说明白这个问题
2010-11-30 00:45
0
雪    币: 440
活跃值: (119)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
62
恩,0xEF,0xBB,0xBF是utf-8的文件标识,但是
 DWORD nWide = MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pByte, dwSize, NULL, 0 );

        LPWSTR w_str = static_cast<LPWSTR>(malloc((nWide + 1)*sizeof(WCHAR)));
        MultiByteToWideChar( CP_UTF8, 0, (LPCSTR)pByte, dwSize, w_str, nWide );
        w_str[nWide] = L'\0';
转换的时候,肯定不应该将文件标识也放进去不是;所以,一种就是你的做法,跳过文件标识;我的做法是跟以前的那个GameDemo一样的,就是将文件保存成了ansi格式,这样就没有标识,可以直接转换(主要是因为utf-8和ansi对于英文的编码是一样的)。不过我还是觉得你的做法是对的,我的有点投机了。。。
2010-11-30 10:12
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
63

这个界面布局有什么规则和要求? 为什么我仿照写的xml布局很多时候达不到我想要的效果?
这些控件自绘的属性有没有比较详细一点的说明, 感觉现在都是慢慢尝试, 速度太慢了

那个CEditUI如何支持多行?
2010-12-5 15:43
0
雪    币: 440
活跃值: (119)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
64
规则和要求要多看看源代码了,我有什么问题就直接看的源码,貌似没有详细的文档说明,http://code.google.com/p/duilib/downloads/list有一个简单的说明文档,你可以参考下;至于CEditUI我没用到,还没研究,有时间试试。
2010-12-5 18:50
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
65
看看在学习一下
2010-12-5 22:42
0
雪    币: 354
活跃值: (157)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
66
楼主很厉害啊,请问楼主在没有demo和说明文档的情况下是如何分析库文件代码的?比如CWindowWnd: 窗口对象类(窗口实例对象父类)是如何分析得出,并如何派生运用的。
谢谢!
2010-12-11 11:45
0
雪    币: 303
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
67
下载学习。。
2010-12-11 15:49
0
雪    币: 440
活跃值: (119)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
68
我学习的时候是有一个Demo的,呵呵;至于学习方法,运行调试。
2010-12-11 16:43
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
69
尽一切可能滴学习。。。
2010-12-11 16:59
0
雪    币: 354
活跃值: (157)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
70
俺也是这样,全靠f10,f11了,谢谢楼主指点。
2010-12-12 10:13
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
71
这玩意没有说明文档, 只能靠修改xml, 然后在断点试了, 这个学习速度就太慢了

我研究一个晚上, 拿那个360SafeDemo为例, 他的大概过程是这样的:
1. C360SafeFrameWnd 继承自CWindowWnd和INotifyUI, 创建一个新的窗口
2. 由这个新窗口的窗口处理过程处理来自windows的窗口消息, 该处理是在
    LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) 这个虚函数中进行的
3. 在WM_CREATE中根据xml创建窗口界面,这个创建过程是一个递归的创建过程, 创建完毕后,将自己注册
    到窗口管理器CPaintManagerUI, 这样就可以由窗口管理器进行统一调度,包括绘制界面以及子控件消息
    处理
4. void Notify(TNotifyUI& msg)虚函数中处理来自控件的通知消息

整个消息的传递过程是这样的:
继承窗口先处理消息,如果继承窗口没有处理, 则由CPaintManagerUI的消息链处理
如果消息链还不处理, 则丢给窗口CWindowWnd处理
C360SafeFrameWnd ==>
CPaintManagerUI  ==>
CWindowWnd(基类)

不知道我理解的对不对?
2010-12-12 19:33
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
72
由于只有一个窗口, 其它的所有的所谓的子控件全部为绘制的, 所以子控件的管理、事件、消息, 全部由窗口管理器来统一处理和调度, 看明白CPaintManagerUI的消息派发和处理过程是最为关键的
2010-12-12 19:38
0
雪    币: 440
活跃值: (119)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
73
呵呵,分析的不错;现在有了一个DuiLib 群:41830909,如果有兴趣,可以加一下,大家共同交流学习。
2010-12-12 19:43
0
雪    币: 387
活跃值: (25)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
74
我有一个建议, 大家把分析的结果和理解都写在这里, 甚至自己写的demo也放在这里, 而且弄个详细一点的说明, 这样大家都有个参考, 通过讨论, 可能更快的明白这里的实现过程。

虽然这个库用于写大一点的软件不现实, 但是偶尔用用写写比较小的程序,还是挺不错的, 尽管写起来有些复杂。

如果这个库经过细致的修改和完善, 设计一套合理的简易的处理过程, 将xml结构化, 形成一套完整的机制, 然后再写一个界面设计器, 自动生成界面xml, 这样, 我觉得就可以投入正常的使用了, 可能不满足大型软件的设计, 但是一般的中小型的软件还是可以胜任的。

不知道有没有这方面兴趣的人, 一起来搞一下?
2010-12-12 19:47
0
雪    币: 339
活跃值: (101)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
75
谢谢分享,lz,请问你的图片都是用什么工具挖掘的?我以前挖过,似乎没这么全呢。
2010-12-20 14:13
0
游客
登录 | 注册 方可回帖
返回
//