⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genericserializedemoview.cpp

📁 Template functions for serializing arbitrary linked nodes. 串行化连接节点的模板函数(源码)(25KB)
💻 CPP
字号:
// GenericSerializeDemoView.cpp : implementation of the CGenericSerializeDemoView class
//

#include "stdafx.h"
#include "GenericSerializeDemo.h"
#include "GenericSerializeDemoDoc.h"
#include "GenericSerializeDemoView.h"
#include "SerializeAccess.h"
#include "DlgInsert.h"
#include "WndGraph.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGenericSerializeDemoView

IMPLEMENT_DYNCREATE(CGenericSerializeDemoView, CFormView)

BEGIN_MESSAGE_MAP(CGenericSerializeDemoView, CFormView)
	//{{AFX_MSG_MAP(CGenericSerializeDemoView)
	ON_COMMAND(ID_EDIT_INSERTTREEITEM, OnEditInserttreeitem)
	ON_COMMAND(ID_EDIT_DELETETREEITEM, OnEditDeletetreeitem)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)

    ON_MESSAGE(WM_MODIFIED,SetModified)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGenericSerializeDemoView construction/destruction

CGenericSerializeDemoView::CGenericSerializeDemoView()
	: CFormView(CGenericSerializeDemoView::IDD),m_bInitDialog(false)
{
	//{{AFX_DATA_INIT(CGenericSerializeDemoView)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CGenericSerializeDemoView::~CGenericSerializeDemoView()
{
    m_vecGraph.clear();
}

void CGenericSerializeDemoView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGenericSerializeDemoView)
	DDX_Control(pDX, IDC_TREE, m_Tree);
	//}}AFX_DATA_MAP
}

BOOL CGenericSerializeDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CFormView::PreCreateWindow(cs);
}

void CGenericSerializeDemoView::InitTreeCtrl()
{
    m_Tree.DeleteAllItems();
    HTREEITEM hItemRoot=    m_Tree.InsertItem(_T("Root"));
    HTREEITEM hItemChild=   m_Tree.InsertItem(_T("Child 1"),hItemRoot);
                            m_Tree.InsertItem(_T("Child 2"),
                                m_Tree.GetParentItem(hItemChild),hItemChild);
                            m_Tree.InsertItem(_T("Child 12"),hItemChild);
                            m_Tree.InsertItem(_T("Child 3"),hItemRoot);
                            m_Tree.InsertItem(_T("Sibling 1")); 
    m_Tree.Expand(hItemRoot,TVE_EXPAND);
    m_Tree.Expand(hItemChild,TVE_EXPAND);
}

void CGenericSerializeDemoView::CreateFromStatic()
{
    CStatic wndStatic;
    if(!wndStatic.SubclassDlgItem(IDC_STATIC_PLACEHOLDER,this)){
        return;
    }
    CRect rc;
    wndStatic.GetWindowRect(&rc);
    ScreenToClient(&rc);
    wndStatic.DestroyWindow();
    CWndGraph* pWndGraph= new CWndGraph(m_vecGraph,
                                this,IDC_STATIC_PLACEHOLDER,rc);
    m_bInitDialog= true;
}
int CGenericSerializeDemoView::SetRandomConnections(Graph* pGraph)
{
    if( rand()%5 <3 ) return 0;
    int nOfConnections= rand()%2;
    for(int i=0;i<nOfConnections;i++){
        pGraph->vecConnections.push_back(m_vecGraph[rand()%m_vecGraph.size()]);
    }
    return nOfConnections;
}
void CGenericSerializeDemoView::InitGraph()
{
    if( !m_bInitDialog ){
        CreateFromStatic();
    }
    static int a[]={
        10,10,50,20,30,90,90,10,60,40,150,60,200,230,180,190,50,260
    };
    m_vecGraph.clear();
    unsigned i;
    for(i=0;i+1<sizeof(a)/sizeof(int);i+=2){
        m_vecGraph.push_back(new Graph(a[i],a[i+1]));
    }
    for(i=0;i<5;i++){
        int nOfConnections=0;
        for(i=0;i<m_vecGraph.size();i++){
            nOfConnections+=SetRandomConnections(m_vecGraph[i]);
        }
        if( nOfConnections==0 ){
            srand( (unsigned)time( NULL )+i*10 );
        }else{
            break;
        }
    }
}

