soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SMenu.h
1#ifndef __SMENU__H__
2#define __SMENU__H__
3
4#include <windows.h>
5#include <sobject/Sobject.hpp>
6#include <core/SNativeWnd.h>
7#include <res.mgr/SSkinPool.h>
8#include <helper/obj-ref-impl.hpp>
9#include <interface/smenu-i.h>
10
11SNSBEGIN
12
13#define CX_ICON 16 // 支持的图标的宽度
14#define CY_ICON 16 // 支持的图标的高度
15
16/**
17 * @class SMenuAttr
18 * @brief 菜单属性类
19 */
20class SMenuAttr : public TObjRefImpl<SObject> {
21 friend class SMenu;
22 friend class SMenuODWnd;
23 DEF_SOBJECT(TObjRefImpl<SObject>, L"menuattr")
24
25 public:
26 /**
27 * @brief 构造函数
28 */
29 SMenuAttr();
30
31 /**
32 * @brief 析构函数
33 */
34 ~SMenuAttr();
35
36 /**
37 * @brief 设置缩放比例
38 * @param scale 缩放比例
39 */
40 void SetScale(int scale);
41
42 SOUI_ATTRS_BEGIN()
43 ATTR_SKIN(L"itemSkin", m_pItemSkin, FALSE) // 菜单项皮肤,包含2种状态:正常状态+选中状态
44 ATTR_SKIN(L"iconSkin", m_pIconSkin, FALSE) // 菜单图标
45 ATTR_SKIN(L"sepSkin", m_pSepSkin, FALSE) // 分割栏皮肤
46 ATTR_SKIN(L"checkSkin", m_pCheckSkin, FALSE) // 选中状态,包含两种状态:勾选+圈选
47 ATTR_LAYOUTSIZE(L"itemHeight", m_nItemHei, FALSE) // 菜单项高度
48 ATTR_LAYOUTSIZE(L"iconMargin", m_nIconMargin, FALSE) // 图标边缘空间
49 ATTR_LAYOUTSIZE(L"textMargin", m_nTextMargin, FALSE) // 文本边缘空间
50 ATTR_LAYOUTSIZE(L"maxWidth", m_nMaxWidth, FALSE) // 菜单项最大宽度
51 ATTR_LAYOUTSIZE2(L"iconSize", m_szIcon, FALSE) // 图标尺寸
52 ATTR_FONT(L"font", m_dpiFont, FALSE) // 字体
53 ATTR_COLOR(L"colorText", m_crTxtNormal, FALSE) // 正常文本颜色
54 ATTR_COLOR(L"colorTextSel", m_crTxtSel, FALSE) // 选中文本颜色
55 ATTR_COLOR(L"colorTextGray", m_crTxtGray, FALSE) // 灰文本颜色
56 ATTR_STRINGW(L"trCtx", m_strTrCtx, FALSE) // 翻译上下文
57 SOUI_ATTRS_END()
58
59 protected:
60 /**
61 * @brief 获取文本边缘空间
62 * @return 文本边缘空间
63 */
64 int GetTextMargin();
65
66 /**
67 * @brief 获取图标边缘空间
68 * @return 图标边缘空间
69 */
70 int GetIconMargin();
71
72 /**
73 * @brief 获取图标尺寸
74 * @return 图标尺寸
75 */
76 CSize GetIconSize();
77
78 /**
79 * @brief 获取菜单项高度
80 * @return 菜单项高度
81 */
82 int GetItemHeight();
83
84 /**
85 * @brief 获取菜单项最大宽度
86 * @return 菜单项最大宽度
87 */
88 int GetMaxWidth();
89
90 /**
91 * @brief 获取缩放比例
92 * @return 缩放比例
93 */
94 int GetScale() const
95 {
96 return m_scale;
97 }
98
99 /**
100 * @brief 获取字体指针
101 * @return 字体指针
102 */
104
105 protected:
106 /**
107 * @brief 初始化完成后的回调函数
108 * @param xmlNode XML节点
109 */
110 virtual void WINAPI OnInitFinished(SXmlNode xmlNode);
111
112 SAutoRefPtr<ISkinObj> m_pItemSkin; // 菜单项皮肤,包含2种状态:正常状态+选中状态
113 SAutoRefPtr<ISkinObj> m_pIconSkin; // 菜单图标
114 SAutoRefPtr<ISkinObj> m_pSepSkin; // 分割栏皮肤
115 SAutoRefPtr<ISkinObj> m_pCheckSkin; // 选中状态,包含两种状态:勾选+圈选
116 SLayoutSize m_nItemHei; // 菜单项高度
117 SLayoutSize m_nIconMargin; // 图标边缘空间
118 SLayoutSize m_nTextMargin; // 文本边缘空间
119 COLORREF m_crTxtNormal; // 正常文本颜色
120 COLORREF m_crTxtSel; // 选中文本颜色
121 COLORREF m_crTxtGray; // 灰文本颜色
122 SLayoutSize m_szIcon[2]; // 图标尺寸
123 SDpiAwareFont m_dpiFont; // 字体
124 SStringW m_strTrCtx; // 翻译上下文
125 SLayoutSize m_nMaxWidth; // 菜单项最大宽度
126 int m_scale; // 缩放比例
127};
128
129/**
130 * @struct SMenuItemData
131 * @brief 菜单项数据结构
132 */
134{
135 /**
136 * @brief 构造函数
137 */
139
140 /**
141 * @brief 析构函数
142 */
144
145 int iIcon; // 图标索引
146 SStringT strText; // 文本
147 UINT vHotKey; // 快捷键
148 ULONG_PTR dwUserData; // 用户数据
149 HICON hIcon; // 图标句柄
150};
151
152/**
153 * @class SOwnerDraw
154 * @brief 所有者绘制模板类
155 * @tparam T 派生类类型
156 */
157template <class T>
159 public:
160 // Message map and handlers
161 BEGIN_MSG_MAP_EX(SOwnerDraw<T>)
162 MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem)
163 MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem)
164 MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem)
165 MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem)
166 MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar)
167 ALT_MSG_MAP(1)
168 MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem)
169 MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem)
170 MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem)
171 MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem)
172 END_MSG_MAP()
173
174 /**
175 * @brief 处理WM_DRAWITEM消息
176 * @param uMsg 消息ID
177 * @param wParam 附加参数1
178 * @param lParam 附加参数2
179 * @param bHandled 消息是否被处理
180 * @return 处理结果
181 */
182 LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL &bHandled)
183 {
184 T *pT = static_cast<T *>(this);
185 pT->SetMsgHandled(TRUE);
186 pT->DrawItem((LPDRAWITEMSTRUCT)lParam);
187 bHandled = pT->IsMsgHandled();
188 return (LRESULT)TRUE;
189 }
190
191 /**
192 * @brief 处理WM_MEASUREITEM消息
193 * @param uMsg 消息ID
194 * @param wParam 附加参数1
195 * @param lParam 附加参数2
196 * @param bHandled 消息是否被处理
197 * @return 处理结果
198 */
199 LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL &bHandled)
200 {
201 T *pT = static_cast<T *>(this);
202 pT->SetMsgHandled(TRUE);
203 pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam);
204 bHandled = pT->IsMsgHandled();
205 return (LRESULT)TRUE;
206 }
207
208 /**
209 * @brief 处理WM_COMPAREITEM消息
210 * @param uMsg 消息ID
211 * @param wParam 附加参数1
212 * @param lParam 附加参数2
213 * @param bHandled 消息是否被处理
214 * @return 处理结果
215 */
216 LRESULT OnCompareItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL &bHandled)
217 {
218 T *pT = static_cast<T *>(this);
219 pT->SetMsgHandled(TRUE);
220 bHandled = pT->IsMsgHandled();
221 return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam);
222 }
223
224 /**
225 * @brief 处理WM_DELETEITEM消息
226 * @param uMsg 消息ID
227 * @param wParam 附加参数1
228 * @param lParam 附加参数2
229 * @param bHandled 消息是否被处理
230 * @return 处理结果
231 */
232 LRESULT OnDeleteItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL &bHandled)
233 {
234 T *pT = static_cast<T *>(this);
235 pT->SetMsgHandled(TRUE);
236 pT->DeleteItem((LPDELETEITEMSTRUCT)lParam);
237 bHandled = pT->IsMsgHandled();
238 return (LRESULT)TRUE;
239 }
240
241 /**
242 * @brief 处理WM_MENUCHAR消息
243 * @param uMsg 消息ID
244 * @param wParam 附加参数1
245 * @param lParam 附加参数2
246 * @param bHandled 消息是否被处理
247 * @return 处理结果
248 */
249 LRESULT OnMenuChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
250 {
251 T *pT = static_cast<T *>(this);
252 pT->SetMsgHandled(TRUE);
253
254 UINT nChar = LOWORD(wParam);
255 UINT nFlags = HIWORD(wParam);
256 HMENU hMenu = (HMENU)lParam;
257 LRESULT lRes = pT->OnMenuChar(nChar, nFlags, hMenu);
258
259 bHandled = pT->IsMsgHandled();
260 return lRes;
261 }
262
263 // Overrideables
264 /**
265 * @brief 绘制菜单项
266 * @param lpDrawItemStruct 绘制项结构
267 */
268 void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/)
269 {
270 // must be implemented
271 SASSERT(FALSE);
272 }
273
274 /**
275 * @brief 测量菜单项
276 * @param lpMeasureItemStruct 测量项结构
277 */
278 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
279 {
280 if (lpMeasureItemStruct->CtlType != ODT_MENU)
281 {
282 // return default height for a system font
283 T *pT = static_cast<T *>(this);
284 HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID);
285 HDC dc = ::GetDC(hWnd);
286 TEXTMETRIC tm = { 0 };
287 GetTextMetrics(dc, &tm);
288
289 lpMeasureItemStruct->itemHeight = tm.tmHeight;
290 ::ReleaseDC(hWnd, dc);
291 }
292 else
293 lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU);
294 }
295
296 /**
297 * @brief 比较菜单项
298 * @param lpCompareItemStruct 比较项结构
299 * @return 比较结果
300 */
301 int CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/)
302 {
303 // all items are equal
304 return 0;
305 }
306
307 /**
308 * @brief 删除菜单项
309 * @param lpDeleteItemStruct 删除项结构
310 */
311 void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/)
312 {
313 // default - nothing
314 }
315};
316
317/**
318 * @class SMenuODWnd
319 * @brief 所有者绘制菜单窗口类
320 */
322 : public SNativeWnd
323 , public SOwnerDraw<SMenuODWnd> {
324 friend class SOwnerDraw<SMenuODWnd>;
325
326 public:
327 /**
328 * @brief 构造函数
329 * @param hMenuOwner 菜单所有者窗口句柄
330 * @param pMenuAttr 菜单属性对象指针
331 */
332 SMenuODWnd(HWND hMenuOwner, SMenuAttr *pMenuAttr);
333
334 /**
335 * @brief 析构函数
336 */
337 ~SMenuODWnd();
338
339 protected:
340 /**
341 * @brief 初始化菜单
342 * @param menu 菜单句柄
343 */
344 void OnInitMenu(HMENU menu);
345
346 /**
347 * @brief 初始化弹出菜单
348 * @param menuPopup 弹出菜单句柄
349 * @param nIndex 索引
350 * @param bSysMenu 是否为系统菜单
351 */
352 void OnInitMenuPopup(HMENU menuPopup, UINT nIndex, BOOL bSysMenu);
353
354 /**
355 * @brief 绘制菜单项
356 * @param lpDrawItemStruct 绘制项结构
357 */
358 void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
359
360 /**
361 * @brief 测量菜单项
362 * @param lpMeasureItemStruct 测量项结构
363 */
364 void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
365
366 /**
367 * @brief 处理菜单选择消息
368 * @param nItemID 项ID
369 * @param nFlags 标志
370 * @param menu 菜单句柄
371 */
372 void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU menu);
373
374 /**
375 * @brief 处理菜单字符消息
376 * @param nChar 字符
377 * @param nFlags 标志
378 * @param hMenu 菜单句柄
379 * @return 处理结果
380 */
381 LRESULT OnMenuChar(UINT nChar, UINT nFlags, HMENU hMenu);
382
383 BEGIN_MSG_MAP_EX(SMenuODWnd)
384 MSG_WM_INITMENU(OnInitMenu)
385 MSG_WM_INITMENUPOPUP(OnInitMenuPopup)
386 MSG_WM_MENUSELECT(OnMenuSelect)
387 CHAIN_MSG_MAP(SOwnerDraw<SMenuODWnd>)
388 REFLECT_NOTIFICATIONS_EX()
389 END_MSG_MAP()
390
391 HWND m_hMenuOwner; // 菜单所有者窗口句柄
392 SAutoRefPtr<SMenuAttr> m_attr; // 菜单属性对象指针
393};
394
395/**
396 * @class SMenu
397 * @brief 菜单类
398 */
399class SOUI_EXP SMenu : public TObjRefImpl<IMenu> {
400 public:
401 /**
402 * @brief 复制构造函数
403 * @param src 源菜单对象
404 */
405 SMenu(const SMenu &src);
406
407 /**
408 * @brief 构造函数
409 * @param hMenu 菜单句柄(默认为0)
410 */
411 SMenu(HMENU hMenu = 0);
412
413 /**
414 * @brief 析构函数
415 */
416 ~SMenu(void);
417
418 public:
419 HMENU m_hMenu; // 菜单句柄
420
421 public: // IMenu
422 /**
423 * @brief 附加菜单句柄
424 * @param hMenu 菜单句柄
425 * @return 成功返回TRUE,失败返回FALSE
426 */
427 STDMETHOD_(BOOL, Attach)(THIS_ HMENU hMenu) OVERRIDE;
428
429 /**
430 * @brief 分离菜单句柄
431 * @return 分离的菜单句柄
432 */
433 STDMETHOD_(HMENU, Detach)(THIS) OVERRIDE;
434
435 /**
436 * @brief 获取菜单句柄
437 * @return 菜单句柄
438 */
439 STDMETHOD_(HMENU, GetHMenu)(THIS) SCONST OVERRIDE;
440
441 /**
442 * @brief 加载菜单资源
443 * @param resId 资源ID
444 * @return 成功返回TRUE,失败返回FALSE
445 */
446 STDMETHOD_(BOOL, LoadMenu)(THIS_ LPCTSTR resId) OVERRIDE;
447
448 /**
449 * @brief 加载菜单资源(UTF-8)
450 * @param resId 资源ID
451 * @return 成功返回TRUE,失败返回FALSE
452 */
453 STDMETHOD_(BOOL, LoadMenuU8)(THIS_ LPCSTR resId) OVERRIDE;
454
455 /**
456 * @brief 加载菜单资源(XML)
457 * @param xmlMenu XML节点
458 * @return 成功返回TRUE,失败返回FALSE
459 */
460 STDMETHOD_(BOOL, LoadMenu2)(THIS_ IXmlNode *xmlMenu) OVERRIDE;
461
462 /**
463 * @brief 设置菜单图标皮肤
464 * @param icons 图标皮肤对象指针
465 */
466 STDMETHOD_(void, SetIconSkin)(THIS_ ISkinObj *icons) OVERRIDE;
467
468 /**
469 * @brief 插入菜单项
470 * @param uPosition 位置
471 * @param uFlags 标志
472 * @param nIDNewItem 新项ID
473 * @param strText 文本
474 * @param iIcon 图标索引(默认为-1)
475 * @param hIcon 图标句柄(默认为0)
476 * @return 成功返回TRUE,失败返回FALSE
477 */
478 STDMETHOD_(BOOL, InsertMenu)(THIS_ UINT uPosition, UINT uFlags, UINT_PTR nIDNewItem, LPCTSTR strText, int iIcon DEF_VAL(-1), HICON hIcon DEF_VAL(0)) OVERRIDE;
479
480 /**
481 * @brief 追加菜单项
482 * @param uFlags 标志
483 * @param uIDNewItem 新项ID
484 * @param lpNewItem 文本
485 * @param iIcon 图标索引(默认为-1)
486 * @param hIcon 图标句柄(默认为0)
487 * @return 成功返回TRUE,失败返回FALSE
488 */
489 STDMETHOD_(BOOL, AppendMenu)(THIS_ UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpNewItem, int iIcon DEF_VAL(-1), HICON hIcon DEF_VAL(0)) OVERRIDE;
490 /**
491 * @brief 检查菜单项
492 * @param uIdCheckItem 要检查的菜单项ID
493 * @param uCheck 检查标志(例如,MF_CHECKED, MF_UNCHECKED)
494 * @return 成功返回TRUE,失败返回FALSE
495 */
496 STDMETHOD_(BOOL, CheckMenuItem)(THIS_ UINT uIdCheckItem, UINT uCheck) OVERRIDE;
497
498 /**
499 * @brief 检查菜单项(单选按钮)
500 * @param idFirst 第一个菜单项ID
501 * @param idLast 最后一个菜单项ID
502 * @param idCheck 要检查的菜单项ID
503 * @param uFlags 检查标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
504 * @return 成功返回TRUE,失败返回FALSE
505 */
506 STDMETHOD_(BOOL, CheckMenuRadioItem)(THIS_ UINT idFirst, UINT idLast, UINT idCheck, UINT uFlags) OVERRIDE;
507
508 /**
509 * @brief 删除菜单项
510 * @param uPosition 菜单项位置
511 * @param uFlags 删除标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
512 * @return 成功返回TRUE,失败返回FALSE
513 */
514 STDMETHOD_(BOOL, DeleteMenu)(THIS_ UINT uPosition, UINT uFlags) OVERRIDE;
515
516 /**
517 * @brief 跟踪弹出菜单
518 * @param uFlags 跟踪标志(例如,TPM_LEFTALIGN, TPM_RIGHTALIGN)
519 * @param x 菜单左上角的X坐标
520 * @param y 菜单左上角的Y坐标
521 * @param hWnd 父窗口句柄
522 * @param prcRect 可选的矩形区域
523 * @param nScale 缩放比例(默认为100)
524 * @return 菜单项ID
525 */
526 STDMETHOD_(UINT, TrackPopupMenu)(THIS_ UINT uFlags, int x, int y, HWND hWnd, LPCRECT prcRect DEF_VAL(NULL), int nScale DEF_VAL(100)) OVERRIDE;
527
528 /**
529 * @brief 销毁菜单
530 */
531 STDMETHOD_(void, DestroyMenu)(THIS) OVERRIDE;
532
533 /**
534 * @brief 修改菜单项字符串
535 * @param uPosition 菜单项位置
536 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
537 * @param lpItemString 新的菜单项字符串
538 * @return 成功返回TRUE,失败返回FALSE
539 */
540 STDMETHOD_(BOOL, ModifyMenuString)(THIS_ UINT uPosition, UINT uFlags, LPCTSTR lpItemString) OVERRIDE;
541
542 /**
543 * @brief 设置菜单项用户数据
544 * @param uPosition 菜单项位置
545 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
546 * @param ulUserData 用户数据
547 * @return 成功返回TRUE,失败返回FALSE
548 */
549 STDMETHOD_(BOOL, SetMenuUserData)(THIS_ UINT uPosition, UINT uFlags, ULONG_PTR ulUserData) OVERRIDE;
550
551 /**
552 * @brief 获取菜单项用户数据
553 * @param uPosition 菜单项位置
554 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
555 * @return 用户数据
556 */
557 STDMETHOD_(ULONG_PTR, GetMenuUserData)(THIS_ UINT uPosition, UINT uFlags) OVERRIDE;
558
559 /**
560 * @brief 获取上下文帮助ID
561 * @return 上下文帮助ID
562 */
563 STDMETHOD_(DWORD, GetContextHelpId)(THIS) SCONST OVERRIDE;
564
565 /**
566 * @brief 设置上下文帮助ID
567 * @param dwId 上下文帮助ID
568 */
569 STDMETHOD_(void, SetContextHelpId)(THIS_ DWORD dwId) OVERRIDE;
570
571 /**
572 * @brief 获取子菜单
573 * @param nPos 子菜单位置
574 * @return 子菜单句柄
575 */
576 STDMETHOD_(HMENU, GetSubMenu)(THIS_ int nPos) OVERRIDE;
577
578 /**
579 * @brief 获取菜单项字符串
580 * @param uPosition 菜单项位置
581 * @param uFlags 标志(例如,MF_BYCOMMAND, MF_BYPOSITION)
582 * @param lpItemString 接收菜单项字符串的对象指针
583 * @return 成功返回TRUE,失败返回FALSE
584 */
585 STDMETHOD_(BOOL, GetMenuString)(THIS_ UINT uPosition, UINT uFlags, IStringT *lpItemString) OVERRIDE;
586
587 protected:
588 /**
589 * @brief 更新缩放比例
590 * @param nScale 缩放比例
591 */
592 void UpdateScale(int nScale);
593
594 /**
595 * @brief 构建菜单
596 * @param menuPopup 弹出菜单句柄
597 * @param xmlNode XML节点
598 */
599 void BuildMenu(HMENU menuPopup, SXmlNode xmlNode);
600
601 /**
602 * @brief 初始化菜单项数据
603 * @param itemInfo 菜单项数据指针
604 * @param strText 菜单项文本
605 */
606 void InitMenuItemData(SMenuItemData *itemInfo, const SStringW &strText);
607
608 /**
609 * @brief 释放菜单项数据
610 * @param hMemu 菜单句柄
611 */
612 void FreeMenuItemData(HMENU hMemu);
613
614 /**
615 * @brief 获取菜单属性对象指针
616 * @param hMenu 菜单句柄
617 * @return 菜单属性对象指针
618 */
619 SMenuAttr *GetMenuAttr(HMENU hMenu) const;
620
621 /**
622 * @brief 设置菜单属性对象指针
623 * @param hMenu 菜单句柄
624 * @param pMenuAttr 菜单属性对象指针
625 */
626 void SetMenuAttr(HMENU hMenu, SMenuAttr *pMenuAttr) const;
627
628 bool m_bAttached; // 是否已附加菜单句柄
629 SAutoRefPtr<ISkinObj> m_icons; // 图标皮肤对象指针
630};
631
632SNSEND
633#endif // __SMENU__H__
Interface and Implementation for Native Window Handling.
Skin Object Pool Management.
Smart pointer class for managing COM-style reference-counted objects.
Class for managing DPI-aware fonts. This class provides functionality to handle font scaling based on...
布局大小类
Definition SLayoutSize.h:10
菜单属性类
Definition SMenu.h:20
virtual void WINAPI OnInitFinished(SXmlNode xmlNode)
初始化完成后的回调函数
Definition SMenu.cpp:76
int GetItemHeight()
获取菜单项高度
Definition SMenu.cpp:64
SMenuAttr()
构造函数
Definition SMenu.cpp:26
int GetScale() const
获取缩放比例
Definition SMenu.h:94
int GetTextMargin()
获取文本边缘空间
Definition SMenu.cpp:49
void SetScale(int scale)
设置缩放比例
Definition SMenu.cpp:95
CSize GetIconSize()
获取图标尺寸
Definition SMenu.cpp:59
int GetMaxWidth()
获取菜单项最大宽度
Definition SMenu.cpp:69
~SMenuAttr()
析构函数
Definition SMenu.cpp:45
int GetIconMargin()
获取图标边缘空间
Definition SMenu.cpp:54
SAutoRefPtr< IFontS > GetFontPtr()
获取字体指针
Definition SMenu.cpp:87
SMenuAttr * GetMenuAttr(HMENU hMenu) const
获取菜单属性对象指针
Definition SMenu.cpp:573
void DestroyMenu() OVERRIDE
销毁菜单
Definition SMenu.cpp:521
void InitMenuItemData(SMenuItemData *itemInfo, const SStringW &strText)
初始化菜单项数据
Definition SMenu.cpp:361
BOOL Attach(HMENU hMenu) OVERRIDE
附加菜单句柄
Definition SMenu.cpp:589
BOOL InsertMenu(UINT uPosition, UINT uFlags, UINT_PTR nIDNewItem, LPCTSTR strText, int iIcon=-1, HICON hIcon=0) OVERRIDE
插入菜单项
Definition SMenu.cpp:377
BOOL LoadMenu(LPCTSTR resId) OVERRIDE
加载菜单资源
Definition SMenu.cpp:340
BOOL AppendMenu(UINT uFlags, UINT_PTR uIDNewItem, LPCTSTR lpNewItem, int iIcon=-1, HICON hIcon=0) OVERRIDE
追加菜单项
Definition SMenu.cpp:558
BOOL ModifyMenuString(UINT uPosition, UINT uFlags, LPCTSTR lpItemString) OVERRIDE
修改菜单项字符串
Definition SMenu.cpp:533
BOOL CheckMenuRadioItem(UINT idFirst, UINT idLast, UINT idCheck, UINT uFlags) OVERRIDE
检查菜单项(单选按钮)
Definition SMenu.cpp:568
HMENU GetHMenu() SCONST OVERRIDE
获取菜单句柄
Definition SMenu.cpp:634
BOOL LoadMenuU8(LPCSTR resId) OVERRIDE
加载菜单资源(UTF-8)
Definition SMenu.cpp:355
DWORD GetContextHelpId() SCONST OVERRIDE
获取上下文帮助ID
Definition SMenu.cpp:639
BOOL GetMenuString(UINT uPosition, UINT uFlags, IStringT *lpItemString) OVERRIDE
获取菜单项字符串
Definition SMenu.cpp:654
BOOL DeleteMenu(UINT uPosition, UINT uFlags) OVERRIDE
删除菜单项
Definition SMenu.cpp:544
void SetIconSkin(ISkinObj *icons) OVERRIDE
设置菜单图标皮肤
Definition SMenu.cpp:628
void SetMenuAttr(HMENU hMenu, SMenuAttr *pMenuAttr) const
设置菜单属性对象指针
Definition SMenu.cpp:581
SMenu(const SMenu &src)
复制构造函数
Definition SMenu.cpp:286
ULONG_PTR GetMenuUserData(UINT uPosition, UINT uFlags) OVERRIDE
获取菜单项用户数据
Definition SMenu.cpp:619
BOOL CheckMenuItem(UINT uIdCheckItem, UINT uCheck) OVERRIDE
检查菜单项
Definition SMenu.cpp:563
void UpdateScale(int nScale)
更新缩放比例
Definition SMenu.cpp:408
BOOL LoadMenu2(IXmlNode *xmlMenu) OVERRIDE
加载菜单资源(XML)
Definition SMenu.cpp:309
void SetContextHelpId(DWORD dwId) OVERRIDE
设置上下文帮助ID
Definition SMenu.cpp:644
void FreeMenuItemData(HMENU hMemu)
释放菜单项数据
Definition SMenu.cpp:499
void BuildMenu(HMENU menuPopup, SXmlNode xmlNode)
构建菜单
Definition SMenu.cpp:434
UINT TrackPopupMenu(UINT uFlags, int x, int y, HWND hWnd, LPCRECT prcRect=NULL, int nScale=100) OVERRIDE
跟踪弹出菜单
Definition SMenu.cpp:416
HMENU GetSubMenu(int nPos) OVERRIDE
获取子菜单
Definition SMenu.cpp:649
HMENU Detach() OVERRIDE
分离菜单句柄
Definition SMenu.cpp:600
BOOL SetMenuUserData(UINT uPosition, UINT uFlags, ULONG_PTR ulUserData) OVERRIDE
设置菜单项用户数据
Definition SMenu.cpp:609
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
绘制菜单项
Definition SMenu.cpp:133
SMenuODWnd(HWND hMenuOwner, SMenuAttr *pMenuAttr)
构造函数
Definition SMenu.cpp:113
~SMenuODWnd()
析构函数
Definition SMenu.cpp:119
void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU menu)
处理菜单选择消息
Definition SMenu.cpp:260
LRESULT OnMenuChar(UINT nChar, UINT nFlags, HMENU hMenu)
处理菜单字符消息
Definition SMenu.cpp:265
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
测量菜单项
Definition SMenu.cpp:228
void OnInitMenu(HMENU menu)
初始化菜单
Definition SMenu.cpp:123
void OnInitMenuPopup(HMENU menuPopup, UINT nIndex, BOOL bSysMenu)
初始化弹出菜单
Definition SMenu.cpp:128
所有者绘制模板类
Definition SMenu.h:158
int CompareItem(LPCOMPAREITEMSTRUCT)
比较菜单项
Definition SMenu.h:301
LRESULT OnMenuChar(UINT, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
处理WM_MENUCHAR消息
Definition SMenu.h:249
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
测量菜单项
Definition SMenu.h:278
LRESULT OnCompareItem(UINT, WPARAM, LPARAM lParam, BOOL &bHandled)
处理WM_COMPAREITEM消息
Definition SMenu.h:216
void DeleteItem(LPDELETEITEMSTRUCT)
删除菜单项
Definition SMenu.h:311
LRESULT OnDrawItem(UINT, WPARAM, LPARAM lParam, BOOL &bHandled)
处理WM_DRAWITEM消息
Definition SMenu.h:182
LRESULT OnMeasureItem(UINT, WPARAM, LPARAM lParam, BOOL &bHandled)
处理WM_MEASUREITEM消息
Definition SMenu.h:199
void DrawItem(LPDRAWITEMSTRUCT)
绘制菜单项
Definition SMenu.h:268
LRESULT OnDeleteItem(UINT, WPARAM, LPARAM lParam, BOOL &bHandled)
处理WM_DELETEITEM消息
Definition SMenu.h:232
A class representing an ASCII string.
Definition sstringw.h:96
Class representing an XML node.
Definition SXml.h:352
Interface for Skin Objects.
Definition SSkinobj-i.h:29
Interface for XML nodes.
Definition sxml-i.h:128
菜单项数据结构
Definition SMenu.h:134
~SMenuItemData()
析构函数
Definition SMenu.cpp:18
SMenuItemData()
构造函数
Definition SMenu.cpp:10