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

📄 mainfrm.cpp

📁 MFC ODBC数据库编程包括工程创建
💻 CPP
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "Chapter21.h"

#include "MainFrm.h"
#include "LeftTreeView.h"
#include "RightPaneFrame.h"
#include "AddRelationInfo.h"
#include "RightListView.h"


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

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_ADD_INFO, OnAddInfo)
	ON_COMMAND(ID_DELETE_INFO, OnDeleteInfo)
	ON_UPDATE_COMMAND_UI(ID_DELETE_INFO, OnUpdateDeleteInfo)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	//  be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (!m_wndSplitter.CreateStatic(this, 1, 2))
	{
		TRACE0("Failed to create splitter window\n");
		return FALSE;
	}	
	//获取客户区大小以便调整视图的大小
	CRect rect;
	GetClientRect(&rect);	
	//首先创建左视图
	if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftTreeView), CSize(rect.Width()/4, 0), pContext))
	{
		TRACE0("Failed to create left pane view\n");
		return FALSE;
	}	
	//左窗格是一个包含几个具有不同视图的辅助框架窗口
	if (!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightPaneFrame), CSize(0, 0), pContext))
	{
		TRACE0("Failed to create right pane frame\n");
		return FALSE;
	}	
	CLeftTreeView* pLeftTreeView=(CLeftTreeView*)m_wndSplitter.GetPane(0,0);
	pLeftTreeView->m_pRightPaneFrame=(CRightPaneFrame*)m_wndSplitter.GetPane(0,1);	
	return TRUE;
}


BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	//重定向消息,以便辅助框架能够处理来自主框架的命令消息
	CRightPaneFrame* pRightPaneFrame=(CRightPaneFrame*)m_wndSplitter.GetPane(0,1);
	if(pRightPaneFrame->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

void CMainFrame::OnAddInfo() 
{
	// TODO: Add your command handler code here
	//显示对话框
	CAddRelationInfo dlg;
	dlg.m_strTitle="添加联系人信息";
	dlg.bEdit=FALSE;
	dlg.DoModal();
}

void CMainFrame::OnDeleteInfo() 
{
	// TODO: Add your command handler code here
	//判断想要删除的内容:树或者列表
	if(bTreeSel)
	{
		DeleteTree();
		bTreeSel=FALSE;
	}	
	else if(bListSel)
	{
		DeleteList();
		bListSel=FALSE;
	}
	else
	{//实际上这句话没用,因为不可能执行到此处
		AfxMessageBox("不能删除任何项");
	}
}

void CMainFrame::OnUpdateDeleteInfo(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	//树
	bTreeSel=FALSE;
	bListSel=FALSE;
	CLeftTreeView* pLeftTreeView=(CLeftTreeView*)m_wndSplitter.GetPane(0,0);
	CTreeCtrl& treeCtrl=pLeftTreeView->m_treeCtrl;
	HTREEITEM hSelItem=treeCtrl.GetSelectedItem( );
	if(hSelItem!=NULL)
	{
		bTreeSel=TRUE;
	}	
	//列表控件
	CRightPaneFrame* pRightPaneFrame=(CRightPaneFrame*)m_wndSplitter.GetPane(0,1);
	CRightListView* pListView=(CRightListView*)pRightPaneFrame->m_wndSplitter.GetPane(0,0);
	CListCtrl& listCtrl=pListView->m_listCtrl;
	POSITION pos=listCtrl.GetFirstSelectedItemPosition();
	if (pos!=NULL)
	{
		bListSel=TRUE;
	}
	//两种情况下
	pCmdUI->Enable(bTreeSel|bListSel);
}

void CMainFrame::DeleteTree()
{
	
	CLeftTreeView* pLeftTreeView=(CLeftTreeView*)m_wndSplitter.GetPane(0,0);
	CTreeCtrl& treeCtrl=pLeftTreeView->m_treeCtrl;
	HTREEITEM hSelItem=treeCtrl.GetSelectedItem( );
	if(hSelItem==NULL)
		return;
	
	HTREEITEM hParentItem=treeCtrl.GetParentItem(hSelItem);	
	CString strWhere,strField1,strField2,strSQL,strHint;
	if(hParentItem==NULL&& hSelItem!=NULL)
	{	//所有联系人不允许一下子全部删除
		strHint="不允许一下子全部删除所有联系人!(";
		AfxMessageBox(strHint);
		return;
	}
	else if( hParentItem!=NULL&&treeCtrl.GetParentItem(hParentItem)==NULL )
	{	//一级类别
		CString strFirClass=treeCtrl.GetItemText(hSelItem);
		//设置查询条件
		strWhere.Format("一级类别='%s'",strFirClass);
		strSQL="select * from info where "+strWhere;				
		strHint.Format("您真的要删除所有%s的个人信息吗?",strFirClass);
		
	}
	else
	{	//二级类别		
		CString strFirClass=treeCtrl.GetItemText(treeCtrl.GetParentItem(hSelItem));		
		CString strSecClass=treeCtrl.GetItemText(hSelItem);		
		//设置查询条件
		strWhere.Format("一级类别='%s' and 二级类别='%s'",\
				strFirClass,strSecClass);
		strSQL="select * from info where "+strWhere;
		strHint.Format("您真的要删除%s%s的所有个人信息吗?",strSecClass,strFirClass);
	}

	if(MessageBox(strHint,"个人通讯信息管理系统",MB_YESNO)==IDNO)
	{	
		return;
	}	
	//删除表
	if(!pLeftTreeView->OpenRecordSet(pLeftTreeView->m_pRecordset,strSQL))
	{
		AfxMessageBox("信息表没有成功打开");
		return;
	}
	while(!pLeftTreeView->m_pRecordset->adoEOF)
	{
		pLeftTreeView->m_pRecordset->Delete(adAffectCurrent);
		pLeftTreeView->m_pRecordset->MoveNext();
	}
	pLeftTreeView->m_pRecordset->Close();
	pLeftTreeView->m_pRecordset=NULL;
	//更新树
	pLeftTreeView->ShowTree();
}

void CMainFrame::DeleteList()
{
	//获取列表控件
	CRightPaneFrame* pRightPaneFrame=(CRightPaneFrame*)m_wndSplitter.GetPane(0,1);
	CRightListView* pListView=(CRightListView*)pRightPaneFrame->m_wndSplitter.GetPane(0,0);
	CListCtrl& listCtrl=pListView->m_listCtrl;	
	CString strName,strSQL;
	//寻找当前选中的记录的位置
	POSITION pos=listCtrl.GetFirstSelectedItemPosition();
	if (pos==NULL)
	{
		//如果没有选择记录,则提示并退出
		AfxMessageBox("请您选择要删除的信息!");
		return;
	}
	int iIndex=listCtrl.GetNextSelectedItem(pos);
	//表
	CString strFirClass,strSecClass;
	strName=listCtrl.GetItemText(iIndex,0);
	strFirClass=listCtrl.GetItemText(iIndex,1);
	strSecClass=listCtrl.GetItemText(iIndex,4);
	//确认信息
	CString strHint;
	strHint.Format("是否删除:%s的个人信息?",strName);	
	if (MessageBox(strHint,"删除确认",MB_YESNO|MB_ICONQUESTION)==IDNO)
	{
		return;	
	}
	//首先从列表中删除
	listCtrl.DeleteItem(iIndex);

	strSQL.Format("select * from info where 姓名='%s' \
		and 一级类别='%s' and 二级类别='%s'",\
		strName,strFirClass,strSecClass);

	if(!pListView->OpenRecordSet(pListView->m_pRecordset,strSQL))
	{
		AfxMessageBox("基本信息没有成功打开");
		return;
	}	
	//其次从数据库中删除	
	pListView->m_pRecordset->Delete(adAffectCurrent);
	
	pListView->m_pRecordset->Close();
	pListView->m_pRecordset=NULL;
	bListSel=FALSE;
	//更新树
	CLeftTreeView* pLeftTreeView=(CLeftTreeView*)m_wndSplitter.GetPane(0,0);
	pLeftTreeView->ShowTree();
}

⌨️ 快捷键说明

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