VisualFx.h
上传用户:zhenhuadz
上传日期:2007-01-07
资源大小:1511k
文件大小:15k
源码类别:

远程控制编程

开发平台:

Visual C++

  1. /*#############################################################################
  2. # VISUALFX.H
  3. #
  4. # SCA Software International S.A.
  5. # http://www.scasoftware.com
  6. # scaadmin@scasoftware.com
  7. #
  8. # Copyright (c) 1999 SCA Software International S.A.
  9. #
  10. # Date: 03.01.2000
  11. # Author: Zoran M.Todorovic
  12. #
  13. # This software is provided "AS IS", without a warranty of any kind.
  14. # You are free to use/modify this code but leave this header intact.
  15. #
  16. #############################################################################*/
  17. #ifndef __TABWINDOW_H__
  18. #define __TABWINDOW_H__
  19. #if _MSC_VER > 1000
  20. #pragma once
  21. #endif // _MSC_VER > 1000
  22. #pragma warning(disable: 4786)
  23. #ifndef __AFXEXT_H__
  24. #include <afxext.h>
  25. #endif
  26. #include <list>
  27. #include <map>
  28. using namespace std;
  29. //=============================================================================
  30. // class TTabItem
  31. //
  32. // This class holds a description of one tab
  33. //=============================================================================
  34. class TTabItem {
  35. private:
  36.   CWnd *m_pWnd;             // Window (view) associated with this tab
  37.   CStatic *m_pCaption;      // Caption of this tab
  38.   BOOL m_bWndEnabled;       // Is window enabled
  39.   BOOL m_bEnabled;          // Is tab enabled
  40.   BOOL m_bVisible;          // Is tab visible
  41.   int m_nMinX;              // Client left X coordinate
  42.   int m_nMaxX;              // Client right X coordinate
  43. public:
  44.   TTabItem(CWnd *pParent, LPCTSTR label);
  45.   TTabItem(const TTabItem& obj);
  46.   TTabItem& operator=(const TTabItem& obj);
  47.   virtual ~TTabItem();
  48.   
  49.   void SetRect(CRect& rect);
  50.   void SetFont(CFont *pFont);
  51.   CString GetText(void);
  52.   void SetText(LPCTSTR szLabel);
  53.   void Enable(BOOL bEnable);
  54.   void EnableTab(BOOL bEnable);
  55.   void ShowTab(BOOL nShow);
  56.   
  57.   int GetLength(void);
  58.   CWnd *GetSafeWnd(void);
  59.   friend class TTabWnd;
  60. };
  61. typedef list<TTabItem*> TTabItemList;
  62. //=============================================================================
  63. // class TTabWnd
  64. //
  65. //=============================================================================
  66. class TVisualFramework;
  67. class TTabWnd : public CWnd {
  68.   DECLARE_DYNCREATE(TTabWnd)
  69. public:
  70.   enum TTabPos { TP_TOP, TP_BOTTOM };
  71. protected:
  72.   CBrush m_BrushBlack, m_BrushLGray;
  73.   CPen m_PenWhite, m_PenWhite2, m_PenBlack, m_PenLGray, m_PenDGray, m_PenDGray2;
  74.   CFont m_Font;
  75. protected:
  76.   int m_nSelectedTab;
  77.   BOOL m_bLockFlag;
  78.   TTabItemList m_TabList;
  79.   TTabPos m_nTabPos;
  80. private:
  81.   TTabItem *findTabItem(int nIndex);
  82. protected:
  83.   void createFont();
  84.   int drawTabTop(CDC *pDC, int x, CRect& client, TTabItem *pItem);
  85.   int drawTabBottom(CDC *pDC, int x, CRect& client, TTabItem *pItem);
  86.   int drawSelTabTop(CDC *pDC, int x, CRect& client, TTabItem *pItem);
  87.   int drawSelTabBottom(CDC *pDC, int x, CRect& client, TTabItem *pItem);
  88.   void drawClient(CDC *pDc, CRect& rect);
  89.   void invalidateTabArea(void);
  90.   TTabItem *addTab(CWnd *pWnd, LPCTSTR szLabel);
  91.   BOOL updateFrame(CFrameWnd *pFrame, CWnd *pWnd);
  92. protected:
  93.   // Following functions are protected since tab window cannot be created outside
  94.   // of the visual framework. Otherwise, we have memory leaks.
  95.   
  96.   // Create a tab window
  97.   virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, 
  98.                       DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, 
  99.                       UINT nID=AFX_IDW_PANE_FIRST, CCreateContext *pContext = NULL);
  100.   // Resize tabs
  101.   virtual void ResizeTab(int cx = -1, int cy = -1);
  102.   // Create pane
  103.   virtual TTabItem *CreatePane(LPCTSTR lpszLabel, CRuntimeClass *pViewClass, 
  104.                                 CCreateContext *pContext);
  105.   // Create splitter
  106. virtual TTabItem *CreatePane(LPCTSTR lpszLabel, int nRows, int nCols, 
  107.                                 CWnd *pWnd, UINT nID = AFX_IDW_PANE_FIRST);
  108. public:
  109.   TTabWnd();
  110.   virtual ~TTabWnd();
  111.   int GetTabLength(void);
  112.   int GetTabCount(void);
  113.   CWnd *GetTabWnd(int nIndex);
  114.   CString GetTabLabel(int nIndex);
  115.   void SetTabLabel(int nIndex, LPCTSTR szLabel);
  116.   int GetTabIndex(void);
  117.   int GetTabIndex(CWnd *pWnd);
  118.   void Enable(int nIndex, BOOL bEnable);
  119.   void EnableTab(int nIndex, BOOL bEnable);
  120.   void ShowTab(int nIndex, BOOL bShow);
  121.   
  122.   BOOL IsTabEnabled(int nIndex);
  123.   BOOL IsTabVisible(int nIndex);
  124.   
  125.   void SetFont(CFont *pFont);
  126.   void SetTabPos(TTabPos nTabPos);
  127.   virtual int HitTest(int x, int y);
  128.   virtual int HitTest(CPoint& point);
  129.   // Change active pane
  130.   virtual BOOL SetActivePane(int nIndex, BOOL bActivate = TRUE);
  131.   // Empty functions (implement in derived classes)
  132.   virtual BOOL CanSetActivePane(CWnd *pOldPane, CWnd *pNewPane);
  133.   virtual void OnSetActivePane(CWnd *pOldPane, CWnd *pNewPane);
  134.   
  135. protected:
  136.   //{{AFX_MSG(TTabWnd)
  137.   afx_msg LRESULT OnSizeParent(WPARAM, LPARAM lParam);
  138.   afx_msg BOOL OnEraseBkgnd(CDC* pDC);
  139.   afx_msg void OnPaint();
  140.   afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
  141.   afx_msg void OnDestroy();
  142.   afx_msg void OnSize(UINT nType, int cx, int cy);
  143. afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
  144. //}}AFX_MSG
  145.   DECLARE_MESSAGE_MAP()
  146.   friend class TVisualFramework;
  147. };
  148. //=============================================================================
  149. // class TVisualObject
  150. //
  151. //=============================================================================
  152. class TVisualObject;
  153. class TVisualFramework;
  154. typedef list<TVisualObject*> TVisualObjectList;
  155. typedef map<DWORD,TVisualObject*> TVisualObjectMap;
  156. class TVisualObject {
  157. public:
  158.   enum TObjectStyle {
  159.     TOS_TABTOP        = 0x00000001, // Tabs on top (tab window)
  160.     TOS_TABBOTTOM     = 0x00000002, // Tabs on bottom (tab window)
  161.     TOS_SELECTED      = 0x00000004  // This tab is active
  162.   };
  163. private:
  164.   enum TObjectType { 
  165.     OT_UNKNOWN,
  166.     OT_SPLITTER,                    // Splitter window
  167.     OT_SPLITTERVIEW,                // View within a splitter window
  168.     OT_SPLITTERSPLITTER,            // Nested splitter window
  169.     OT_TAB,                         // Tab window
  170.     OT_TABVIEW,                     // View within a tab window
  171.     OT_VIEW,                        // Plain view
  172.   };
  173.   
  174. private:
  175.   TObjectType m_nObjectType;
  176.   DWORD m_dwId;                     // Unique identifier of this object
  177.   CWnd *m_pWnd;                     // Window associated with this object
  178.   CWnd *m_pParent;                  // Parent window
  179.   CString m_strTitle;               // Title of this window
  180.   CString m_strDescription;         // Optional description of this window
  181.   int m_nRows;                      // Splitters: number of rows
  182.   int m_nCols;                      // Splitters: number of columns
  183.   int m_nRowIndex;                  // Splitter view: row index
  184.   int m_nColIndex;                  // Splitter view: column index
  185.   CCreateContext *m_pContext;       // Context 
  186.   CRuntimeClass *m_pRuntimeClass;   // Class of this window
  187.   CSize m_Size;                     // Splitter: initial size
  188.   BOOL m_bEnabled;                  // Enable state
  189.   DWORD m_dwStyle;                  // Additonal style (for tab window)
  190.   CHAR m_cHotKey;                   // Optional hot key (for example, '2' for ALT+2)
  191. private:
  192.   TVisualObject *m_pOwner;          // Owner of this child (or NULL for root level)
  193.   TVisualFramework *m_pFramework;   // Pointer to framework that owns this object
  194.   TVisualObjectList m_ObjectList;   // Child object list
  195. private:
  196.   TVisualObject();
  197.   void zeroAll(void);
  198.   void checkStyle(void);
  199. public:
  200.   // Create a plain view
  201.   TVisualObject(DWORD dwId, CCreateContext *pContext, 
  202.                 CRuntimeClass *pClass);
  203.   // Create a tab window or a view within a tab window
  204.   TVisualObject(DWORD dwId, LPCTSTR szTitle, CCreateContext *pContext, 
  205.                 CRuntimeClass *pClass, DWORD dwStyle = 0);
  206.   // Create a splitter window
  207.   TVisualObject(DWORD dwId, LPCTSTR szTitle, int nRows, int nCols, 
  208.                 CCreateContext *pContext, DWORD dwStyle = 0); 
  209.   // Create a nested splitter window
  210.   TVisualObject(DWORD dwId, int nRow, int nCol, CCreateContext *pContext, 
  211.                 CRuntimeClass *pClass, CSize size, DWORD dwStyle = 0);
  212.   // Create a view within a splitter window
  213.   TVisualObject(DWORD dwId, int nRow, int nCol, int nRows, int nCols, 
  214.                 CCreateContext *pContext, DWORD dwStyle = 0); 
  215.   TVisualObject(const TVisualObject& obj);
  216.   virtual ~TVisualObject();
  217.   TVisualObject& operator=(const TVisualObject& obj);
  218.   void Destroy(BOOL bDestroyWindow = FALSE);
  219.   BOOL CanFocus(void);
  220.   void SetHotKey(CHAR cHotKey);
  221.   void SetDescription(LPCTSTR szDesc);
  222.   BOOL SetActivePane(void);
  223.   BOOL SetActiveTab(void);
  224.   BOOL Enable(BOOL bEnable);
  225.   BOOL EnableTab(BOOL bEnable);
  226.   BOOL ShowTab(BOOL bShow);
  227.   BOOL IsEnabled(BOOL& bEnabled);
  228.   BOOL IsTabEnabled(BOOL& bEnabled);
  229.   BOOL IsTabVisible(BOOL& bVisible);
  230.   BOOL IsTabPane(void);
  231.   BOOL IsTabWindow(void);
  232.   BOOL IsSplitterPane(void);
  233.   BOOL IsSplitterWindow(void);
  234.   BOOL IsView(void);
  235.   DWORD GetID(void);
  236.   CWnd *GetWnd(void);
  237.   CWnd *GetSafeWnd(void);
  238.   CString GetTitle(void);
  239.   CString GetDescription(void);
  240.   CWnd *GetParentWnd(void);
  241.   TVisualFramework *GetFramework(void);
  242.   TVisualObject *GetOwner(void);
  243.   friend class TVisualFramework;
  244.   friend class TVisualFrameworkIterator;
  245. };
  246. #ifndef _DEBUG
  247. inline DWORD TVisualObject::GetID(void)
  248.   { return m_dwId; }
  249. inline CWnd *TVisualObject::GetWnd(void)
  250.   { return m_pWnd; }
  251. inline CWnd *TVisualObject::GetSafeWnd(void)
  252.   { return ::IsWindow(m_pWnd->m_hWnd) ? m_pWnd : NULL;; }
  253. inline CString TVisualObject::GetTitle(void)
  254.   { return m_strTitle; }
  255. inline CString TVisualObject::GetDescription(void)
  256.   { return m_strDescription; }
  257. inline CWnd *TVisualObject::GetParentWnd(void)
  258.   { return m_pParent; }
  259. inline TVisualFramework *TVisualObject::GetFramework(void)
  260.   { return m_pFramework; }
  261. inline TVisualObject *TVisualObject::GetOwner(void)
  262.   { return m_pOwner; }
  263. #endif
  264. //=============================================================================
  265. // class TVisualFramework
  266. //
  267. //=============================================================================
  268. class TVisualFrameworkIterator;
  269. class TVisualFramework : public CCmdTarget {
  270. DECLARE_DYNCREATE(TVisualFramework)
  271. private:
  272.   CWnd *m_pOwner;
  273.   TVisualObjectList m_ObjectList;
  274.   TVisualObjectMap m_ObjectMap;
  275. private:
  276.   BOOL m_bEnableCtrlTab;
  277. private:
  278.   TVisualObject *findObject(DWORD dwId);
  279.   TVisualObject *findObject(CWnd *pWnd);
  280.   void execDestroy(TVisualObject *pObject);
  281.   BOOL execCreate(CWnd *pWnd, TVisualObject *pObject);
  282.   BOOL execCreateView(CWnd *pWnd, TVisualObject *pObject);
  283.   BOOL execCreateTabView(CWnd *pWnd, TVisualObject *pObject);
  284.   BOOL execCreateSplitter(CWnd *pWnd, TVisualObject *pObject);
  285.   BOOL execCreateSplitterView(CWnd *pWnd, TVisualObject *pObject);
  286.   BOOL execCreateSplitterSplitter(CWnd *pWnd, TVisualObject *pObject);
  287.   BOOL execCreateTabWnd(CWnd *pWnd, TVisualObject *pObject);
  288.   void setTabWndProperties(TVisualObject *pObject);
  289. public:
  290.   TVisualFramework();
  291.   virtual ~TVisualFramework();
  292.   BOOL Add(TVisualObject *pObject);
  293.   BOOL Add(TVisualObject *pOwner, TVisualObject *pObject);
  294.   virtual BOOL Create(CWnd *pWnd = NULL);
  295.   virtual void Destroy(void);
  296.   CWnd *GetWnd(void);
  297.   CWnd *GetSafeWnd(void);
  298.   CWnd *GetObject(DWORD dwId);
  299.   DWORD GetObject(CWnd *pWnd);
  300.   TVisualObject *Get(DWORD dwId);
  301.   TVisualObject *Get(CWnd *pWnd);
  302.   BOOL IsTabPane(TVisualObject *pObject);
  303.   BOOL IsTabWindow(TVisualObject *pObject);
  304.   BOOL IsSplitterPane(TVisualObject *pObject);
  305.   BOOL IsSplitterWindow(TVisualObject *pObject);
  306.   BOOL IsView(TVisualObject *pObject);
  307.   int GetCount(void);
  308.   TVisualObject *GetActiveTab(TVisualObject *pObject);
  309.   BOOL SetActiveTab(TVisualObject *pObject);
  310.   BOOL SetActivePane(TVisualObject *pObject);
  311.   TVisualObject *GetActivePane(void);
  312.   BOOL Enable(TVisualObject *pObject, BOOL bEnable);
  313.   BOOL EnableTab(TVisualObject *pObject, BOOL bEnable);
  314.   BOOL ShowTab(TVisualObject *pObject, BOOL bEnable);
  315.   BOOL IsEnabled(TVisualObject *pObject, BOOL& bEnabled);
  316.   BOOL IsTabEnabled(TVisualObject *pObject, BOOL& bEnabled);
  317.   BOOL IsTabVisible(TVisualObject *pObject, BOOL& bVisible);
  318.   void SetFont(CFont *pFont);
  319.   void EnableCtrlTab(BOOL bEnable);
  320.   virtual CSplitterWnd *CreateSplitter(DWORD dwId);
  321.   virtual BOOL ProcessMessage(MSG *pMsg);
  322. //{{AFX_VIRTUAL(TVisualFramework)
  323. public:
  324. virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
  325. //}}AFX_VIRTUAL
  326. protected:
  327. //{{AFX_MSG(TVisualFramework)
  328. //}}AFX_MSG
  329.   DECLARE_MESSAGE_MAP()
  330.   friend class TVisualFrameworkIterator;
  331. };
  332. //=============================================================================
  333. // TVisualFrameworkIterator
  334. //
  335. // Iterates thru all visual objects in the framework (including objects that
  336. // cannot be focused like tab windows and splitters)
  337. //=============================================================================
  338. class TVisualFrameworkIterator {
  339. private:
  340.   enum TIteratorType { IT_MAP, IT_LIST };
  341.   TVisualObjectMap *m_pObjectMap;
  342.   TVisualObjectMap::iterator m_MapIt;
  343.   TVisualObjectList *m_pObjectList;
  344.   TVisualObjectList::iterator m_ListIt;
  345.   TIteratorType m_nType;
  346. public:
  347.   TVisualFrameworkIterator(TVisualFramework& obj)
  348.     :m_pObjectMap(&(obj.m_ObjectMap))
  349.   {
  350.     m_MapIt = m_pObjectMap->begin();
  351.     m_nType = IT_MAP;
  352.   }
  353.   TVisualFrameworkIterator(TVisualObject& obj)
  354.     :m_pObjectList(&(obj.m_ObjectList))
  355.   {
  356.     m_ListIt = m_pObjectList->begin();
  357.     m_nType = IT_LIST;
  358.   }
  359.   TVisualObject *operator->()
  360.   {
  361.     return Get();
  362.   }
  363.   TVisualObject *Get(void)
  364.   {
  365.     switch (m_nType) {
  366.     case IT_MAP: return m_MapIt->second;
  367.     case IT_LIST: return *m_ListIt;
  368.     }
  369.     ASSERT(FALSE);
  370.     return NULL;
  371.   }
  372.   int End(void)
  373.   {
  374.     switch (m_nType) {
  375.     case IT_MAP: return (m_MapIt != m_pObjectMap->end()) ? 0 : 1; 
  376.     case IT_LIST: return (m_ListIt != m_pObjectList->end()) ? 0 : 1;
  377.     }
  378.     ASSERT(FALSE);
  379.     return 1;
  380.   }
  381.   int operator++(int)
  382.   { 
  383.     switch (m_nType) {
  384.     case IT_MAP: m_MapIt++; break;
  385.     case IT_LIST: m_ListIt++; break;
  386.     default: ASSERT(FALSE);
  387.     }
  388.     return End();
  389.   }
  390. };
  391. //=============================================================================
  392. // class TVisualFormView
  393. //
  394. //=============================================================================
  395. class TVisualFormView : public CFormView {
  396. DECLARE_DYNAMIC(TVisualFormView)
  397. protected:
  398. TVisualFormView(LPCTSTR lpszTemplateName);
  399. TVisualFormView(UINT nIDTemplate);
  400. public:
  401.   void SetFont(CFont *pFont);
  402. //{{AFX_MSG(TVisualFormView)
  403. afx_msg void OnEnable(BOOL bEnable);
  404. //}}AFX_MSG
  405. DECLARE_MESSAGE_MAP()
  406. };
  407. #endif
  408. /*#############################################################################
  409. # End of file VISUALFX.H
  410. #############################################################################*/