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

📄 topicvie.cpp

📁 cj60lib界面库 ,ado数据库编程 使用方法: 调试代码必须装有cj60lib界面扩展库 cj60lib的使用方法参看有关文档 不知道是不是我的cj60lib出问题
💻 CPP
字号:
// TopicView.cpp : implementation file
//

#include "stdafx.h"
#include "vchelper.h"
#include "TopicView.h"
#include "vchelperdoc.h"
#include "mainfrm.h"
#include "helplistview.h"
#include "addtopic.h"


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

/////////////////////////////////////////////////////////////////////////////
// CTopicView

IMPLEMENT_DYNCREATE(CTopicView, CView)

CTopicView::CTopicView()
{
	m_expand=0;
	m_beflag=false;
}

CTopicView::~CTopicView()
{
}


BEGIN_MESSAGE_MAP(CTopicView, CView)
	//{{AFX_MSG_MAP(CTopicView)
	ON_WM_SIZE()
	ON_NOTIFY(TVN_SELCHANGED,    IDC_TREE_VIEW, OnSelchanged)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_DELETER_TOPIC, OnDeleterTopic)
	ON_COMMAND(IDC_UP_BUTTON, OnUpButton)
	ON_COMMAND(IDC_DOWN_BUTTON, OnDownButton)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTopicView drawing

void CTopicView::OnDraw(CDC* pDC)
{
	CVchelperDoc* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CTopicView diagnostics

#ifdef _DEBUG
void CTopicView::AssertValid() const
{
	CView::AssertValid();
}

void CTopicView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTopicView message handlers

CVchelperDoc* CTopicView::GetDocument() 
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVchelperDoc)));
	return (CVchelperDoc*)m_pDocument;
}

void CTopicView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	if( !m_TreeCtrl.Create( WS_CHILD|WS_VISIBLE|TVS_HASBUTTONS|TVS_HASLINES,
		CRect(0,0,0,0), this, IDC_TREE_VIEW))
	{
		return;
	}
	m_TreeCtrl.SetImageList (&theApp.m_imagelist, TVSIL_NORMAL);

	CString str= _T("主题");
	if (!m_Caption.Create(str,
		WS_VISIBLE|SS_CENTER|SS_CENTERIMAGE,
		CRect(0,0,0,0), this, IDC_BAR_CAPTION))
	{
		TRACE0("Unable to create caption.\n");
		return;
	}

	// Create the caption button.
	if (!m_UpButton.Create(NULL,
		WS_VISIBLE|BS_ICON|BS_OWNERDRAW|BS_CENTER|BS_VCENTER,
		CRect(0,0,0,0), this, IDC_UP_BUTTON))
	{
		TRACE0("Unable to create caption button.\n");
		return;
	}
	// Associate the button icon
	m_UpButton.SetIcon((theApp.m_imagelist).ExtractIcon(3), CSize(16,16));

	if (!m_DownButton.Create(NULL,
		WS_VISIBLE|BS_ICON|BS_OWNERDRAW|BS_CENTER|BS_VCENTER,
		CRect(0,0,0,0), this, IDC_DOWN_BUTTON))
	{
		TRACE0("Unable to create caption button.\n");
		return;
	}
	// Associate the button icon
	m_DownButton.SetIcon((theApp.m_imagelist).ExtractIcon(4), CSize(16,16));

	m_beflag=true;
	
	CVchelperDoc* pDoc=GetDocument();
	m_pTypeset=pDoc->m_pTypeset;
	m_pCon=pDoc->m_pConnection;
	ShowData();
}

BOOL CTopicView::PreCreateWindow(CREATESTRUCT& cs) 
{
	cs.style |= TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT;
	return CView::PreCreateWindow(cs);
}

void CTopicView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	if (m_Caption.GetSafeHwnd()) {
		m_Caption.MoveWindow(0,0,cx,22);
		m_Caption.Invalidate();
	}

	if (m_UpButton.GetSafeHwnd()) {
		CRect rc;
		rc.left   = cx-20;
		rc.top    = 2;
		rc.bottom = 20;
		rc.right  = cx-2;
		m_UpButton.MoveWindow(rc);
	}

	if (m_DownButton.GetSafeHwnd()) {
		CRect rc;
		rc.left   = cx-40;
		rc.top    = 2;
		rc.bottom = 20;
		rc.right  = cx-21;
		m_DownButton.MoveWindow(rc);
	}

	if (m_TreeCtrl.GetSafeHwnd()) {
		m_TreeCtrl.MoveWindow(0,23,cx,cy-23);
	}
}

