TreePropSheet.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:14k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /********************************************************************
  2. *
  3. * Copyright (c) 2002 Sven Wiegand <mail@sven-wiegand.de>
  4. *
  5. * You can use this and modify this in any way you want,
  6. * BUT LEAVE THIS HEADER INTACT.
  7. *
  8. * Redistribution is appreciated.
  9. *
  10. * $Workfile:$
  11. * $Revision: 1.2 $
  12. * $Modtime:$
  13. * $Author: gabest $
  14. *
  15. * Revision History:
  16. * $History:$
  17. *
  18. *********************************************************************/
  19. #if !defined(AFX_TREEPROPSHEET_H__50695CFB_FCE4_4188_ADB4_BF05A5488E41__INCLUDED_)
  20. #define AFX_TREEPROPSHEET_H__50695CFB_FCE4_4188_ADB4_BF05A5488E41__INCLUDED_
  21. #if _MSC_VER > 1000
  22. #pragma once
  23. #endif // _MSC_VER > 1000
  24. #include "PropPageFrame.h"
  25. #include <afxtempl.h>
  26. #include <afxdlgs.h>
  27. #include <afxcmn.h>
  28. namespace TreePropSheet
  29. {
  30. /**
  31. A property sheet, which can use a tree control instead of a tab 
  32. control, to give the user access to the different pages.
  33. You can use it exactly the same way, as a CPropertySheet object. 
  34. Simply create CPropertyPage objects and add them via AddPage() to
  35. the sheet. If you would like to use the tree view mode (default),
  36. you can specify the path of the pages in the tree, by their name:
  37. The names of the pages can contain 
  38. double colons ("::"), which will specify the path of that page in the 
  39. tree control. I.e. if you have three pages with the following names:
  40. 1. _T("Appearance::Toolbars")
  41. 2. _T("Appearance::Menus")
  42. 3. _T("Directories")
  43. the tree would look as follow:
  44. verbatim
  45. Appearance
  46. |
  47. +-Toolbars
  48. |
  49. +-Menus
  50. Directories
  51. endverbatim
  52. If you would like to use a double colon, which should not be 
  53. interpreted as a path seperator, prefix it with a backslash ("\::").
  54. To disable tree view mode and use the standard tabbed mode, call
  55. the SetTreeViewMode() method. This also allows you, to enable page
  56. captions and tree images for tree view mode. If you would like to 
  57. have images in the tree, but not all of your pages specify images or
  58. there are tree view items, which are not attached to a page (only
  59. parent items for real page items), you have to set default images
  60. using the SetTreeDefaultImages() method -- otherwise their may appear
  61. display errors.
  62. If the user selects a tree view item, which does not belong to a page,
  63. because it is just a parent item for real page items, no page will
  64. be displayed, instead a message will be displayed, that can be set
  65. via SetEmptyPageText().
  66. @author Sven Wiegand
  67. */
  68. class /*AFX_EXT_CLASS*/ CTreePropSheet : public CPropertySheet
  69. {
  70. DECLARE_DYNAMIC(CTreePropSheet)
  71. // Construction/Destruction
  72. public:
  73. CTreePropSheet();
  74. CTreePropSheet(UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
  75. CTreePropSheet(LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0);
  76. virtual ~CTreePropSheet();
  77. // Operations
  78. public:
  79. /**
  80. Call this method, if you would like to use a tree control to browse
  81. the pages, instead of the tab control.
  82. This method needs to becalled, before DoModal() or Create(). If the 
  83. window has already been created, the method will fail.
  84. @param bTreeViewMode
  85. Pass TRUE to provide a tree view control instead of a tab control
  86. to browse the pages, pass FALSE to use the normal tab control.
  87. @param bPageCaption
  88. TRUE if a caption should be displayed for each page. The caption
  89. contains the page title and an icon if specified with the page.
  90. Ignored if bTreeViewMode is FALSE.
  91. @param bTreeImages
  92. TRUE if the page icons should be displayed in the page tree, 
  93. FALSE if there should be no icons in the page tree. Ignored if
  94. bTreeViewMode is FALSE. If not all of your pages are containing
  95. icons, or if there will be empty pages (parent nodes without a
  96. related page, you need to call SetTreeDefaultImages() to avoid 
  97. display errors.
  98. @return
  99. TRUE on success or FALSE, if the window has already been created.
  100. */
  101. BOOL SetTreeViewMode(BOOL bTreeViewMode = TRUE, BOOL bPageCaption = FALSE, BOOL bTreeImages = FALSE);
  102. /**
  103. Specifies the width of the tree control, when the sheet is in tree
  104. view mode. The default value (if this method is not called) is 150
  105. pixels.
  106. This method needs to be called, before DoModeal() or Create(). 
  107. Otherwise it will fail.
  108. @param nWidth
  109. The width in pixels for the page tree. 
  110. @return
  111. TRUE on success, FALSE otherwise (if the window has already been
  112. created).
  113. */
  114. BOOL SetTreeWidth(int nWidth);
  115. /**
  116. Specifies the text to be drawn on empty pages (pages for tree view
  117. items, that are not related to a page, because they are only 
  118. parents for other items). This is only needed in tree view mode.
  119. The specified text can contains a single "%s" placeholder which 
  120. will be replaced with the title of the empty page.
  121. */
  122. void SetEmptyPageText(LPCTSTR lpszEmptyPageText);
  123. /**
  124. Allows you to specify, how the empty page message (see 
  125. SetEmptyPageText()) should be drawn.
  126. @param dwFormat
  127. A combination of the DT_* flags available for the Win32-API
  128. function DrawText(), that should be used to draw the text.
  129. The default value is:
  130. code
  131. DT_CENTER|DT_VCENTER|DT_NOPREFIX|DT_SINGLELINE
  132. endcode
  133. @return
  134. The previous format.
  135. */
  136. DWORD SetEmptyPageTextFormat(DWORD dwFormat);
  137. //@{
  138. /**
  139. Defines the images, that should be used for pages without icons and
  140. for empty parent nodes. The list contains exactly to images:
  141. 1. An image that should be used for parent tree nodes, without a
  142.    page asignd.
  143. 2. An image that should be used for pages, which are not specifying
  144.    any icons.
  145. Standard image size is 16x16 Pixels, but if you call this method 
  146. before creating the sheet, the size of image 0 in this list will
  147. be assumed as your preferred image size and all other icons must
  148. have the same size.
  149. @param pImages
  150. Pointer to an image list with exactly to images, that should be
  151. used as default images. The images are copied to an internal 
  152. list, so that the given list can be deleted after this call.
  153. @param unBitmapID
  154. Resource identifier for the bitmap, that contains the default
  155. images. The resource should contain exactly to images.
  156. @param cx
  157. Width of a singe image in pixels.
  158. @param crMask
  159. Color that should be interpreted as transparent.
  160. @return
  161. TRUE on success, FALSE otherwise.
  162. */
  163. BOOL SetTreeDefaultImages(CImageList *pImages);
  164. BOOL SetTreeDefaultImages(UINT unBitmapID, int cx, COLORREF crMask);
  165. //@}
  166. /**
  167. Returns a pointer to the tree control, when the sheet is in
  168. tree view mode, NULL otherwise.
  169. */
  170. CTreeCtrl* GetPageTreeControl();
  171. // Public helpers
  172. public:
  173. //@{
  174. /**
  175. This helper allows you to easily set the icon of a property page.
  176. This static method does nothing more, than extracting the specified
  177. image as an icon from the given image list and assign the 
  178. icon-handle to the hIcon property of the pages PROPSHEETPAGE
  179. structure (m_psp) and modify the structures flags, so that the 
  180. image will be recognized.
  181. You need to call this method for a page, before adding the page
  182. to a property sheet.
  183. @important
  184. If you are using the CImageList-version, you are responsible for
  185. destroying the extracted icon with DestroyIcon() or the static
  186. DestroyPageIcon() method.
  187. @see DestroyPageIcon()
  188. @param pPage
  189. Property page to set the image for.
  190. @param hIcon
  191. Handle to icon that should be set for the page.
  192. @param unIconId
  193. Ressource identifier for the icon to set.
  194. @param Images
  195. Reference of the image list to extract the icon from.
  196. @param nImage
  197. Zero based index of the image in pImages, that should be used
  198. as an icon.
  199. @return
  200. TRUE on success, FALSE if an error occured.
  201. */
  202. static BOOL SetPageIcon(CPropertyPage *pPage, HICON hIcon);
  203. static BOOL SetPageIcon(CPropertyPage *pPage, UINT unIconId);
  204. static BOOL SetPageIcon(CPropertyPage *pPage, CImageList &Images, int nImage);
  205. //@}
  206. /**
  207. Checks, if the PSP_USEHICON flag is set in the PROPSHEETPAGE struct;
  208. If this is the case, the flag will be removed and the icon 
  209. specified by the hIcon attribute of the PROPSHEETPAGE struct will
  210. be destroyed using DestroyIcon().
  211. @note
  212. You only have to call DestroyIcon() for icons, that have been
  213. created using CreateIconIndirect() (i.e. used by 
  214. CImageList::ExtractIcon()).
  215. @return
  216. TRUE on success, FALSE if the PSP_USEHICON flag was not set or
  217. if the icon handle was NULL.
  218. */
  219. static BOOL DestroyPageIcon(CPropertyPage *pPage);
  220. // Overridable implementation helpers
  221. protected:
  222. /**
  223. Will be called to generate the message, that should be displayed on
  224. an empty page, when the sheet is in tree view mode
  225. This default implementation simply returns lpszEmptyPageMessage 
  226. with the optional "%s" placeholder replaced by lpszCaption.
  227. @param lpszEmptyPageMessage
  228. The string, set by SetEmptyPageMessage(). This string may contain
  229. a "%s" placeholder.
  230. @param lpszCaption
  231. The title of the empty page.
  232. */
  233. virtual CString GenerateEmptyPageMessage(LPCTSTR lpszEmptyPageMessage, LPCTSTR lpszCaption);
  234. /**
  235. Will be called during creation process, to create the CTreeCtrl
  236. object (the object, not the window!).
  237. Allows you to inject your own CTreeCtrl-derived classes.
  238. This default implementation simply creates a CTreeCtrl with new
  239. and returns it.
  240. */
  241. virtual CTreeCtrl* CreatePageTreeObject();
  242. /**
  243. Will be called during creation process, to create the object, that
  244. is responsible for drawing the frame around the pages, drawing the
  245. empty page message and the caption.
  246. Allows you to inject your own CPropPageFrame-derived classes.
  247. This default implementation simply creates a CPropPageFrameTab with
  248. new and returns it.
  249. */
  250. virtual CPropPageFrame* CreatePageFrame();
  251. // Implementation helpers
  252. protected:
  253. /**
  254. Moves all childs by the specified amount of pixels.
  255. @param nDx
  256. Pixels to move the childs in horizontal direction (can be 
  257. negative).
  258. @param nDy
  259. Pixels to move the childs in vertical direction (can be 
  260. negative).
  261. */
  262. void MoveChildWindows(int nDx, int nDy);
  263. /**
  264. Refills the tree that contains the entries for the several pages.
  265. */
  266. void RefillPageTree();
  267. /**
  268. Creates the specified path in the page tree and returns the handle
  269. of the most child item created.
  270. @param lpszPath
  271. Path of the item to create (see description of this class).
  272. @param hParentItem
  273. Handle of the item under which the path should be created or 
  274. TVI_ROOT to start from the root.
  275. */
  276. HTREEITEM CreatePageTreeItem(LPCTSTR lpszPath, HTREEITEM hParent = TVI_ROOT);
  277. /**
  278. Splits the given path into the topmost item and the rest. See 
  279. description of this class for detailed path information.
  280. I.e. when given the string "Appearance::Toolbars::Customize", the
  281. method will return "Appearance" and after the call strRest will
  282. be "Toolbars::Customize".
  283. */
  284. CString SplitPageTreePath(CString &strRest);
  285. /**
  286. Tries to deactivate the current page, and hides it if successfull,
  287. so that an empty page becomes visible.
  288. @return
  289. TRUE if the current page has been deactivated successfully,
  290. FALSE if the currently active page prevents a page change.
  291. */
  292. BOOL KillActiveCurrentPage();
  293. /**
  294. Returns the page tree item, that representates the specified page
  295. or NULL, if no such icon exists.
  296. @param nPage
  297. Zero based page index, for which the item to retrieve.
  298. @param hRoot
  299. Item to start the search at or TVI_ROOT to search the whole
  300. tree.
  301. */
  302. HTREEITEM GetPageTreeItem(int nPage, HTREEITEM hRoot = TVI_ROOT);
  303. /**
  304. Selects and shows the item, representing the specified page.
  305. @param nPage
  306. Zero based page index.
  307. @return
  308. TRUE on success, FALSE if no item does exist for the specified
  309. page.
  310. */
  311. BOOL SelectPageTreeItem(int nPage);
  312. /**
  313. Selects and shows the tree item for the currently active page.
  314. @return
  315. TRUE on success, FALSE if no item exists for the currently active
  316. page or if it was not possible to get information about the 
  317. currently active page.
  318. */
  319. BOOL SelectCurrentPageTreeItem();
  320. /**
  321. Updates the caption for the currently selected page (if the caption 
  322. is enabled).
  323. */
  324. void UpdateCaption();
  325. /**
  326. Activates the previous page in the page order or the last one, if
  327. the current one is the first.
  328. This method does never fail.
  329. */
  330. void ActivatePreviousPage();
  331. /**
  332. Activates the next page in the page order or the first one, if the
  333. current one is the last.
  334. This method does never fail.
  335. */
  336. void ActivateNextPage();
  337. // Overridings
  338. protected:
  339. //{{AFX_VIRTUAL(CTreePropSheet)
  340. public:
  341. virtual BOOL OnInitDialog();
  342. //}}AFX_VIRTUAL
  343. // Message handlers
  344. protected:
  345. //{{AFX_MSG(CTreePropSheet)
  346. afx_msg void OnDestroy();
  347. //}}AFX_MSG
  348. afx_msg LRESULT OnAddPage(WPARAM wParam, LPARAM lParam);
  349. afx_msg LRESULT OnRemovePage(WPARAM wParam, LPARAM lParam);
  350. afx_msg LRESULT OnSetCurSel(WPARAM wParam, LPARAM lParam);
  351. afx_msg LRESULT OnSetCurSelId(WPARAM wParam, LPARAM lParam);
  352. afx_msg LRESULT OnIsDialogMessage(WPARAM wParam, LPARAM lParam);
  353. afx_msg void OnPageTreeSelChanging(NMHDR *pNotifyStruct, LRESULT *plResult);
  354. afx_msg void OnPageTreeSelChanged(NMHDR *pNotifyStruct, LRESULT *plResult);
  355. DECLARE_MESSAGE_MAP()
  356. // Properties
  357. private:
  358. /** TRUE if we should use the tree control instead of the tab ctrl. */
  359. BOOL m_bTreeViewMode;
  360. /** The tree control */
  361. CTreeCtrl *m_pwndPageTree;
  362. /** The frame around the pages */
  363. CPropPageFrame *m_pFrame;
  364. /** 
  365. TRUE, if a tree item selection by OnPageTreeSelChanged() is 
  366. performed currently.
  367. */
  368. BOOL m_bPageTreeSelChangedActive;
  369. /** TRUE if a page caption should be displayed, FALSE otherwise. */
  370. BOOL m_bPageCaption;
  371. /** TRUE if images should be displayed in the tree. */
  372. BOOL m_bTreeImages;
  373. /** Images to be displayed in the tree control. */
  374. CImageList m_Images;
  375. /** Default images. */
  376. CImageList m_DefaultImages;
  377. /** 
  378. Message to be displayed on empty pages. May contain a "%s" 
  379. placeholder which will be replaced by the caption of the empty 
  380. page.
  381. */
  382. CString m_strEmptyPageMessage;
  383. /** The width of the page tree control in pixels. */
  384. int m_nPageTreeWidth;
  385. // Static Properties
  386. private:
  387. /** The id of the tree view control, that shows the pages. */
  388. static const UINT s_unPageTreeId;
  389. };
  390. } //namespace TreePropSheet
  391. /////////////////////////////////////////////////////////////////////////////
  392. //{{AFX_INSERT_LOCATION}}
  393. // Microsoft Visual C++ f黦t unmittelbar vor der vorhergehenden Zeile zus鋞zliche Deklarationen ein.
  394. #endif // AFX_TREEPROPSHEET_H__50695CFB_FCE4_4188_ADB4_BF05A5488E41__INCLUDED_