TOOLBAR.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // Toolbar.h : toolbar implementation
  2. //
  3. // This is a part of the Active Template Library.
  4. // Copyright (C) 1996-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Active Template Library Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Active Template Library product.
  12. #include <commctrl.h>
  13. // ID used for the separator
  14. #define ID_SEP 0
  15. #define BEGIN_TOOLBAR_MAP(x) public: 
  16. const static int* _GetToolbarEntries(int& nButtons) { 
  17. static const int _entries[] = {
  18. #define TOOLBAR_BUTTON(x) x,
  19. #define TOOLBAR_SEPARATOR() ID_SEP,
  20. #define END_TOOLBAR_MAP() }; 
  21. nButtons = sizeof(_entries)/sizeof(int); 
  22. return _entries; }
  23. template <class T>
  24. class CToolbar
  25. {
  26. public:
  27. CToolbar()
  28. //      : m_wndToolbar(TOOLBARCLASSNAME, (T*)this, 2)
  29. {
  30. }
  31. void SetupToolbar(IOleInPlaceUIWindow* pInPlaceUIWindow)
  32. {
  33. T* pT = static_cast<T*>(this);
  34. HRESULT         hr;
  35. HWND            hWnd;
  36. // Negotiate the border space for the toolbar
  37. if (pInPlaceUIWindow != NULL)
  38. {
  39. SetRectEmpty(&m_bw);
  40. pInPlaceUIWindow->SetBorderSpace(&m_bw);
  41. }
  42. // Get the frame HWND so that we can parent our toolbar correctly
  43. pT->m_spInPlaceFrame->GetWindow(&hWnd);
  44. SetRect(&m_bw, 0, 30, 0, 0);
  45. hr = pT->m_spInPlaceFrame->RequestBorderSpace(&m_bw);
  46. if (FAILED(hr))
  47. return;
  48. pT->m_spInPlaceFrame->SetBorderSpace(&m_bw);
  49. // Now we can create the toolbar
  50. CreateToolbar(hWnd);
  51. ::SendMessage(m_wndToolbar.m_hWnd, TB_AUTOSIZE, 0, 0);
  52. ::ShowWindow(m_wndToolbar.m_hWnd, SW_SHOW);
  53. // Set the window we want the toolbar to send it's messages to
  54. SendMessage(m_wndToolbar.m_hWnd, TB_SETPARENT, (WPARAM)pT->m_hWnd, 0);
  55. }
  56. void MoveToolbar(LPCRECT pRect = NULL)
  57. {
  58. if (m_wndToolbar.m_hWnd == NULL)
  59. return;
  60. RECT    rect;
  61. HRESULT hr;
  62. T* pT = static_cast<T*>(this);
  63. hr = pT->m_spInPlaceFrame->RequestBorderSpace(&m_bw);
  64. if (FAILED(hr))
  65. return;
  66. pT->m_spInPlaceFrame->SetBorderSpace(&m_bw);
  67. // Get the border if we don't have it
  68. if (pRect == NULL)
  69. pT->m_spInPlaceFrame->GetBorder(&rect);
  70. else
  71. rect = *pRect;
  72. rect.left   += m_bw.left;
  73. rect.bottom = rect.top + m_bw.top;
  74. // Now move the toolbar
  75. m_wndToolbar.MoveWindow(&rect);
  76. }
  77. void CreateToolbar(HWND hParent)
  78. {
  79. InitCommonControls();
  80. RECT rect;
  81. T* pT = static_cast<T*>(this);
  82. pT->m_spInPlaceFrame->GetBorder(&rect);
  83. int nLeft   = rect.left + m_bw.left;
  84. int nTop    = rect.top;
  85. int nRight  = rect.right;
  86. int nBottom = rect.top + m_bw.top;
  87. #if 0
  88. m_wndToolbar.Create(hParent, &rect, NULL,
  89. WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS,
  90. 0, IDR_TOOLBAR1);
  91. #else
  92. m_wndToolbar.m_hWnd = CreateWindowEx(
  93. 0,
  94. TOOLBARCLASSNAME,
  95. NULL,
  96. WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS |
  97. CCS_TOP  | CCS_NOMOVEX | CCS_NORESIZE ,
  98. nLeft, nTop, nRight-nLeft, nBottom-nTop,
  99. hParent,
  100. (HMENU)IDR_TOOLBAR1,
  101. _Module.GetResourceInstance(),
  102. NULL);
  103. #endif
  104. AddButtons();
  105. }
  106. void AddButtons()
  107. {
  108. int nButtons;
  109. const int* arrID = T::_GetToolbarEntries(nButtons);
  110. TBBUTTON* pButton = new TBBUTTON[nButtons];
  111. TBADDBITMAP tbab;
  112. int nIndex = 0;
  113. // Send the TB_BUTTONSTRUCTSIZE message, which is required for
  114. // backward compatibility.
  115. SendMessage(m_wndToolbar.m_hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0);
  116. // Add the bitmap containing button images to the toolbar.
  117. tbab.hInst = _Module.GetResourceInstance();
  118. tbab.nID = IDR_TOOLBAR1;
  119. SendMessage(m_wndToolbar.m_hWnd, TB_ADDBITMAP, nButtons, (WPARAM)&tbab);
  120. // Loop around, adding each button to the TBBUTTON array
  121. for (int i = 0; i < nButtons; i++)
  122. {
  123. pButton[i].fsState   = TBSTATE_ENABLED;
  124. pButton[i].dwData    = 0;
  125. pButton[i].iString   = 0;
  126. if (arrID[i] != ID_SEP)
  127. {
  128. pButton[i].iBitmap   = nIndex;
  129. pButton[i].fsStyle   = TBSTYLE_BUTTON;
  130. pButton[i].idCommand = arrID[i];
  131. nIndex++;
  132. }
  133. else
  134. {
  135. pButton[i].fsStyle   = TBSTYLE_BUTTON|TBSTYLE_SEP;
  136. pButton[i].iBitmap   = 8;   // Width of separator
  137. pButton[i].idCommand = 0;
  138. }
  139. }
  140. // Add the buttons
  141. SendMessage(m_wndToolbar.m_hWnd, TB_ADDBUTTONS, nButtons, (LPARAM)pButton);
  142. delete [] pButton;
  143. }
  144. void DestroyToolbar()
  145. {
  146. if (m_wndToolbar.m_hWnd != NULL)
  147. {
  148. ::DestroyWindow(m_wndToolbar.m_hWnd);
  149. m_wndToolbar.m_hWnd = NULL;
  150. }
  151. }
  152. LRESULT OnToolbarNeedText(WPARAM, LPNMHDR pnmh, BOOL&)
  153. {
  154. LPTOOLTIPTEXT lpToolTipText = (LPTOOLTIPTEXT)pnmh;
  155. static TCHAR szBuf[128];
  156. // Get the string with the same ID as the button from the resource
  157. LoadString(_Module.GetResourceInstance(),
  158. lpToolTipText->hdr.idFrom,
  159. szBuf, sizeof(szBuf) * sizeof(TCHAR));
  160. lpToolTipText->lpszText = szBuf;
  161. return 0;
  162. }
  163. CContainedWindow    m_wndToolbar;
  164. BORDERWIDTHS        m_bw;
  165. };