📄 topicvie.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 + -