DkToolBar.cpp
上传用户:lds876
上传日期:2013-05-25
资源大小:567k
文件大小:12k
源码类别:

P2P编程

开发平台:

Visual C++

  1. // DkToolBar.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DkToolBar.h"
  5. #include "resource.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDkToolBar
  13. // DKTODO:
  14. // In the implementation file(s) of the owner(s) of your toolbars, you must
  15. // add an array of static CToolBarInfo objects.  The CToolBarInfo array must
  16. // be populated as follows:
  17. // CToolBarInfo CParentWnd::toolBarInfoTable[] =
  18. // {{ TBBUTTON }, Text to be displayed in customize dialog for this button},
  19. // {{ TBBUTTON }, Text to be displayed in customize dialog for this button},
  20. // ...
  21. // stolen from somewhere in BarTool.cpp
  22. struct CToolBarData
  23. {
  24. WORD wVersion;
  25. WORD wWidth;
  26. WORD wHeight;
  27. WORD wItemCount;
  28. //WORD aItems[wItemCount]
  29. WORD* items()
  30. { return (WORD*)(this+1); }
  31. };
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CDkToolBar message map
  34. BEGIN_MESSAGE_MAP(CDkToolBar, CToolBar)
  35. ON_WM_CONTEXTMENU()
  36. //{{AFX_MSG_MAP(CDkToolBar)
  37. ON_COMMAND(ID_POPUP_CUSTOMIZE, OnPopupCustomize)
  38. ON_WM_DESTROY()
  39. //}}AFX_MSG_MAP
  40. ON_NOTIFY_REFLECT(TBN_BEGINADJUST, OnToolBarBeginAdjust)
  41. ON_NOTIFY_REFLECT(TBN_BEGINDRAG, OnToolBarBeginDrag)
  42. ON_NOTIFY_REFLECT(TBN_CUSTHELP, OnToolBarCustomHelp)
  43. ON_NOTIFY_REFLECT(TBN_ENDADJUST, OnToolBarEndAdjust)
  44. ON_NOTIFY_REFLECT(TBN_ENDDRAG, OnToolBarEndDrag)
  45. ON_NOTIFY_REFLECT(TBN_GETBUTTONINFO, OnToolBarGetButtonInfo)
  46. ON_NOTIFY_REFLECT(TBN_QUERYDELETE, OnToolBarQueryDelete)
  47. ON_NOTIFY_REFLECT(TBN_QUERYINSERT, OnToolBarQueryInsert)
  48. ON_NOTIFY_REFLECT(TBN_RESET, OnToolBarReset)
  49. ON_NOTIFY_REFLECT(TBN_TOOLBARCHANGE, OnToolBarChange)
  50. END_MESSAGE_MAP()
  51. // This function calculates the number of buttons on the toolbar.
  52. int CDkToolBar::NButtons()
  53. {
  54. return nButtons;
  55. }
  56. CDkToolBar::CDkToolBar()
  57. {
  58. // CDkToolBar TODO:  add extra initialization code here
  59. toolBarInfo = 0;
  60. }
  61. CDkToolBar::~CDkToolBar()
  62. {
  63. // CDkToolBar TODO:  add extra uninitialization code here
  64. }
  65. // This function creates the toolbar and associates it with its parent.  Also,
  66. // the registry key to be used for saving and restoring the toolbar's state is
  67. // stored for later use.
  68. BOOL CDkToolBar::Create(CWnd *pParentWnd, DWORD dwCtrlStyle, DWORD dwStyle, UINT nID,
  69. CToolBarInfo *tbInfo, CString regSubKey,
  70. CString regValue, HKEY regKey)
  71. {
  72. BOOL  success; // indicates if the toolbar was created
  73. // if default processing is ok
  74. if (CToolBar::CreateEx(pParentWnd, dwCtrlStyle, dwStyle,  CRect(0, 0, 0, 0), nID))
  75. {
  76. // indicate success
  77. success = TRUE;
  78. // modify the style to include adjustable
  79. ModifyStyle(0, CCS_ADJUSTABLE);
  80. // keep the pointer to the toolbar information
  81. toolBarInfo = tbInfo;
  82. // if there aren't any buttons to customize
  83. if (!tbInfo)
  84. {
  85. nButtons = 0;
  86. }
  87. }
  88. // else default processing failed
  89. else
  90. {
  91. TRACE0("Failed to create toolbarn");
  92. success = FALSE;
  93. }
  94. // keep record of where our registry entry lives
  95. registryKey = regKey;
  96. registrySubKey = regSubKey;
  97. registryValue = regValue;
  98. // indicate success
  99. return success;
  100. }
  101. // This function saves the state (visible buttons, toolbar position, etc.)
  102. // of the toolbar, using the registry key provided to the Create(...) function.
  103. void CDkToolBar::SaveState()
  104. {
  105. // if there is an associated registry subkey
  106. if (registrySubKey.GetLength())
  107. {
  108. // save the toolbar state to the registry
  109. GetToolBarCtrl().SaveState(registryKey, registrySubKey, registryValue);
  110. }
  111. }
  112. // This function restores the state (visible buttons, toolbar position, etc.)
  113. // of the toolbar, using the registry key provided to the Create(...) function.
  114. void CDkToolBar::RestoreState()
  115. {
  116. // if there is an associated registry subkey
  117. if (registrySubKey.GetLength())
  118. {
  119. // restore the toolbar state from the registry
  120. GetToolBarCtrl().RestoreState(registryKey, registrySubKey, registryValue);
  121. }
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // CDkToolBar message handlers
  125. // This function is called when the user begins dragging a toolbar
  126. // button or when the customization dialog is being populated with
  127. // toolbar information.  Basically, *result should be populated with
  128. // your answer to the question, "is the user allowed to delete this
  129. // button?".
  130. void CDkToolBar::OnToolBarQueryDelete(NMHDR *notify, LRESULT *result)
  131. {
  132. // if we're not floating - user can delete anything
  133. *result = !IsFloating();
  134. }
  135. // This function is called when the user begins dragging a toolbar
  136. // button or when the customization dialog is being populated with
  137. // toolbar information.  Basically, *result should be populated with
  138. // your answer to the question, "is the user allowed to insert a
  139. // button to the left of this one?".
  140. void CDkToolBar::OnToolBarQueryInsert(NMHDR *notify, LRESULT *result)
  141. {
  142. // if we're not floating - user can insert anywhere
  143. *result = !IsFloating();
  144. }
  145. // This function is called whenever the user makes a change to the
  146. // layout of the toolbar.  Calling the mainframe's RecalcLayout forces
  147. // the toolbar to repaint itself.
  148. void CDkToolBar::OnToolBarChange(NMHDR *notify, LRESULT *result)
  149. {
  150. // force the frame window to recalculate the size
  151. GetParentFrame()->RecalcLayout();
  152. }
  153. // This function is called when the user begins dragging a toolbar button.
  154. void CDkToolBar::OnToolBarBeginDrag(NMHDR *notify, LRESULT *result)
  155. {
  156. }
  157. // This function is called when the user has completed a dragging operation.
  158. void CDkToolBar::OnToolBarEndDrag(NMHDR *notify, LRESULT *result)
  159. {
  160. }
  161. // This function is called when the user initially calls up the toolbar
  162. // customization dialog box.
  163. void CDkToolBar::OnToolBarBeginAdjust(NMHDR *notify, LRESULT *result)
  164. {
  165. }
  166. // This function is called when the user clicks on the help button on the
  167. // toolbar customization dialog box.
  168. void CDkToolBar::OnToolBarCustomHelp(NMHDR *notify, LRESULT *result)
  169. {
  170. }
  171. // This function is called when the user dismisses the toolbar customization
  172. // dialog box.
  173. void CDkToolBar::OnToolBarEndAdjust(NMHDR *notify, LRESULT *result)
  174. {
  175. // save the state of the toolbar for reinitialization
  176. SaveState();
  177. }
  178. // This function is called to populate the toolbar customization dialog box
  179. // with information regarding all of the possible toolbar buttons.
  180. void CDkToolBar::OnToolBarGetButtonInfo(NMHDR *notify, LRESULT *result)
  181. {
  182. // TBNOTIFY* tbStruct = (TBNOTIFY *)notify;
  183. /*
  184. char szText[1024] = {0};
  185. TBBUTTONINFO tbinfo = {0};
  186. tbinfo.cbSize = sizeof(TBBUTTONINFO);
  187. tbinfo.dwMask =  TBIF_COMMAND | TBIF_IMAGE | TBIF_LPARAM | TBIF_STATE | TBIF_TEXT;
  188. tbinfo.pszText = szText;
  189. tbinfo.cchText = 1024;
  190. TBBUTTON tbbutton = {0};
  191. GetToolBarCtrl().GetButton(tbStruct->iItem, &tbbutton);
  192. GetToolBarCtrl().GetButtonInfo(tbbutton.idCommand, &tbinfo);
  193. if (tbStruct->iItem < 2)
  194. *result = TRUE;
  195. return;
  196. //*/
  197. TBNOTIFY *tbStruct; // data needed by customize dialog box
  198. tbStruct = (TBNOTIFY *)notify;
  199. if (!toolBarInfo)
  200. return;
  201. if (0 <= tbStruct->iItem && tbStruct->iItem < NButtons())
  202. {
  203. // copy the stored button structure
  204. tbStruct->tbButton = toolBarInfo[tbStruct->iItem].tbButton;
  205. // copy the text for the button label in the dialog
  206. strcpy(tbStruct->pszText, toolBarInfo[tbStruct->iItem].btnText);
  207. // indicate valid data was sent
  208. *result = TRUE;
  209. }
  210. // else there is no button for this index
  211. else
  212. {
  213. *result = FALSE;
  214. }
  215. }
  216. // This function is called when the user clicks on the reset button on the
  217. // toolbar customization dialog box.
  218. void CDkToolBar::OnToolBarReset(NMHDR *notify, LRESULT *result)
  219. {
  220. // restore the toolbar to the way it was before entering customization
  221. RestoreState();
  222. }
  223. // This function initializes and tracks the toolbar pop-up menu
  224. void CDkToolBar::OnContextMenu(CWnd*, CPoint point)
  225. {
  226. CMenu  menu; // toolbar right-click menu
  227. // if we have extensive information regarding the toolbar
  228. if (toolBarInfo && !IsFloating())
  229. {
  230. // load the menu from resources VERIFY(menu.LoadMenu(CG_IDR_POPUP_DK_TOOL_BAR));
  231. /// track the menu as a pop-up CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL);
  232. // force all message in this menu to be sent here pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
  233. this);
  234. } }
  235. // This function checks for shift-F10 to pop-up the right-click menu in the
  236. // toolbar.
  237. BOOL CDkToolBar::PreTranslateMessage(MSG* pMsg)
  238. {
  239. BOOL  handled; // indicates if message was handled
  240. // if user hit shift-F10 or if he hit the context menu key on his keyboard if ((((pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) && (pMsg->wParam == VK_F10) && (GetKeyState(VK_SHIFT) & ~1)) != 0) || (pMsg->message == WM_CONTEXTMENU)) { CRect rect; GetClientRect(rect); ClientToScreen(rect); CPoint point = rect.TopLeft(); point.Offset(5, 5); OnContextMenu(NULL, point); handled = TRUE; }
  241. // else let the base class handle this one
  242. else
  243. {
  244. handled = CToolBar::PreTranslateMessage(pMsg);
  245. }
  246. return handled;
  247. }
  248. // This function is called when the user clicks on the 'customize' menu item of
  249. // the toolbar's right-click menu.
  250. void CDkToolBar::OnPopupCustomize() 
  251. {
  252. // let user play with customization dialog
  253. GetToolBarCtrl().Customize();
  254. }
  255. /*
  256. void CDkToolBar::OnPopupIconsandtext() 
  257. {
  258. int  i; // general index
  259. CRect  box; // box holding toolbar button
  260. // set the text labels for the buttons
  261. for (i = 0; i < NButtons(); i++)
  262. {
  263. // if this isn't a separator
  264. if (toolBarInfo[i].tbButton.idCommand != ID_SEPARATOR)
  265. {
  266. SetButtonText(CommandToIndex(toolBarInfo[i].tbButton.idCommand),
  267. toolBarInfo[i].btnText);
  268. }
  269. }
  270. // if we don't already know the button with text sizes
  271. if (txtBtnSize.cx == -1)
  272. {
  273. // calculate the width of the toolbar
  274. for (i = 0; i < GetToolBarCtrl().GetButtonCount(); i++)
  275. {
  276. // grab the size of this button
  277. GetItemRect(i, box);
  278. // if this is the first time through
  279. if (!i)
  280. {
  281. // keep this as the max sized button
  282. txtBtnSize.cx = box.Width();
  283. txtBtnSize.cy = box.Height();
  284. }
  285. // else this isn't the first time
  286. else
  287. {
  288. // if this button is bigger than the biggest so far
  289. if (box.Width() > txtBtnSize.cx)
  290. {
  291. txtBtnSize.cx = box.Width();
  292. }
  293. if (box.Height() > txtBtnSize.cy)
  294. {
  295. txtBtnSize.cy = box.Height();
  296. }
  297. }
  298. }
  299. }
  300. // set the new size of the toolbar and force a recalc
  301. SetSizes(txtBtnSize, defImgSize);
  302. // if we're floating
  303. if (IsFloating())
  304. {
  305. // force the miniframe window to recalculate the size
  306. ((CMiniFrameWnd *)GetParentFrame())->RecalcLayout();
  307. }
  308. // else we're docked
  309. else
  310. {
  311. // force the frame window to recalculate the size
  312. ((CMainFrame *)AfxGetMainWnd())->RecalcLayout();
  313. }
  314. // save the current state of the toolbar
  315. SaveState();
  316. }
  317. void CDkToolBar::OnPopupIconsonly() 
  318. {
  319. // if there are any entries in the string map
  320. if (m_pStringMap)
  321. {
  322. m_pStringMap->RemoveAll();
  323. delete m_pStringMap;
  324. m_pStringMap = NULL;
  325. }
  326. // restore the toolbar sizes to their defaults
  327. SetSizes(defBtnSize, defImgSize);
  328. // if we're floating
  329. if (IsFloating())
  330. {
  331. // force the miniframe window to recalculate the size
  332. ((CMiniFrameWnd *)GetParentFrame())->RecalcLayout();
  333. }
  334. // else we're docked
  335. else
  336. {
  337. // force the frame window to recalculate the size
  338. ((CMainFrame *)AfxGetMainWnd())->RecalcLayout();
  339. }
  340. // save the current state of the toolbar
  341. SaveState();
  342. }
  343. */
  344. void CDkToolBar::OnDestroy() 
  345. {
  346. // save the current state of the toolbar
  347. SaveState();
  348. // default processing
  349. CToolBar::OnDestroy();
  350. }