📄 getlinkview.cpp
字号:
// GetLinkView.cpp : implementation of the CGetLinkView class
//
#include "stdafx.h"
#include "GetLink.h"
#include "GetLinkDoc.h"
#include "GetLinkView.h"
#include "MainFrm.h"
#include "DummyList.h"
#include "NewTypeDlg.h"
#include "EditTypeDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGetLinkView
IMPLEMENT_DYNCREATE(CGetLinkView, CTreeView)
BEGIN_MESSAGE_MAP(CGetLinkView, CTreeView)
//{{AFX_MSG_MAP(CGetLinkView)
ON_WM_CREATE()
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_ITEM_ADD, OnItemAdd)
ON_WM_RBUTTONUP()
ON_COMMAND(ID_ITEM_DELETE, OnItemDelete)
ON_COMMAND(ID_ITEM_EDIT, OnItemEdit)
ON_NOTIFY_REFLECT(TVN_BEGINLABELEDIT, OnBeginlabeledit)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CTreeView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CTreeView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGetLinkView construction/destruction
CGetLinkView::CGetLinkView()
{
// TODO: add construction code here
m_DlgEdit=FALSE;
m_ReplaceStr = _T("");
m_SearchStr = _T("");
}
CGetLinkView::~CGetLinkView()
{
}
BOOL CGetLinkView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT|TVS_HASBUTTONS|TVS_EDITLABELS;
return CTreeView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGetLinkView drawing
void CGetLinkView::OnDraw(CDC* pDC)
{
CGetLinkDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CGetLinkView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();
// TODO: You may populate your TreeView with items by directly accessing
// its tree control through a call to GetTreeCtrl().
CTreeCtrl& tc = GetTreeCtrl();
tc.SelectItem(NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CGetLinkView printing
BOOL CGetLinkView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CGetLinkView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CGetLinkView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CGetLinkView diagnostics
#ifdef _DEBUG
void CGetLinkView::AssertValid() const
{
CTreeView::AssertValid();
}
void CGetLinkView::Dump(CDumpContext& dc) const
{
CTreeView::Dump(dc);
}
CGetLinkDoc* CGetLinkView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGetLinkDoc)));
return (CGetLinkDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGetLinkView message handlers
int CGetLinkView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTreeView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_pImageList = new CImageList();
m_pImageList->Create(IDB_IMGLIST,16,2,RGB(0,255,0));
CTreeCtrl& tc = GetTreeCtrl();
tc.SetImageList( m_pImageList, TVSIL_NORMAL );
tc.DeleteAllItems();//删去可能的项
// Set tree control styles
long style = GetWindowLong(tc.m_hWnd,GWL_STYLE);
style |= (TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS |
TVS_SHOWSELALWAYS | TVS_DISABLEDRAGDROP);
SetWindowLong(tc.m_hWnd,GWL_STYLE,style);
CGetLinkApp * App = (CGetLinkApp*)AfxGetApp();
CString filename=App->m_FileName;
//如果配置ini文件存在,从中读出类别值,否则读入缺省值,并写入ini文件
CHAR inBuf[10];
::GetPrivateProfileString("网址","Count",0,inBuf,10,(LPCTSTR)filename);
int nCount1=atol(inBuf);
HTREEITEM h,h1;
h = tc.InsertItem("网址",4,5);
if(nCount1<=0) return 0;
for(int i=1;i<=nCount1;i++)
{
CHAR type1[20]; //返回大类别键值
char str[10];
itoa(i,str,10);
CString keyname="大类别"+CString(str);
::GetPrivateProfileString("网址",(LPCTSTR)keyname,"?",type1,20,(LPCTSTR)filename);
CString CStype1=(CString)type1;
if(CStype1.GetLength()>2) //大类别名至少应大于或等于两个字节,否则不显示 ,用此法删除或隐藏类别
{ h1 = tc.InsertItem((LPCTSTR)type1,4,5,h);
//获取该大类中小类的个数nCount2
::GetPrivateProfileString((LPCTSTR)type1,"Count",0,inBuf,10,(LPCTSTR)filename);
int nCount2=atol(inBuf);
if(nCount2>0)
{
for(int j=1;j<=nCount2;j++)
{
CHAR type2[20]; //返回小类别键值
char str2[10];
itoa(j,str2,10);
CString keyname2="小类别"+CString(str2);
::GetPrivateProfileString((LPCTSTR)type1,(LPCTSTR)keyname2,"?",type2,20,(LPCTSTR)filename);
CString CStype2=(CString)type2;
if(CStype2.GetLength()>2) //小类别至少应大于或等于两个字节
tc.InsertItem((LPCTSTR)type2,4,5,h1);
tc.Expand(h1,TVE_EXPAND);
}
}
}
tc.Expand(h,TVE_EXPAND);
}
tc.SelectItem(NULL);
return 0;
}
void CGetLinkView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CMainFrame* MainFrame=(CMainFrame*)this->GetParent()->GetParent();
CDummyList* AdrView=(CDummyList*)MainFrame->m_wndSplitter2.GetPane(0,0);
CTreeCtrl& cDataTree = GetTreeCtrl();
HTREEITEM hSelect= cDataTree.GetSelectedItem();
AdrView->DoSelect(cDataTree.GetItemText(hSelect));
*pResult = 0;
}
void CGetLinkView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
UINT nFlags2;
CTreeCtrl& cDataTree = GetTreeCtrl();
m_hPointedItem = cDataTree.HitTest (point, &nFlags2);
if (m_hPointedItem && (nFlags2 & (TVHT_ONITEMICON | TVHT_ONITEMLABEL)))
{
m_bWasSelected = cDataTree.GetItemState (m_hPointedItem, TVIS_SELECTED) != 0;
if (!m_bWasSelected)
{
VERIFY (cDataTree.SetItemState (m_hPointedItem, TVIS_SELECTED, TVIS_SELECTED));
}
}
//CTreeView::OnRButtonDown(nFlags, point);
}
void CGetLinkView::OnItemAdd()
{
// TODO: Add your command handler code here
CTreeCtrl& cDataTree = GetTreeCtrl();
HTREEITEM hSelect= cDataTree.GetSelectedItem();
CString m_select=cDataTree.GetItemText(hSelect);
HTREEITEM hParent= cDataTree.GetParentItem(hSelect);
CString m_parent=cDataTree.GetItemText(hParent);
//cDataTree.SetItemState(hSelect, TVIS_SELECTED, TVIS_SELECTED);怎样继续加亮选中CTree项?
CNewTypeDlg dlg;
if(m_select!="")
dlg.m_UpType=m_parent; //新类别父类名
if(hParent!=NULL) //保证父类不为空
{
if(dlg.DoModal()==IDOK)
{
CString NewType=dlg.m_NewType;
if(NewType.GetLength()>2)
{
HTREEITEM hNewItem=cDataTree.InsertItem((LPCTSTR)NewType,4,5,hParent);
if(hNewItem!=NULL)
{
//更新ini文件
CGetLinkApp * App = (CGetLinkApp*)AfxGetApp();
CString filename=App->m_FileName;
//Count加一
CHAR inBuf[10];
::GetPrivateProfileString((LPCTSTR)m_parent,"Count",0,inBuf,10,(LPCTSTR)filename);
int nCount=atol(inBuf);
nCount++;
CHAR str[20];
itoa(nCount,str,10);
::WritePrivateProfileString((LPCTSTR)m_parent,"Count",(LPCTSTR)str,(LPCTSTR)filename);
//添加SecName
CString secname;
if(m_parent=="网址")
secname="大类别";
else
secname="小类别";
secname=secname+CString(str);
::WritePrivateProfileString((LPCTSTR)m_parent,(LPCTSTR)secname,(LPCTSTR)NewType,(LPCTSTR)filename);
}
}
}
}
}
void CGetLinkView::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CTreeCtrl& cDataTree = GetTreeCtrl();
UINT nFlags2;
HTREEITEM hItem = cDataTree.HitTest (point, &nFlags2);
if (m_hPointedItem && (nFlags2 & (TVHT_ONITEMICON | TVHT_ONITEMLABEL)))
{
if (hItem == m_hPointedItem)
{
CMenu menuItem;
CMenu *pMenu;
if (menuItem.LoadMenu (IDM_TYPE_ITEM) && (pMenu = menuItem.GetSubMenu (0)) != NULL)
{
pMenu->EnableMenuItem (ID_ITEM_SHOW, MF_BYCOMMAND|MF_ENABLED);
pMenu->EnableMenuItem (ID_ITEM_ADD, MF_BYCOMMAND|MF_ENABLED);
pMenu->EnableMenuItem (ID_ITEM_DELETE, MF_BYCOMMAND|MF_ENABLED);
pMenu->EnableMenuItem (ID_ITEM_EDIT, MF_BYCOMMAND|MF_ENABLED);
ClientToScreen (&point);
pMenu->TrackPopupMenu (TPM_LEFTBUTTON|TPM_RIGHTBUTTON/*|TPM_RETURNCMD*/|TPM_LEFTALIGN|TPM_TOPALIGN, point.x, point.y, this);
}
}
if (!m_bWasSelected && m_hPointedItem)
{
VERIFY (cDataTree.SetItemState (m_hPointedItem, 0, TVIS_SELECTED));
}
}
//CTreeView::OnRButtonUp(nFlags, point);
}
void CGetLinkView::OnItemDelete()
{
// TODO: Add your command handler code here
CTreeCtrl& cDataTree = GetTreeCtrl();
HTREEITEM hSelect= cDataTree.GetSelectedItem();
CString m_select=cDataTree.GetItemText(hSelect);
HTREEITEM hParent= cDataTree.GetParentItem(hSelect);
CString m_parent=cDataTree.GetItemText(hParent);
//cDataTree.SetItemState(hSelect, TVIS_SELECTED, TVIS_SELECTED);怎样继续加亮选中CTree项?
if(hParent!=NULL) //保证选中节点父类不为空
{
int result=AfxMessageBox("你确认删除该类和它的所有子类吗?",MB_OKCANCEL);
if(result==IDOK)
{
if(cDataTree.DeleteItem(hSelect))
{
//更新ini文件
CGetLinkApp * App = (CGetLinkApp*)AfxGetApp();
CString filename=App->m_FileName;
CHAR inBuf[10];
::GetPrivateProfileString((LPCTSTR)m_parent,"Count",0,inBuf,10,(LPCTSTR)filename);
int nCount=atol(inBuf);
for(int j=1;j<=nCount;j++)
{
CString keyname;
if(m_parent=="网址")
keyname="大类别";
else
keyname="小类别";
CHAR type[20]; //返回类别键值
char str[10];
itoa(j,str,10);
keyname=keyname+CString(str);
::GetPrivateProfileString((LPCTSTR)m_parent,(LPCTSTR)keyname,"?",type,20,(LPCTSTR)filename);
if(m_select==type)
{CString CStype="";
::WritePrivateProfileString((LPCTSTR)m_parent,(LPCTSTR)keyname,(LPCTSTR)CStype,(LPCTSTR)filename);}
}
}
}
}
}
void CGetLinkView::OnItemEdit()
{
// TODO: Add your command handler code here
CTreeCtrl& cDataTree = GetTreeCtrl();
HTREEITEM hSelect= cDataTree.GetSelectedItem();
CString m_select=cDataTree.GetItemText(hSelect);
HTREEITEM hParent= cDataTree.GetParentItem(hSelect);
CString m_parent=cDataTree.GetItemText(hParent);
if(m_select=="网址")
m_parent="无父类";
CEditTypeDlg dlg;
if(m_select!="")
{
dlg.m_EditType=m_select; //类别名称
CMainFrame* MainFrame=(CMainFrame*)this->GetParentFrame();
CDummyList* pAdrView=(CDummyList*)MainFrame->m_wndSplitter2.GetPane(0,0);
dlg.m_nCount=pAdrView->m_ctrGetList.GetItemCount();//该类别网址个数
}
if(dlg.DoModal()==IDOK)
{
CString NewType=dlg.m_EditType;
if(m_select=="网址"&&NewType!="网址")
{AfxMessageBox("网址是最高类别名称,请勿修改!"); return;}
if(NewType.GetLength()>2)
{
m_DlgEdit=TRUE; //指定由对话框编辑
if(cDataTree.SetItemText(hSelect,(LPCTSTR)NewType))
{
m_DlgEdit=FALSE;
//更新ini文件
CGetLinkApp * App = (CGetLinkApp*)AfxGetApp();
CString filename=App->m_FileName;
m_SearchStr=m_select;
m_ReplaceStr=NewType;
FormatFile(filename);
}
}
}
}
void CGetLinkView::OnBeginlabeledit(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(!m_DlgEdit)
{
*pResult =1; //取消双击产生的编辑框
}
else
*pResult =0;
}
void CGetLinkView::OpenFile(CString File, CStringArray &Content)
{
CFile file;
CString sFileData;
int iReturn = file.Open(File, CFile::modeRead);
if(iReturn == 0)
return;
DWORD DWFileLength = file.GetLength();
if(DWFileLength != 0)
{
file.Read(sFileData.GetBuffer(DWFileLength), DWFileLength);
sFileData.ReleaseBuffer();
}
file.Close();
CString Line;
while(!sFileData.IsEmpty())
{
//get one line
Line=sFileData.SpanExcluding("\r\n");
sFileData=sFileData.Right(sFileData.GetLength()-Line.GetLength()-2);
Content.Add(Line);
}
}
void CGetLinkView::FormatWidth(CStringArray &Content)
{
for(int i=0;i<Content.GetSize();i++)
{
CString &Line=Content.ElementAt(i);
CString LineOld=Line;
Line.Replace(m_SearchStr,m_ReplaceStr);
}
}
void CGetLinkView::SaveFile(CString File, CStringArray &Content)
{
CFile file;
int iOpenWrite = file.Open(File, CFile::modeCreate|CFile::modeWrite);
if(iOpenWrite != 0)
{
for(int i=0;i<Content.GetSize();i++)
{
CString Result=Content[i]+"\r\n";
int iLength = Result.GetLength();
file.Write(Result.GetBuffer(0), iLength);
}
file.Close();
}
}
void CGetLinkView::FormatFile(CString File)
{
CStringArray Content;
OpenFile( File, Content);
FormatWidth(Content);
SaveFile( File, Content);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -