能力值:
( LV2,RANK:10 )
|
-
-
51 楼
收藏学习了~~~
|
能力值:
( LV6,RANK:90 )
|
-
-
52 楼
“呵呵,我是照着360界面,一点一点抠的图弄得,费了不少劲儿。"
欣赏楼主,赞一个,愚公移山的精神,真正的程序员就是这个样子,向你学习。
|
能力值:
( LV2,RANK:10 )
|
-
-
53 楼
真的很感谢。
|
能力值:
( LV2,RANK:10 )
|
-
-
54 楼
支持研究DirectUI
|
能力值:
( LV2,RANK:10 )
|
-
-
55 楼
release下运行报错,找不到UIlib_u.lib
|
能力值:
( LV6,RANK:80 )
|
-
-
56 楼
将工程设置为Use Multi-Byte Character Set即可,因为UIlib是Multi-Byte,而非Unicode的。
|
能力值:
( LV5,RANK:60 )
|
-
-
57 楼
试了一下,好用,顶上
|
能力值:
( LV2,RANK:10 )
|
-
-
58 楼
不错,以前看到那个windowless,都不支持中文,现在修改过这个贴图都支持了
|
能力值:
( 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解析错误
我一直搞不明白怎么会多出一个问号?
|
能力值:
( 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修改的, 应该不会修改它的编码呀
|
能力值:
( 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的转换会多一个问号
谁能说明白这个问题
|
能力值:
( 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对于英文的编码是一样的)。不过我还是觉得你的做法是对的,我的有点投机了。。。
|
能力值:
( LV7,RANK:100 )
|
-
-
63 楼
这个界面布局有什么规则和要求? 为什么我仿照写的xml布局很多时候达不到我想要的效果?
这些控件自绘的属性有没有比较详细一点的说明, 感觉现在都是慢慢尝试, 速度太慢了
那个CEditUI如何支持多行?
|
能力值:
( LV6,RANK:80 )
|
-
-
64 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
65 楼
看看在学习一下
|
能力值:
( LV7,RANK:100 )
|
-
-
66 楼
楼主很厉害啊,请问楼主在没有demo和说明文档的情况下是如何分析库文件代码的?比如CWindowWnd: 窗口对象类(窗口实例对象父类)是如何分析得出,并如何派生运用的。
谢谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
67 楼
下载学习。。
|
能力值:
( LV6,RANK:80 )
|
-
-
68 楼
我学习的时候是有一个Demo的,呵呵;至于学习方法,运行调试。
|
能力值:
( LV4,RANK:50 )
|
-
-
69 楼
尽一切可能滴学习。。。
|
能力值:
( LV7,RANK:100 )
|
-
-
70 楼
俺也是这样,全靠f10,f11了,谢谢楼主指点。
|
能力值:
( 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(基类)
不知道我理解的对不对?
|
能力值:
( LV7,RANK:100 )
|
-
-
72 楼
由于只有一个窗口, 其它的所有的所谓的子控件全部为绘制的, 所以子控件的管理、事件、消息, 全部由窗口管理器来统一处理和调度, 看明白CPaintManagerUI的消息派发和处理过程是最为关键的
|
能力值:
( LV6,RANK:80 )
|
-
-
73 楼
呵呵,分析的不错;现在有了一个DuiLib 群:41830909,如果有兴趣,可以加一下,大家共同交流学习。
|
能力值:
( LV7,RANK:100 )
|
-
-
74 楼
我有一个建议, 大家把分析的结果和理解都写在这里, 甚至自己写的demo也放在这里, 而且弄个详细一点的说明, 这样大家都有个参考, 通过讨论, 可能更快的明白这里的实现过程。
虽然这个库用于写大一点的软件不现实, 但是偶尔用用写写比较小的程序,还是挺不错的, 尽管写起来有些复杂。
如果这个库经过细致的修改和完善, 设计一套合理的简易的处理过程, 将xml结构化, 形成一套完整的机制, 然后再写一个界面设计器, 自动生成界面xml, 这样, 我觉得就可以投入正常的使用了, 可能不满足大型软件的设计, 但是一般的中小型的软件还是可以胜任的。
不知道有没有这方面兴趣的人, 一起来搞一下?
|
能力值:
( LV2,RANK:10 )
|
-
-
75 楼
谢谢分享,lz,请问你的图片都是用什么工具挖掘的?我以前挖过,似乎没这么全呢。
|
|
|