soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SwndFinder.h
1#ifndef __SWNDFINDER__H__
2#define __SWNDFINDER__H__
3
4#include <core/SSingleton2.h>
5
6SNSBEGIN
7
8/**
9 * @struct SFindInfo
10 * @brief 查找信息结构体
11 */
13{
14 public:
15 /**
16 * @brief 构造函数,通过名称查找
17 * @param pParent 父窗口指针
18 * @param strName 窗口名称
19 * @param nDeep 查找深度
20 */
21 SFindInfo(SWindow *pParent, const SStringW &strName, int nDeep);
22
23 /**
24 * @brief 构造函数,通过ID查找
25 * @param pParent 父窗口指针
26 * @param nID 窗口ID
27 * @param nDeep 查找深度
28 */
29 SFindInfo(SWindow *pParent, int nID, int nDeep);
30
31 SWND hParent; // 父窗口句柄
32 bool findByName; // 是否通过名称查找
33 SStringW strName; // 窗口名称
34 int nID; // 窗口ID
35 int nDeep; // 查找深度
36};
37
38/**
39 * @class CElementTraits<SFindInfo>
40 * @brief SFindInfo的特性类,用于定义哈希和比较操作
41 */
42template <>
43class CElementTraits<SFindInfo> : public CElementTraitsBase<SFindInfo> {
44 public:
45 /**
46 * @brief 计算SFindInfo对象的哈希值
47 * @param fi SFindInfo对象
48 * @return 哈希值
49 */
50 static ULONG Hash(INARGTYPE fi)
51 {
52 ULONG lRet = 0;
53 if (fi.findByName)
54 lRet = SStringElementTraits<SStringW>::Hash(fi.strName);
55 else
56 lRet = fi.nID << 16;
57
58 union KEY {
59 LONG key;
60 struct long_sep
61 {
62 LONG hParent : 24;
63 LONG nDeep : 7;
64 LONG findByName : 1;
65 } sep;
66 } key;
67 key.sep.hParent = fi.hParent;
68 key.sep.nDeep = fi.nDeep;
69 key.sep.findByName = fi.findByName;
70
71 lRet += key.key;
72 return lRet;
73 }
74
75 /**
76 * @brief 比较两个SFindInfo对象是否相等
77 * @param element1 第一个SFindInfo对象
78 * @param element2 第二个SFindInfo对象
79 * @return 如果相等返回true,否则返回false
80 */
81 static bool CompareElements(INARGTYPE element1, INARGTYPE element2)
82 {
83 bool bRet = element1.findByName == element2.findByName;
84 if (bRet)
85 bRet = element1.hParent == element2.hParent;
86 if (bRet)
87 {
88 if (element1.findByName)
89 bRet = element1.strName == element2.strName;
90 else
91 bRet = element1.nID == element2.nID;
92 }
93 return bRet;
94 }
95
96 /**
97 * @brief 比较两个SFindInfo对象的顺序
98 * @param element1 第一个SFindInfo对象
99 * @param element2 第二个SFindInfo对象
100 * @return 如果element1小于element2返回负数,如果相等返回0,如果element1大于element2返回正数
101 */
102 static int CompareElementsOrdered(INARGTYPE element1, INARGTYPE element2)
103 {
104 int nRet = element1.findByName - element2.findByName;
105 if (nRet == 0)
106 nRet = element1.hParent - element2.hParent;
107 if (nRet == 0)
108 {
109 if (element1.findByName)
110 nRet = element1.strName.Compare(element2.strName);
111 else
112 nRet = element1.nID - element2.nID;
113 }
114 return nRet;
115 }
116};
117
118/**
119 * @class SWindowFinder
120 * @brief 窗口查找器类,继承自单例类
121 */
122class SWindowFinder : public SSingleton2<SWindowFinder> {
123 SINGLETON2_TYPE(SINGLETON_WINDOWFINDER)
124
125 friend class SWindow;
126
127 protected:
128 /**
129 * @brief 通过名称查找子窗口
130 * @param pParent 父窗口指针
131 * @param strName 窗口名称
132 * @param nDeep 查找深度
133 * @return 找到的窗口指针,未找到返回NULL
134 */
135 SWindow *FindChildByName(SWindow *pParent, const SStringW &strName, int nDeep);
136
137 /**
138 * @brief 通过ID查找子窗口
139 * @param pParent 父窗口指针
140 * @param nID 窗口ID
141 * @param nDeep 查找深度
142 * @return 找到的窗口指针,未找到返回NULL
143 */
144 SWindow *FindChildByID(SWindow *pParent, int nID, int nDeep);
145
146 /**
147 * @brief 缓存通过名称查找的结果
148 * @param pParent 父窗口指针
149 * @param strName 窗口名称
150 * @param nDeep 查找深度
151 * @param pResult 找到的窗口指针
152 */
153 void CacheResultForName(SWindow *pParent, const SStringW &strName, int nDeep, SWindow *pResult);
154
155 /**
156 * @brief 缓存通过ID查找的结果
157 * @param pParent 父窗口指针
158 * @param nID 窗口ID
159 * @param nDeep 查找深度
160 * @param pResult 找到的窗口指针
161 */
162 void CacheResultForID(SWindow *pParent, int nID, int nDeep, SWindow *pResult);
163
164 protected:
165 /**
166 * @brief 通过查找信息查找子窗口
167 * @param pParent 父窗口指针
168 * @param fi 查找信息对象
169 * @return 找到的窗口指针,未找到返回NULL
170 */
171 SWindow *FindChildByKey(SWindow *pParent, const SFindInfo &fi);
172
173 typedef SMap<SFindInfo, SWND> FINDCACHE; // 查找缓存类型
174 FINDCACHE m_findCache; // 查找缓存
175};
176
177SNSEND
178
179#endif // __SWNDFINDER__H__
Pseudo-Singleton Template.
static bool CompareElements(INARGTYPE element1, INARGTYPE element2)
比较两个SFindInfo对象是否相等
Definition SwndFinder.h:81
static ULONG Hash(INARGTYPE fi)
计算SFindInfo对象的哈希值
Definition SwndFinder.h:50
static int CompareElementsOrdered(INARGTYPE element1, INARGTYPE element2)
比较两个SFindInfo对象的顺序
Definition SwndFinder.h:102
A class representing an ASCII string.
Definition sstringw.h:96
窗口查找器类,继承自单例类
Definition SwndFinder.h:122
void CacheResultForID(SWindow *pParent, int nID, int nDeep, SWindow *pResult)
缓存通过ID查找的结果
SWindow * FindChildByName(SWindow *pParent, const SStringW &strName, int nDeep)
通过名称查找子窗口
SWindow * FindChildByID(SWindow *pParent, int nID, int nDeep)
通过ID查找子窗口
SWindow * FindChildByKey(SWindow *pParent, const SFindInfo &fi)
通过查找信息查找子窗口
void CacheResultForName(SWindow *pParent, const SStringW &strName, int nDeep, SWindow *pResult)
缓存通过名称查找的结果
Base class for SOUI DUI windows.
Definition SWnd.h:286
查找信息结构体
Definition SwndFinder.h:13
SFindInfo(SWindow *pParent, const SStringW &strName, int nDeep)
构造函数,通过名称查找
Definition SwndFinder.cpp:7