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