UITaskPanel.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:4k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // UITaskPanel.cpp: implementation of the CUITaskPanel class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "UITaskPanel.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. class CTaskPanelSeparatorItem : public CXTPTaskPanelGroupItem
  10. {
  11. public:
  12. CTaskPanelSeparatorItem()
  13. {
  14. }
  15. virtual CRect OnReposition(CRect rc)
  16. {
  17. rc.bottom = rc.top + 4;
  18. m_rcItem = rc;
  19. return m_rcItem;
  20. }
  21. virtual void OnDrawItem(CDC* pDC, CRect rc)
  22. {
  23. rc.DeflateRect(0, 1);
  24. pDC->Draw3dRect(rc, GetXtremeColor(COLOR_3DSHADOW), GetXtremeColor(COLOR_3DHIGHLIGHT));
  25. }
  26. };
  27. CUITaskPanel::CUITaskPanel()
  28. {
  29. m_bUIMode = FALSE;
  30. }
  31. CUITaskPanel::~CUITaskPanel()
  32. {
  33. }
  34. CString StripMnemonics(CString str)
  35. {
  36. XTPDrawHelpers()->StripMnemonics(str);
  37. int nIndex = str.Find(_T('t'));
  38. if (nIndex > 0)
  39. {
  40. return str.Left(nIndex);
  41. }
  42. return str;
  43. }
  44. void AddGroupItems(CXTPTaskPanelGroup* pGroup,  CMenu* pMenu)
  45. {
  46. for (UINT i = 0; i < pMenu->GetMenuItemCount(); i++)
  47. {
  48. CMenu* pMenuPopup = pMenu->GetSubMenu(i);
  49. if (pMenuPopup)
  50. {
  51. AddGroupItems(pGroup, pMenuPopup);
  52. }
  53. else
  54. {
  55. MENUITEMINFO info = { sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_STATE};
  56. ::GetMenuItemInfo(pMenu->m_hMenu, i, TRUE, &info);
  57. if (((info.fType & MFT_SEPARATOR) == MFT_SEPARATOR) || (pMenu->GetMenuItemID(i) == 0))
  58. {
  59. pGroup->GetItems()->Add(new CTaskPanelSeparatorItem(), 0);
  60. continue;
  61. }
  62. CString strCaption;
  63. pMenu->GetMenuString(i, strCaption, MF_BYPOSITION); ;
  64. UINT nID = pMenu->GetMenuItemID(i);
  65. CXTPTaskPanelGroupItem* pItem = pGroup->AddLinkItem(nID, nID);
  66. pItem->SetCaption(StripMnemonics(strCaption));
  67. }
  68. }
  69. }
  70. void CUITaskPanel::CreateFromMenu(CMenu* pMenu)
  71. {
  72. GetGroups()->Clear();
  73. for (UINT i = 0; i < pMenu->GetMenuItemCount(); i++)
  74. {
  75. CMenu* pMenuPopup = pMenu->GetSubMenu(i);
  76. if (!pMenuPopup)
  77. continue;
  78. CString strCaption;
  79. pMenu->GetMenuString(i, strCaption, MF_BYPOSITION);
  80. CXTPTaskPanelGroup* pGroup = AddGroup(0);
  81. pGroup->SetCaption(StripMnemonics(strCaption));
  82. AddGroupItems(pGroup, pMenuPopup);
  83. }
  84. }
  85. BEGIN_MESSAGE_MAP(CUITaskPanel, CXTPTaskPanel)
  86. ON_MESSAGE(WM_IDLEUPDATECMDUI, OnIdleUpdateCmdUI)
  87. END_MESSAGE_MAP()
  88. class CUITaskPanel::CTaskPanelCmdUI : public CCmdUI
  89. {
  90. public: // re-implementations only
  91. virtual void Enable(BOOL bOn);
  92. virtual void SetCheck(int nCheck);
  93. virtual void SetText(LPCTSTR lpszText);
  94. public:
  95. CXTPTaskPanelGroupItem* m_pItem;
  96. };
  97. void CUITaskPanel::CTaskPanelCmdUI::Enable(BOOL bOn)
  98. {
  99. m_bEnableChanged = TRUE;
  100. ASSERT(m_pItem != NULL);
  101. m_pItem->SetEnabled(bOn);
  102. }
  103. void CUITaskPanel::CTaskPanelCmdUI::SetCheck(int nCheck)
  104. {
  105. ASSERT(nCheck >= 0 && nCheck <= 2); // 0 =>off, 1 =>on, 2 =>indeterminate
  106. ASSERT(m_pItem != NULL);
  107. m_pItem->SetItemSelected(nCheck);
  108. }
  109. void CUITaskPanel::CTaskPanelCmdUI::SetText(LPCTSTR lpszCaption)
  110. {
  111. ASSERT(m_pItem != NULL);
  112. m_pItem->SetCaption(lpszCaption);
  113. }
  114. LRESULT CUITaskPanel::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
  115. {
  116. if (m_bUIMode && GetSafeHwnd() && (GetStyle() & WS_VISIBLE))
  117. {
  118. CWnd* pTarget = GetOwner();
  119. if (pTarget != NULL)
  120. OnUpdateCmdUI(pTarget, (BOOL)wParam);
  121. }
  122. return 0L;
  123. }
  124. void CUITaskPanel::OnUpdateCmdUI(CWnd* pTarget, BOOL bDisableIfNoHndler)
  125. {
  126. CTaskPanelCmdUI state;
  127. state.m_pOther = this;
  128. for (int i = 0; i < GetGroupCount(); i++)
  129. {
  130. CXTPTaskPanelGroup* pGroup = GetAt(i);
  131. for (state.m_nIndex = 0; (int)state.m_nIndex < pGroup->GetItemCount(); state.m_nIndex++)
  132. {
  133. CXTPTaskPanelGroupItem* pItem = pGroup->GetAt(state.m_nIndex);
  134. state.m_nID = pItem->GetID();
  135. state.m_pItem = pItem;
  136. if (CWnd::OnCmdMsg(0,
  137. MAKELONG((int)CN_UPDATE_COMMAND_UI, WM_COMMAND + WM_REFLECT_BASE),
  138. &state, NULL))
  139. continue;
  140. // allow the toolbar itself to have update handlers
  141. if (CWnd::OnCmdMsg(state.m_nID, (int)CN_UPDATE_COMMAND_UI, &state, NULL))
  142. continue;
  143. // allow the owner to process the update
  144. state.DoUpdate(pTarget, bDisableIfNoHndler);
  145. }
  146. }
  147. // update the dialog controls added to the toolbar
  148. UpdateDialogControls(pTarget, bDisableIfNoHndler);
  149. }