void CTopicView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	
	CMainFrame *pFrame = DYNAMIC_DOWNCAST(CMainFrame,AfxGetApp()->m_pMainWnd);
	if( !pFrame )
	{
		return;
	}
	int x;
	int y;
	if(Search(x,y))
	{
		CString str;
		if(x==0&&y==0)
		{
			str="id>1";
		}
		else
		{
			if(y==0)
			{
				str.Format("typeid1 = %d",x);
			}
			else
			{
				str.Format("typeid1 = %d and typeid2 = %d",x,y);
			}
		}
		pFrame->GetListView()->OnChange(str);
	}
	else return;
	*pResult = 0;
}

BOOL CTopicView::Search(int &x,int &y)
{
	CString str=m_TreeCtrl.GetItemText(m_TreeCtrl.GetSelectedItem());
	if(str=="主题列表"||str=="示例主题")
	{
		return false;
	}
	if(str=="所有主题")
	{
		x=y=0;
		return true;
	}
	for(int i=0;i<m_num;i++)
	{
		if(it[i].Item==m_TreeCtrl.GetSelectedItem())
		{
			x=it[i].typeID1;
			y=it[i].typeID2;
			return true;
		}
	}
	return false;
}



void CTopicView::ShowData()
{
	if(m_pTypeset->State==1)
	{
		m_pTypeset->Close();
	}
	m_pTypeset->Open("SELECT * FROM typestab ORDER BY typeid1",&(*m_pCon),adOpenForwardOnly,adLockOptimistic,adCmdText);
	m_TreeCtrl.DeleteAllItems();

	HTREEITEM htItemx = m_TreeCtrl.InsertItem(_T("主题列表"));
	HTREEITEM htItem = m_TreeCtrl.InsertItem(_T("所有主题"),2, 1,htItemx);
	m_TreeCtrl.InsertItem(_T("示例主题"),2, 1,htItemx);

	int num=0;
	CString str;

	m_pTypeset->MoveFirst();
	while(!m_pTypeset->adoEOF)
	{ 
		if(m_pTypeset->GetCollect("typeid2").intVal==0)
		{
			str=m_pTypeset->GetCollect("typestring").bstrVal;
			str="【"+str+"】";
			it[num].Item=m_TreeCtrl.InsertItem(str, 2, 1, htItem, TVI_LAST);
			it[num].typeID1=m_pTypeset->GetCollect("typeid1").intVal;
			it[num].typeID2=m_pTypeset->GetCollect("typeid2").intVal;
			infrcd[num].strName=m_pTypeset->GetCollect("typestring").bstrVal;
			infrcd[num].typeID1=it[num].typeID1;
			infrcd[num].typeID2=it[num].typeID2;
			num++;
		}
		m_pTypeset->MoveNext();
	}
	m_pTypeset->MoveFirst();
	
	int num2=num;
	while(!m_pTypeset->adoEOF)
	{ 
		if(m_pTypeset->GetCollect("typeid2").intVal!=0)
		{
			for(int i=0;i<num;i++)
			{
				if(m_pTypeset->GetCollect("typeid1").intVal==it[i].typeID1)
				{
					str=m_pTypeset->GetCollect("typestring").bstrVal;
					str="『"+str+"』";
					it[num2].Item=m_TreeCtrl.InsertItem(str, 2, 1, it[i].Item, TVI_LAST);
					it[num2].typeID1=m_pTypeset->GetCollect("typeid1").intVal;
					it[num2].typeID2=m_pTypeset->GetCollect("typeid2").intVal;
					infrcd[num2].strName=m_pTypeset->GetCollect("typestring").bstrVal;
					infrcd[num2].typeID1=it[num2].typeID1;
					infrcd[num2].typeID2=it[num2].typeID2;
					num2++;
					if(m_expand)
					{
						m_TreeCtrl.Expand(it[i].Item,TVE_EXPAND);
					}
					break;
				}
			}
		}
		m_pTypeset->MoveNext();
	}
	m_num=num2;
	m_TreeCtrl.Expand(htItemx, TVE_EXPAND);//展开
	m_TreeCtrl.Expand(htItem, TVE_EXPAND);//展开
}