void CGenericSerializeDemoView::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

    if( GetDocument()->GetPathName().IsEmpty() ){
        srand( (unsigned)time( NULL ) );
        InitTreeCtrl();
        InitGraph();
    }
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();

}

/////////////////////////////////////////////////////////////////////////////
// CGenericSerializeDemoView printing

BOOL CGenericSerializeDemoView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CGenericSerializeDemoView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CGenericSerializeDemoView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

void CGenericSerializeDemoView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
	// TODO: add customized printing code here
}

/////////////////////////////////////////////////////////////////////////////
// CGenericSerializeDemoView diagnostics

#ifdef _DEBUG
void CGenericSerializeDemoView::AssertValid() const
{
	CFormView::AssertValid();
}

void CGenericSerializeDemoView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}

CGenericSerializeDemoDoc* CGenericSerializeDemoView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGenericSerializeDemoDoc)));
	return (CGenericSerializeDemoDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CGenericSerializeDemoView message handlers

void CGenericSerializeDemoView::ApplyItemStates(HTREEITEM hItem)
{
    if(hItem){
        DWORD state= m_Tree.GetItemData(hItem);
        m_Tree.SetItemState(hItem,state,TVIF_STATE);
        if( state&TVIS_EXPANDED ){
            m_Tree.Expand(hItem,TVE_EXPAND);
        }
        ApplyItemStates(m_Tree.GetNextSiblingItem(hItem));
        ApplyItemStates(m_Tree.GetChildItem(hItem));
    }
}

void CGenericSerializeDemoView::GraphSerialize(CArchive& ar)
{
    GraphAccess access(m_vecGraph,ar);
    if(ar.IsStoring()){
        GenericSerialize(access);
    }else{
        m_vecGraph.clear();
        GenericDeserialize(access);
    }
}

void CGenericSerializeDemoView::TreeSerialize(CArchive& ar)
{
    TreeAccess access(m_Tree,ar);
	if (ar.IsStoring())
	{	
        GenericSerialize(access);
	}
	else
	{	
        m_Tree.DeleteAllItems();
        GenericDeserialize(access); 
        ApplyItemStates(m_Tree.GetRootItem());
	}
}

void CGenericSerializeDemoView::Serialize(CArchive& ar) 
{
    TreeSerialize(ar);
    GraphSerialize(ar);

    
}

void CGenericSerializeDemoView::OnEditInserttreeitem() 
{
	HTREEITEM hItem= m_Tree.GetSelectedItem();
    if(hItem){
        CDlgInsert dlg;
        if( dlg.DoModal()==IDOK ){
            if( dlg.m_nRadioNo==0 ){
                m_Tree.InsertItem(dlg.m_strItemText,hItem);
            }else{
                m_Tree.InsertItem(dlg.m_strItemText,m_Tree.GetParentItem(hItem),hItem);
            }
            GetDocument()->SetModifiedFlag();
        }
    }
}

void CGenericSerializeDemoView::OnEditDeletetreeitem() 
{
	HTREEITEM hItem= m_Tree.GetSelectedItem();
    if(     hItem 
        &&  AfxMessageBox(_T("Delete selected tree item"),MB_YESNO)==IDYES){
        m_Tree.DeleteItem(hItem);
        GetDocument()->SetModifiedFlag();
    }
}

LPARAM CGenericSerializeDemoView::SetModified(WPARAM wParam,LPARAM lParam)
{
    GetDocument()->SetModifiedFlag();
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -