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

📄 itemlist.cpp

📁 离线的RSS阅读器
💻 CPP
字号:
// ItemList.cpp : implementation file
//

#include "stdafx.h"
#include "DiamondReader.h"
#include "ItemList.h"
#include "ExploreView.h"
#include "StaticSplitterWnd.h"
#include <atlbase.h>
#include "helper.h"
#include "MainFrm.h"
#include "ChannelListView.h"
#include "AddToCollectionDlg.h"
#include "GetCollectionNameDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CItemList

CItemList::CItemList()
{
	//当前选中的项
	m_selectIndex = -1;
	//对应的数据
	this->items = NULL;

	this->m_sortCol = -1;
	this->asc = true;
}

CItemList::~CItemList()
{
}


BEGIN_MESSAGE_MAP(CItemList, CListCtrl)
	//{{AFX_MSG_MAP(CIt emList)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_CREATE()
	ON_COMMAND(ID_RSS_VIEWSIMPLE,onShowSimple)
	ON_COMMAND(ID_RSS_VIEWALL,onShowALL)
	ON_COMMAND(ID_RSS_ADDCOLLECTION,onAddCollection)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CItemList message handlers

//鼠标按下,选中一项,高亮一项
void CItemList::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_selectIndex!=-1)
	{
		this->SetItemState(m_selectIndex,0,LVIS_SELECTED|LVIF_STATE);
	}
	int i = this->HitTest(point);
	if (i<0)
	{
		LVHITTESTINFO lvhti;
		lvhti.pt = point;
		this->SubItemHitTest(&lvhti);
		i = lvhti.iItem;
		
	}
	if (i>0)
	{
		this->SetItemState(i,LVIS_SELECTED|LVIF_STATE,LVIS_SELECTED|LVIF_STATE);
	}
	m_selectIndex = i;
	onShowSimple();
	CListCtrl::OnLButtonDown(nFlags, point);
}

//右键弹出菜单
void CItemList::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	this->SetItemState(m_selectIndex,0,LVIS_SELECTED|LVIF_STATE);
	int i = this->HitTest(point);
	if (i>=0)
	{
		m_selectIndex = i;
		this->SetItemState(i,LVIS_SELECTED|LVIF_STATE,LVIS_SELECTED|LVIF_STATE);
		CMenu menu;
		menu.LoadMenu(IDR_RSSMANAGE);
		CMenu *submenu = menu.GetSubMenu(0);
		this->ClientToScreen(&point);
		submenu->TrackPopupMenu(TPM_RIGHTALIGN,point.x,point.y,this);
	}
	
	//CListCtrl::OnRButtonDown(nFlags, point);
}

//双击显示一项的详细信息
void CItemList::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//查看详细信息
	this->SetItemState(m_selectIndex,0,LVIS_SELECTED|LVIF_STATE);
	int i = this->HitTest(point);
	if (i>=0)
	{
		m_selectIndex = i;
		this->SetItemState(i,LVIS_SELECTED|LVIF_STATE,LVIS_SELECTED|LVIF_STATE);
		//查看详细信息
		//AfxMessageBox("");
		
	}
	onShowALL();
	
	CListCtrl::OnLButtonDblClk(nFlags, point);
}

void CItemList::onShowALL(){	

	if (m_selectIndex<0)
	{
		return;
	}
	
	CSplitterWnd* splitterwnd = (CSplitterWnd*)this->GetParent()->GetParent();
	CStaticSplitterWnd *spli2 = (CStaticSplitterWnd*)splitterwnd->GetPane(1,0);
	CExploreView *view = (CExploreView*)spli2->GetPane(1,0);
	ItemList *item = (ItemList*)GetItemData(m_selectIndex);
	try
	{
		view->Stop();
		view->Navigate2(item->url);
	}
	catch (...)
	{
		
	}
}

void CItemList::onShowSimple(){

	if (m_selectIndex<0)
	{
		return;
	}

	CSplitterWnd* splitterwnd = (CSplitterWnd*)this->GetParent()->GetParent();
	CStaticSplitterWnd *spli2 = (CStaticSplitterWnd*)splitterwnd->GetPane(1,0);
	CExploreView *view = (CExploreView*)spli2->GetPane(1,0);
	
	ItemList *item = (ItemList*)GetItemData(m_selectIndex);
	
	if (!item->isRead)
	{
		item->isRead = true;
		DBSetItemRead(item->id,db);
		LVITEM pitem;
		memset(&pitem,0,sizeof(pitem));
		pitem.iItem = m_selectIndex;
		pitem.iSubItem = 0;
		pitem.mask = LVIF_IMAGE;
		
		pitem.iImage = 1;
		SetItem(&pitem);
	}

	char *dir = new char[255];
	int length = 255;
	::GetModuleFileName(AfxGetInstanceHandle(),dir,length);
	for (int i=length-1;i;i--)
	{
		if (dir[i-1]=='\\')
		{
			dir[i] = '\0';
			length = i;
			break;
		}
	}
	strcat(dir,"//description.html");

	CFile tempHtmlFile(dir,CFile::modeCreate|CFile::modeWrite);
	char *p = "<html>"
"<head>"
"<meta http-equiv=\"Content-type\" content=\"text/html; charset=gb2312\">"
"<style type=\"text/css\">"
"	td,p,li,input,select,div,span {font-size:12px;}"
"	table,td,img,div,span{border: none;margin: 0px 0px 0px 0px;padding: 0px 0px 0px 0px;}"
"	.f10 {font-size: 10px;}"
"	.f12 {font-size: 12px;}"
"	.f14 {font-size: 14px;}"
"	.f16 {font-size: 16px;}"
"	.lh17 {line-height:17px;}"
"	.lh19 {line-height:19px;}"
"	A:link {color:#00f;}"
"	A:visited {color:#800080;}"
"	A:active {color:#f00;}"
"	A:hover {color:#f00;}"
"	.tree a:link {text-decoration: none;color:#025EA7;font-weight: bold;}"
"	.tree a:visited {text-decoration: none;color:#025EA7;font-weight: normal;}"
"	.tree a:active,.tree a:hover {text-decoration: none;color:#CC0000;}"
"	.tree {color:#222;line-height:19px;width:96%;text-align:left;}"
"	.tree #channel{font-size:16px;font-weight:bold;color:#005FAB;text-align:center;padding:10px 0 10px 0;border:1px solid #AECBDB;border-top:5px solid #015FA9;clear:both;margin-bottom:5px;margin-top:5px;background-color:#F3F7F8;}"
"	.tree #block{margin-bottom:5px;border:1px solid #AECBDB;background-color:#fff;clear:both;}"
"	.tree #title{font-weight:bold;font-size:14px;clear:both;padding:7px 0 5px 5px;background-color:#F3F7F8;margin-bottom:7px;color:#025EA7;}"
"	.tree #author{color:#808080;float:left;}"
"	.tree #time{color:#808080;float:right;}"
"	.tree #description{clear:both;}"
"	.tree #readall{text-align:right;font-weight:bold;color:#025EA7;}"
"	.tree #readall a{text-decoration:underline;font-weight: bold;}"
"	.subBlk{padding:7px 10px 7px 10px;}"
"</style>"
"<script language='javascript' type='text/javascript'>"
"function NoError()"
"{"
"   return true;"
"}"
"window.onerror = NoError;"
"</script>"
"</head>"
"<body bgcolor=#DAE5E9 topmargin=5 marginheight=5 leftmargin=5 marginwidth=5>"
"<center>"
"<div id='list' class='tree'>"
"	<div id='block'>"
		"<div id='title'>·<a href='";
	tempHtmlFile.Write(p,strlen(p));
	tempHtmlFile.Write(item->url,strlen(item->url));
	p = "'>";
	tempHtmlFile.Write(p,strlen(p));
	tempHtmlFile.Write(item->title,strlen(item->title));
	p  = "</a><div>"
		"<div class='subBlk'>"
		"<div id='author'>";
	tempHtmlFile.Write(p,strlen(p));
	tempHtmlFile.Write(item->author,strlen(item->author));
	p = "</div>"
		"<div id='time'>";
	tempHtmlFile.Write(p,strlen(p));
	tempHtmlFile.Write(item->time,strlen(item->time));
	p = "</div><div id='description'>";
	tempHtmlFile.Write(p,strlen(p));
	tempHtmlFile.Write(item->description,strlen(item->description));
	p = "</div><div id='readall'><a href='";
	tempHtmlFile.Write(p,strlen(p));
	tempHtmlFile.Write(item->url,strlen(item->url));
	p = "'>[阅读全文]</a></div></div></div></center></body></html>";
	tempHtmlFile.Write(p,strlen(p));
	view->Navigate(dir);
}