void CTopicView::OnContextMenu(CWnd* pWnd, CPoint point) 
{

	if (point.x == -1 && point.y == -1){
		//keystroke invocation
		CRect rect;
		GetClientRect(rect);
		ClientToScreen(rect);
		
		point = rect.TopLeft();
		point.Offset(5, 5);
	}
	
	CMenu menu;
	VERIFY(menu.LoadMenu(IDR_POPUP_TREE));
	
	CMenu* pPopup = menu.GetSubMenu(0);
	ASSERT(pPopup != NULL);
	CWnd* pWndPopupOwner = this;
	
	while (pWndPopupOwner->GetStyle() & WS_CHILD)
		pWndPopupOwner = pWndPopupOwner->GetParent();
	
	pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
		pWndPopupOwner);		
}

void CTopicView::OnDeleterTopic() 
{
	int x;
	int y;
	if(!Search(x,y)) return;
	if(x==0&&y==0) return;
	
	CString str;
	str="是否删除主题:  "+
		m_TreeCtrl.GetItemText(m_TreeCtrl.GetSelectedItem())+
		"\r\n\r\n(!警告,该操作将删除该主题下的记录)";
	if(AfxMessageBox(str,MB_YESNO|MB_ICONEXCLAMATION)!=IDYES) return;

	int frag=0;
	if(y==0)
	{
		for(int i=0;i<m_num;i++)
		{
			if(it[i].typeID1==x) frag++;
			if(frag>1) break;
		}
	}
	
	if(frag>1)
	{
		if(AfxMessageBox("删除该主题将删除该主题的所有子主题,是否继续?",MB_YESNO|MB_ICONEXCLAMATION)!=IDYES) return;
		_variant_t v;
		v.Clear();
		try
		{
			str.Format("DELETE FROM TypesTab WHERE typeid1=%d",x);
			m_pCon->Execute(_bstr_t(str),&v,adCmdText);
			str.Format("DELETE FROM DatasTab WHERE typeid1=%d",x);
			m_pCon->Execute(_bstr_t(str),&v,adCmdText);
		}
		catch(...)
		{
			MessageBox("删除失败!","提示信息",MB_OK|MB_ICONERROR);
		}	  
	}
	else
	{
		_variant_t v;
		v.Clear();
		try
		{		
			str.Format("DELETE FROM TypesTab WHERE typeid1=%d AND typeid2=%d",x,y);
			m_pCon->Execute(_bstr_t(str),&v,adCmdText);
			str.Format("DELETE FROM DatasTab WHERE typeid1=%d AND typeid2=%d",x,y);
			m_pCon->Execute(_bstr_t(str),&v,adCmdText);
		}
		catch(...)
		{
			MessageBox("删除失败!","提示信息",MB_OK|MB_ICONERROR);
		}
	}
	ShowData();
	m_TreeCtrl.Select(it[0].Item,TVGN_CARET);
}

void CTopicView::OnUpButton() 
{
	m_expand=0;
	ShowData();
}

void CTopicView::OnDownButton() 
{
	m_expand=1;
	ShowData();
}

void CTopicView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	if(m_beflag)
	{
		ShowData();
	}
}

void CTopicView::AddTopic()
{
	CAddTopic addtopic;
	addtopic.m_num=m_num;
	for(int i=0;i<m_num;i++)
	{
		addtopic.infrcd[i]=infrcd[i];
	}
	if(addtopic.DoModal()==IDOK)
	{
		try
		{
			m_pTypeset->AddNew();
			m_pTypeset->PutCollect("typeid1",_variant_t((long)addtopic.m_type1));
			m_pTypeset->PutCollect("typeid2",_variant_t((long)addtopic.m_type2));
			m_pTypeset->PutCollect("TypeString",_variant_t(addtopic.m_strTopic));
			m_pTypeset->Update();
			this->ShowData();
		}
		catch(...)
		{
			MessageBox("添加主题失败!","提示信息",MB_OK|MB_ICONERROR);
		}
	}
	return;
}

⌨️ 快捷键说明

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