XMLCustomizableForms.h
上传用户:kj0090
上传日期:2007-03-02
资源大小:39k
文件大小:6k
源码类别:

xml/soap/webservice

开发平台:

C/C++

  1. /***********************************************************************
  2. *
  3. * This module is part of the XMLGUI system 
  4. *
  5. * File name:       XMLCustomizableForms.h
  6. *
  7. * Creation date:   [21 AUGUST 2002] 
  8. *
  9. * Author(s):       [Kolosenko Ruslan]
  10. *
  11. * Description:     Declares class CXMLCustomizableForm - template class
  12. *                  for various kinds of customizable form views
  13. *
  14. **********************************************************************/
  15. #ifndef AFX_XML_CUSTOMIZABLE_FORMS_H_RKOL_8_21_2002_
  16. #define AFX_XML_CUSTOMIZABLE_FORMS_H_RKOL_8_21_2002_
  17. #if _MSC_VER > 1000
  18. #pragma once
  19. #endif // _MSC_VER > 1000
  20. #include "DlgTemplate.h"
  21. #include "xmlgui_resource.h"
  22.    // exported global functions declaration, implemented in XMLCustomizable.cpp
  23. void XMLGUI_EXT_CLASS CXMLCustomizable_CustomizeXML(LPCTSTR szXMLFile);
  24. #ifndef _AFX_NO_OCC_SUPPORT
  25. void XMLGUI_EXT_CLASS CXMLCustomizable_InitializeForm(CFormView* pFormView,
  26.           _AFX_OCC_DIALOG_INFO* pOccDialogInfo, CDlgTemplate* pDlgTemplate,
  27.           LPCTSTR szTemplateName);
  28. #endif /* _AFX_NO_OCC_SUPPORT */
  29. template <class FormClass> class CXMLCustomizableForm : public FormClass
  30. {
  31. public:
  32.        // one version of constructor accepts resource ID as a reserve
  33.        // for form creation if the XML file is not valid
  34.     CXMLCustomizableForm(LPCTSTR szXMLFile, UINT nDlgResourceID = 0)
  35.            :FormClass(nDlgResourceID)
  36.     {
  37.            // store the name of the XML file for later use in the Create method
  38.         m_szXMLFile = szXMLFile;
  39.     }
  40.        // another version of constructor accepts resource name as a reserve
  41.        // for dialog creation if the XML file is not valid
  42.     CXMLCustomizableForm(LPCTSTR szXMLFile, LPCTSTR szTemplateName)
  43.            :FormClass(szTemplateName)
  44.     {
  45.            // store the name of the XML file for later use in the Create method
  46.         m_szXMLFile = szXMLFile;
  47.     }
  48.     virtual ~CXMLCustomizableForm() {};
  49.        // Create method is similar to MFC class CFormView::Create
  50.        // only functionality to load dialog template from XML is added
  51.     virtual BOOL Create(LPCTSTR /*lpszClassName*/, LPCTSTR /*lpszWindowName*/,
  52.    DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
  53.    CCreateContext* pContext)
  54.     {
  55.         m_pCreateContext = pContext;    // save state for later OnCreate
  56.            // call PreCreateWindow to get prefered extended style
  57.         CREATESTRUCT cs;
  58.         memset(&cs, 0, sizeof(CREATESTRUCT));
  59.         if ( dwRequestedStyle == 0 )
  60.         {
  61.             dwRequestedStyle = AFX_WS_DEFAULT_VIEW;
  62.         }
  63.         cs.style = dwRequestedStyle;
  64.         if ( !PreCreateWindow(cs) )
  65.         {
  66.                // form view creation is aborted in the overriden PreCreateWindow
  67.             return FALSE;
  68.         }
  69.            // try to parse XML file with dialog template
  70.         if ( !m_szXMLFile.IsEmpty() && m_Template.SerializeFrom(m_szXMLFile) )
  71.         {
  72.                // it is necessary to set WS_CHILD style bit for a Form View
  73.             m_Template.style |= WS_CHILD;
  74.                // if XML file is valid - create form using the read template
  75.             CreateDlgIndirect((LPDLGTEMPLATE)m_Template,pParentWnd);
  76.         }
  77.         else
  78.         {
  79.                // otherwise switch to the template contained in the resource file
  80.             CreateDlg(m_lpszTemplateName,pParentWnd);
  81.         }
  82.         m_pCreateContext = NULL;
  83.            // we use the style from the template - but make sure that
  84.            // the WS_BORDER bit is correct
  85.            // the WS_BORDER bit will be whatever is in dwRequestedStyle
  86.         ModifyStyle(WS_BORDER|WS_CAPTION, cs.style & (WS_BORDER|WS_CAPTION));
  87.         ModifyStyleEx(WS_EX_CLIENTEDGE, cs.dwExStyle & WS_EX_CLIENTEDGE);
  88.         
  89.            // set view's child window ID
  90.         SetDlgCtrlID(nID);
  91.         
  92.            // adjust scrolling characteristics
  93.         CRect rectTemplate;
  94.         GetWindowRect(rectTemplate);
  95.         SetScrollSizes(MM_TEXT, rectTemplate.Size());
  96.            // initialize OLE controls on the form view
  97.         ExecuteDlgInit((LPVOID)NULL);
  98.            // adjust window position of the form view
  99.         SetWindowPos(NULL, rect.left, rect.top, rect.right - rect.left,
  100.             rect.bottom - rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
  101.         
  102.            // make visible if requested
  103.         if ( dwRequestedStyle & WS_VISIBLE )
  104.         {
  105.             ShowWindow(SW_NORMAL);
  106.         }
  107.         return TRUE;  // creation of the form view is done successfully
  108.     }
  109. protected:
  110.        // Windows messages handler for the form view
  111.     virtual BOOL OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
  112.     {
  113.         if ( message == WM_INITDIALOG )   // OLE controls initialization
  114.         {
  115.             Default();   // allow default to initialize first (common dialogs/etc)
  116.             
  117.                // create OLE controls
  118. #ifndef _AFX_NO_OCC_SUPPORT
  119.             CXMLCustomizable_InitializeForm(this,m_pOccDialogInfo,
  120.                                             &m_Template,m_lpszTemplateName);
  121. #endif /* _AFX_NO_OCC_SUPPORT */
  122.             
  123.             return FALSE;   // do not call parent's initialization routine
  124.         }
  125.         if ( message == WM_CONTEXTMENU )
  126.         {
  127.                // show context menu with "Customize" option
  128.             CMenu menu;
  129.             menu.LoadMenu(IDR_XMLGUI_CUSTOMIZING);
  130.             CMenu* pPopup = menu.GetSubMenu(0);
  131.             pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,MAKEPOINTS(lParam).x,
  132.                 MAKEPOINTS(lParam).y,this);
  133.         }
  134.         if ( message == WM_COMMAND && wParam == ID_XMLGUI_CUSTOMIZE )
  135.         {
  136.                // handle "Customize" command from the popup menu
  137.                // global function CXMLCustomizable_CustomizeXML does this
  138.             CXMLCustomizable_CustomizeXML(m_szXMLFile);
  139.         }
  140.            // pass the message to the base class window procedure
  141.         return FormClass::OnWndMsg(message,wParam,lParam,pResult);
  142.     }
  143.     CDlgTemplate m_Template;    // dialog template object holding the Win32 DLGTEMPLATE
  144.     CString      m_szXMLFile;   // full name of the file with XML-style dialog template
  145. };
  146.    // instantiation of CXMLCustomizableForm for MFC class CFormView
  147. typedef CXMLCustomizableForm<CFormView> CXMLGUIFormView;
  148. #endif // AFX_XML_CUSTOMIZABLE_FORMS_H_RKOL_8_21_2002_