void CItemList::onAddCollection(){
	CMainFrame *frm = (CMainFrame*)AfxGetMainWnd();
	CChannelListView *view = (CChannelListView*)frm->m_spli1.GetPane(0,0);
	DirNode node("");
	DirNode *select = &node;
	CAddToCollectionDlg *dlg = new CAddToCollectionDlg(view->getCollectTreeRootData(),&select,NULL);
	if(dlg->DoModal()==0)
	{
		char c;
		char *name = &c;
		CGetCollectionNameDlg *dlg2 = new CGetCollectionNameDlg(&name);
		if (dlg2->DoModal()==IDOK)
		{
			ItemList *item = (ItemList*)this->GetItemData(m_selectIndex);
			CollectionNode *node = new CollectionNode(name,item->url,MyTreeNode::nextID++);
			node->nextSubling = select->firstChild;
			select->firstChild = node;
			DBInsertItem(select,node,db);
			view->addCollection(select,node);
		}
	}
	
}

int CItemList::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CListCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here

	
	
	m_imageList.Create(16,16,ILC_COLOR32,0,4);
	char* names[] = {"未读.bmp","已读.bmp"};
	buildImageList(&m_imageList,names,2);
	this->SetImageList(&m_imageList,LVSIL_SMALL);

	return 0;
}

//点击列头,排序
void CItemList::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	MyData *data = new MyData;
	
	int i = pNMListView->iSubItem;
	if (i==this->m_sortCol)
	{
		this->asc = !this->asc;
	}
	this->m_sortCol = i;
	data->seq = this->asc;
	data->isub = i;

	//this->SortItems(CompareFunc,(DWORD)data);

	CMainFrame *mainframe = (CMainFrame*)AfxGetMainWnd();
	mainframe->sortItem(this->m_sortCol,asc);
	*pResult = 0;
}

void CItemList::sort(int type,int asc){
	if (type!=-1)
	{
		this->m_sortCol = type;
	}
	if (asc!=-1)
	{
		this->asc = asc;
	}

	MyData *data = new MyData;
	data->seq = this->asc;
	data->isub = this->m_sortCol;
	this->SortItems(CompareFunc,(DWORD)data);
}

void CItemList::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult){
	//类型安全转换   
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);   
    *pResult = 0;   
       
    //指定列表项绘制前后发送消息   
    if(CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage)   
    {   
        *pResult = CDRF_NOTIFYITEMDRAW;   
    }   
    else if(CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage)   
    {   
        //奇数行   
        if(pLVCD->nmcd.dwItemSpec % 2)   
            pLVCD->clrTextBk = RGB(222,222,222);   
        //偶数行   
        else  
            pLVCD->clrTextBk = RGB(255, 255, 255);   
        //继续   
        *pResult = CDRF_DODEFAULT;   
    }  
}

⌨️ 快捷键说明

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