soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SMenuEx.h
1#ifndef __SMENUEX__H__
2#define __SMENUEX__H__
3
4#include <core/SHostWnd.h>
5#include <interface/smenuex-i.h>
6
7SNSBEGIN
8
9class SMenuExRoot;
10class SMenuEx;
11
12/**
13 * @class SMenuExItem
14 * @brief 扩展菜单项类
15 */
16class SOUI_EXP SMenuExItem : public SWindow {
17 DEF_SOBJECT(SWindow, L"menuItem")
18 friend class SMenuEx;
19
20 public:
21 /**
22 * @brief 构造函数
23 * @param pOwnerMenu 所属菜单对象指针
24 * @param pItemSkin 菜单项皮肤对象指针
25 */
26 SMenuExItem(SMenuEx *pOwnerMenu, ISkinObj *pItemSkin);
27
28 /**
29 * @brief 析构函数
30 */
32
33 /**
34 * @brief 获取子菜单
35 * @return 子菜单对象指针
36 */
37 SMenuEx *GetSubMenu();
38
39 /**
40 * @brief 获取所属菜单
41 * @return 所属菜单对象指针
42 */
43 SMenuEx *GetOwnerMenu();
44
45 /**
46 * @brief 隐藏子菜单
47 */
48 void HideSubMenu();
49
50 /**
51 * @brief 显示子菜单
52 * @param bCheckFirstItem 是否选中第一个子菜单项
53 */
54 void ShowSubMenu(BOOL bCheckFirstItem);
55
56 /**
57 * @brief 获取热键字符
58 * @return 热键字符
59 */
60 WCHAR GetHotKey() const;
61
62 protected:
63 /**
64 * @brief 处理子菜单隐藏事件
65 * @param bUncheckItem 是否取消选中子菜单项
66 */
67 void OnSubMenuHided(BOOL bUncheckItem);
68
69 /**
70 * @brief 创建子窗口
71 * @param xmlNode XML节点
72 * @return 成功返回TRUE,失败返回FALSE
73 */
74 BOOL CreateChildren(SXmlNode xmlNode) OVERRIDE;
75
76 /**
77 * @brief 根据名称创建子窗口
78 * @param pszName 子窗口名称
79 * @return 子窗口对象指针
80 */
81 SWindow *CreateChildByName(LPCWSTR pszName) OVERRIDE;
82
83 /**
84 * @brief 获取期望的大小
85 * @param psz 大小结构指针
86 * @param wid 宽度
87 * @param hei 高度
88 */
89 STDMETHOD_(void, GetDesiredSize)(THIS_ SIZE *psz, int wid, int hei) OVERRIDE;
90
91 /**
92 * @brief 获取文本矩形
93 * @param pRect 矩形结构指针
94 */
95 void GetTextRect(LPRECT pRect) OVERRIDE;
96
97 protected:
98 /**
99 * @brief 处理擦除背景消息
100 * @param pRT 渲染目标对象指针
101 * @return 成功返回TRUE,失败返回FALSE
102 */
103 BOOL OnEraseBkgnd(IRenderTarget *pRT);
104
105 /**
106 * @brief 处理绘制消息
107 * @param pRT 渲染目标对象指针
108 */
109 void OnPaint(IRenderTarget *pRT);
110
111 SOUI_MSG_MAP_BEGIN()
112 MSG_WM_ERASEBKGND_EX(OnEraseBkgnd)
113 MSG_WM_PAINT_EX(OnPaint)
114 SOUI_MSG_MAP_END()
115
116 protected:
117 SOUI_ATTRS_BEGIN()
118 ATTR_INT(L"icon", m_iIcon, TRUE) // 图标索引
119 ATTR_INT(L"check", m_bCheck, TRUE) // 是否选中
120 ATTR_INT(L"radio", m_bRadio, TRUE) // 是否为单选按钮
121 ATTR_CHAR(L"hotKey", m_cHotKey, FALSE) // 热键字符
122 SOUI_ATTRS_END()
123
124 SMenuEx *m_pSubMenu; // 子菜单对象指针
125 SMenuEx *m_pOwnerMenu; // 所属菜单对象指针
126 int m_iIcon; // 图标索引
127 BOOL m_bCheck; // 是否选中
128 BOOL m_bRadio; // 是否为单选按钮
129 WCHAR m_cHotKey; // 热键字符
130};
131
132/**
133 * @class SMenuEx
134 * @brief 扩展菜单类
135 */
136class SOUI_EXP SMenuEx
137 : protected SHostWnd
138 , public IMenuEx {
139 friend class SMenuExItem;
140 friend class SMenuExRunData;
141 friend class SMenuExRoot;
142 typedef SHostWnd __baseCls;
143
144 public:
145 /**
146 * @brief 构造函数
147 */
148 SMenuEx(void);
149
150 /**
151 * @brief 析构函数
152 */
153 virtual ~SMenuEx(void);
154
155 public:
156 //! 添加引用
157 STDMETHOD_(long, AddRef)(THIS) OVERRIDE
158 {
159 return SHostWnd::AddRef();
160 }
161
162 //! 释放引用
163 STDMETHOD_(long, Release)(THIS) OVERRIDE
164 {
165 return SHostWnd::Release();
166 }
167
168 //! 释放对象
169 STDMETHOD_(void, OnFinalRelease)(THIS) OVERRIDE
170 {
171 delete this;
172 }
173
174 //=================================================================
175 /**
176 * @brief 加载菜单资源
177 * @param resId 资源ID
178 * @return 成功返回TRUE,失败返回FALSE
179 */
180 STDMETHOD_(BOOL, LoadMenu)(THIS_ LPCTSTR resId) OVERRIDE;
181
182 /**
183 * @brief 加载菜单资源(UTF-8)
184 * @param resId 资源ID
185 * @return 成功返回TRUE,失败返回FALSE
186 */
187 STDMETHOD_(BOOL, LoadMenuU8)(THIS_ LPCSTR resId) OVERRIDE;
188
189 /**
190 * @brief 加载菜单资源(XML)
191 * @param xmlMenu XML节点
192 * @return 成功返回TRUE,失败返回FALSE
193 */
194 STDMETHOD_(BOOL, LoadMenu2)(THIS_ IXmlNode *xmlMenu) OVERRIDE;
195
196 /**
197 * @brief 插入菜单项
198 * @param uPosition 位置
199 * @param uFlags 标志
200 * @param nIDNewItem 新项ID
201 * @param strText 文本
202 * @param iIcon 图标索引(默认为-1)
203 * @return 成功返回TRUE,失败返回FALSE
204 */
205 STDMETHOD_(BOOL, InsertMenu)(THIS_ UINT uPosition, UINT uFlags, int nIDNewItem, LPCTSTR strText, int iIcon DEF_VAL(-1)) OVERRIDE;
206
207 /**
208 * @brief 追加菜单项
209 * @param uFlags 标志
210 * @param uIDNewItem 新项ID
211 * @param lpNewItem 文本
212 * @param iIcon 图标索引(默认为-1)
213 * @return 成功返回TRUE,失败返回FALSE
214 */
215 STDMETHOD_(BOOL, AppendMenu)(THIS_ UINT uFlags, int uIDNewItem, LPCTSTR lpNewItem, int iIcon DEF_VAL(-1)) OVERRIDE;
216
217 /**
218 * @brief 检查菜单项(单选按钮)
219 * @param idFirst 第一个菜单项ID
220 * @param idLast 最后一个菜单项ID
221 * @param idCheck 要检查的菜单项ID
222 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
223 * @return 成功返回TRUE,失败返回FALSE
224 */
225 STDMETHOD_(BOOL, CheckMenuRadioItem)(THIS_ UINT idFirst, UINT idLast, UINT idCheck, UINT uFlags) OVERRIDE;
226
227 /**
228 * @brief 检查菜单项
229 * @param uIdCheckItem 要检查的菜单项ID
230 * @param uCheck 检查标志(例如,MF_CHECKED, MF_UNCHECKED)
231 * @return 成功返回TRUE,失败返回FALSE
232 */
233 STDMETHOD_(BOOL, CheckMenuItem)(THIS_ UINT uIdCheckItem, UINT uCheck) OVERRIDE;
234
235 /**
236 * @brief 删除菜单项
237 * @param uPosition 菜单项位置
238 * @param uFlags 删除标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
239 * @return 成功返回TRUE,失败返回FALSE
240 */
241 STDMETHOD_(BOOL, DeleteMenu)(THIS_ UINT uPosition, UINT uFlags) OVERRIDE;
242
243 /**
244 * @brief 跟踪弹出菜单
245 * @param uFlags 跟踪标志(例如,TPM_LEFTALIGN, TPM_RIGHTALIGN)
246 * @param x 菜单左上角的X坐标
247 * @param y 菜单左上角的Y坐标
248 * @param hWnd 父窗口句柄
249 * @param nScale 缩放比例(默认为100)
250 * @return 菜单项ID
251 */
252 STDMETHOD_(UINT, TrackPopupMenu)(THIS_ UINT uFlags, int x, int y, HWND hWnd, int nScale DEF_VAL(100)) OVERRIDE;
253
254 /**
255 * @brief 销毁菜单
256 */
257 STDMETHOD_(void, DestroyMenu)(THIS) OVERRIDE;
258
259 /**
260 * @brief 修改菜单项字符串
261 * @param uPosition 菜单项位置
262 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
263 * @param lpItemString 新的菜单项字符串
264 * @return 成功返回TRUE,失败返回FALSE
265 */
266 STDMETHOD_(BOOL, ModifyMenuString)(THIS_ UINT uPosition, UINT uFlags, LPCTSTR lpItemString) OVERRIDE;
267
268 /**
269 * @brief 设置菜单项用户数据
270 * @param uPosition 菜单项位置
271 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
272 * @param ulUserData 用户数据
273 * @return 成功返回TRUE,失败返回FALSE
274 */
275 STDMETHOD_(BOOL, SetMenuUserData)(THIS_ UINT uPosition, UINT uFlags, ULONG_PTR ulUserData) OVERRIDE;
276
277 /**
278 * @brief 获取菜单项用户数据
279 * @param uPosition 菜单项位置
280 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
281 * @return 用户数据
282 */
283 STDMETHOD_(ULONG_PTR, GetMenuUserData)(THIS_ UINT uPosition, UINT uFlags) OVERRIDE;
284
285 /**
286 * @brief 获取上下文帮助ID
287 * @return 上下文帮助ID
288 */
289 STDMETHOD_(DWORD, GetContextHelpId)(THIS) SCONST OVERRIDE;
290
291 /**
292 * @brief 设置上下文帮助ID
293 * @param dwId 上下文帮助ID
294 */
295 STDMETHOD_(void, SetContextHelpId)(THIS_ DWORD dwId) OVERRIDE;
296
297 /**
298 * @brief 获取子菜单
299 * @param nPos 子菜单位置
300 * @return 子菜单对象指针
301 */
302 STDMETHOD_(IMenuEx *, GetSubMenu)(THIS_ int nPos) OVERRIDE;
303
304 /**
305 * @brief 获取菜单项字符串
306 * @param uPosition 菜单项位置
307 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
308 * @param lpItemString 接收菜单项字符串的对象指针
309 * @return 成功返回TRUE,失败返回FALSE
310 */
311 STDMETHOD_(BOOL, GetMenuString)(THIS_ UINT uPosition, UINT uFlags, IStringT *lpItemString) OVERRIDE;
312
313 /**
314 * @brief 获取宿主窗口
315 * @return 宿主窗口对象指针
316 */
317 STDMETHOD_(IHostWnd *, GetHostWnd)(THIS) OVERRIDE
318 {
319 return this;
320 }
321
322 public:
323 /**
324 * @brief 结束菜单
325 * @param nCmdId 命令ID(默认为0)
326 */
327 static void EndMenu(int nCmdId = 0);
328
329 /**
330 * @brief 获取事件所有者
331 * @return 事件所有者对象指针
332 */
333 static SMenuEx *GetEvtOwner();
334
335 /**
336 * @brief 获取父菜单项
337 * @return 父菜单项对象指针
338 */
339 SMenuExItem *GetParentItem()
340 {
341 return m_pParent;
342 }
343
344 /**
345 * @brief 获取子菜单
346 * @param nID 菜单项ID
347 * @param byCmdId 是否按命令ID查找
348 * @return 子菜单对象指针
349 */
350 SMenuEx *GetSubMenu(int nID, BOOL byCmdId);
351
352 /**
353 * @brief 获取菜单项
354 * @param nID 菜单项ID
355 * @param byCmdId 是否按命令ID查找
356 * @return 菜单项对象指针
357 */
358 SMenuExItem *GetMenuItem(int nID, BOOL byCmdId);
359
360 protected:
361 /**
362 * @brief 初始化一个空菜单(不应在外部调用)
363 * @param ParentRoot 父菜单根对象指针
364 * @return 成功返回TRUE,失败返回FALSE
365 */
366 BOOL IniNullMenu(SMenuExRoot *ParentRoot);
367
368 /**
369 * @brief 处理鼠标激活消息
370 * @param wndTopLevel 顶级窗口句柄
371 * @param nHitTest 击中测试结果
372 * @param message 消息ID
373 * @return 激活状态
374 */
375 int OnMouseActivate(HWND wndTopLevel, UINT nHitTest, UINT message);
376
377 /**
378 * @brief 处理定时器消息
379 * @param timeID 定时器ID
380 */
381 void OnTimer(UINT_PTR timeID);
382
383 /**
384 * @brief 处理按键消息
385 * @param nChar 字符
386 * @param nRepCnt 重复次数
387 * @param nFlags 标志
388 */
389 void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
390
391 BEGIN_MSG_MAP_EX(SMenuEx)
392 MSG_WM_MOUSEACTIVATE(OnMouseActivate)
393 MSG_WM_TIMER(OnTimer)
394 MSG_WM_KEYDOWN(OnKeyDown)
395 CHAIN_MSG_MAP(SHostWnd)
396 END_MSG_MAP()
397
398 protected:
399 /**
400 * @brief 处理事件
401 * @param pEvt 事件参数对象指针
402 * @return 成功返回TRUE,失败返回FALSE
403 */
404 virtual BOOL _HandleEvent(IEvtArgs *pEvt);
405
406 /**
407 * @brief 从资源ID加载布局
408 * @param xmlDoc XML文档对象引用
409 * @return 成功返回TRUE,失败返回FALSE
410 */
411 BOOL OnLoadLayoutFromResourceID(SXmlDoc &xmlDoc) override;
412
413 /**
414 * @brief 创建根窗口
415 * @return 根窗口对象指针
416 */
417 SRootWindow *CreateRoot() override;
418
419 /**
420 * @brief 获取翻译上下文
421 * @return 翻译上下文字符串
422 */
423 STDMETHOD_(LPCWSTR, GetTranslatorContext)(THIS) SCONST OVERRIDE;
424
425 /**
426 * @brief 获取缩放比例
427 * @return 缩放比例
428 */
429 STDMETHOD_(int, GetScale)() SCONST OVERRIDE;
430
431 /**
432 * @brief 查找菜单项
433 * @param uPos 位置
434 * @param uFlag 标志
435 * @return 菜单项对象指针
436 */
437 SWindow *FindItem(UINT uPos, UINT uFlag);
438
439 /**
440 * @brief 显示菜单
441 * @param uFlag 标志
442 * @param x X坐标
443 * @param y Y坐标
444 */
445 void ShowMenu(UINT uFlag, int x, int y);
446
447 /**
448 * @brief 隐藏菜单
449 * @param bUncheckParentItem 是否取消选中父菜单项
450 */
451 void HideMenu(BOOL bUncheckParentItem);
452
453 /**
454 * @brief 隐藏子菜单
455 */
456 void HideSubMenu();
457
458 /**
459 * @brief 运行菜单
460 * @param hOwner 所有者窗口句柄
461 */
462 void RunMenu(HWND hOwner);
463
464 /**
465 * @brief 弹出子菜单
466 * @param pItem 菜单项对象指针
467 * @param bCheckFirstItem 是否选中第一个子菜单项
468 */
469 void PopupSubMenu(SMenuExItem *pItem, BOOL bCheckFirstItem);
470
471 /**
472 * @brief 处理子菜单隐藏事件
473 * @param bUncheckItem 是否取消选中子菜单项
474 */
475 void OnSubMenuHided(BOOL bUncheckItem);
476
477 /**
478 * @brief 构造函数(带父菜单项)
479 * @param pParent 父菜单项对象指针
480 */
481 SMenuEx(SMenuExItem *pParent);
482
483 /**
484 * @brief 发送初始化弹出菜单事件给所有者
485 * @param idx 索引
486 */
487 void SendInitPopupMenu2Owner(int idx);
488
489 SMenuExItem *m_pParent; // 父菜单项对象指针
490 SMenuExItem *m_pHoverItem; // 悬停菜单项对象指针
491 SMenuExItem *m_pCheckItem; // 选中菜单项对象指针
492
493 BOOL m_bMenuInitialized; // 菜单是否已初始化
494};
495
496SNSEND
497
498#endif // __SMENUEX__H__
The main host window class responsible for managing the layout, events, and rendering of SOUI windows...
Definition SHostWnd.h:318
SHostWnd(LPCWSTR pszResName=NULL)
Constructs a SHostWnd object with an optional resource name.
Definition shostwnd.cpp:313
扩展菜单类
Definition SMenuEx.h:138
IHostWnd * GetHostWnd() OVERRIDE
获取宿主窗口
Definition SMenuEx.h:317
SMenuEx(void)
构造函数
Definition SMenuEx.cpp:563
void OnFinalRelease() OVERRIDE
释放对象
Definition SMenuEx.h:169
long Release() OVERRIDE
释放引用
Definition SMenuEx.h:163
long AddRef() OVERRIDE
添加引用
Definition SMenuEx.h:157
SMenuExItem * GetParentItem()
获取父菜单项
Definition SMenuEx.h:339
扩展菜单项类
Definition SMenuEx.h:16
SMenuEx * GetSubMenu()
获取子菜单
Definition SMenuEx.cpp:384
void GetDesiredSize(SIZE *psz, int wid, int hei) OVERRIDE
获取期望的大小
Definition SMenuEx.cpp:312
void OnPaint(IRenderTarget *pRT)
处理绘制消息
Definition SMenuEx.cpp:229
SMenuExItem(SMenuEx *pOwnerMenu, ISkinObj *pItemSkin)
构造函数
Definition SMenuEx.cpp:215
void OnSubMenuHided(BOOL bUncheckItem)
处理子菜单隐藏事件
Definition SMenuEx.cpp:355
void HideSubMenu()
隐藏子菜单
Definition SMenuEx.cpp:372
void ShowSubMenu(BOOL bCheckFirstItem)
显示子菜单
Definition SMenuEx.cpp:365
BOOL OnEraseBkgnd(IRenderTarget *pRT)
处理擦除背景消息
Definition SMenuEx.cpp:280
WCHAR GetHotKey() const
获取热键字符
Definition SMenuEx.cpp:360
SMenuEx * GetOwnerMenu()
获取所属菜单
Definition SMenuEx.cpp:379
Root window class derived from SWindow.
Definition SHostWnd.h:187
Base class for SOUI DUI windows.
Definition SWnd.h:286
void OnPaint(IRenderTarget *pRT)
Handles the painting of the window.
Definition Swnd.cpp:1785
BOOL OnEraseBkgnd(IRenderTarget *pRT)
Handles the erasing of the background.
Definition Swnd.cpp:1733
virtual SWindow * CreateChildByName(LPCWSTR pszName)
Create child window by name.
Definition Swnd.cpp:935
SWindow()
Constructor.
Definition Swnd.cpp:104
virtual void GetTextRect(LPRECT pRect)
Calculate text display rectangle.
Definition Swnd.cpp:1961
virtual BOOL CreateChildren(SXmlNode xmlNode)
Create child windows from XML node.
Definition Swnd.cpp:823
Implementation of IXmlDoc.
Definition SXml.h:912
Class representing an XML node.
Definition SXml.h:352
long Release() PURE
Release reference.
long AddRef() PURE
Add reference.
Interface for rendering target objects.
Definition SRender-i.h:1440
Interface for Skin Objects.
Definition SSkinobj-i.h:29
Interface for XML nodes.
Definition sxml-i.h:128