📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "BeeReader.h"
#include "MainFrm.h"
#include "BeeReaderView.h"
#include "ItemFrameWnd.h"
#include "HtmlFrameWnd.h"
#include "NewsGroup.h"
#include "CreateGroupDlg.h"
#include "CreateChannelSheet.h"
#include "ChannelPropSheet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CXTFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CXTFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(IDM_VIEW_HIDELIST, OnViewHidelist)
ON_UPDATE_COMMAND_UI(IDM_VIEW_HIDELIST, OnUpdateViewHidelist)
ON_COMMAND(ID_TBMENU_IMPORT, OnTbmenuImport)
ON_COMMAND(IDM_FILE_NEWGROUP, OnFileNewgroup)
ON_COMMAND(IDM_FILE_NEWCHANNEL, OnFileNewchannel)
ON_COMMAND(IDM_TOOLS_DEL_GROUP, OnToolsDelGroup)
ON_COMMAND(IDM_REMOVE_CHANNEL, OnRemoveChannel)
ON_COMMAND(IDM_REMOVE_GROUP, OnRemoveGroup)
ON_WM_TIMER()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_COMMAND(IDM_CHANNEL_PROP, OnChannelProp)
ON_UPDATE_COMMAND_UI(IDM_CHANNEL_PROP, OnUpdateChannelProp)
ON_COMMAND(IDM_RENAME, OnRename)
ON_COMMAND(IDM_TOOLS_OPTION, OnToolsOption)
ON_COMMAND(IDM_TREE_VIEWRSSFEED, OnTreeViewrssfeed)
ON_UPDATE_COMMAND_UI(IDM_TREE_VIEWRSSFEED, OnUpdateTreeViewrssfeed)
ON_COMMAND(IDM_CHANNEL_UPDATEALL, OnChannelUpdateall)
ON_COMMAND(IDM_CHANNEL_UPDATE, OnChannelUpdate)
ON_WM_SIZE()
ON_UPDATE_COMMAND_UI(IDM_CHANNEL_UPDATE, OnUpdateChannelUpdate)
ON_UPDATE_COMMAND_UI(IDM_CHANNEL_UPDATEALL, OnUpdateChannelUpdateall)
ON_COMMAND(IDM_VIEW_RSSNAV, OnViewRssnav)
ON_UPDATE_COMMAND_UI(IDM_VIEW_RSSNAV, OnUpdateViewRssnav)
ON_COMMAND(IDM_VIEW_BROWSER, OnViewBrowser)
ON_UPDATE_COMMAND_UI(IDM_VIEW_BROWSER, OnUpdateViewBrowser)
ON_UPDATE_COMMAND_UI(IDM_REMOVE_CHANNEL, OnUpdateRemoveChannel)
ON_UPDATE_COMMAND_UI(IDM_REMOVE_GROUP, OnUpdateRemoveGroup)
ON_UPDATE_COMMAND_UI_RANGE(IDM_LIST_FLAGREAD,IDM_LIST_FLAGS_04,OnMarkAllItem)
ON_UPDATE_COMMAND_UI_RANGE(IDM_LIST_DELETE_01,IDM_LIST_DELETE_06,OnRemoveItem)
ON_UPDATE_COMMAND_UI_RANGE(IDM_LIST_FILTER_01,IDM_LIST_FILTER_10,OnFilterItem)
ON_UPDATE_COMMAND_UI_RANGE(IDM_LIST_SORTS_01,IDM_LIST_SORTS_04,OnSortItem)
ON_UPDATE_COMMAND_UI(IDM_LIST_BROWSE, OnUpdateListBrowse)
ON_UPDATE_COMMAND_UI(IDM_LIST_VIEW, OnUpdateListView)
//}}AFX_MSG_MAP
ON_MESSAGE( WM_RSS_READ_STATUS,OnReader)
ON_MESSAGE(WM_NEWSTREEITEMCHANGE, OnNewsTreeItemChange)
ON_MESSAGE( WM_SUSPEND_WRITER,OnSuspendWriterThread)
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// Enable/Disable XP GUI Mode
xtAfxData.bXPMode = TRUE;
// Enable/Disable Menu Shadows
xtAfxData.bMenuShadows = TRUE;
// TODO: add member initialization code here
m_bHideListView = FALSE;
m_bHideBrowser = FALSE;
m_bCreate = FALSE;
bDeleteGroup = TRUE;
m_WorkingChannel = NULL;
m_iSuspendWriterThread = -1;
m_bCloseSystem = FALSE;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CXTFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndMenuBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndMenuBar.LoadMenuBar(IDR_MAINFRAME))
{
TRACE0("Failed to create menubar\n");
return -1; // fail to create
}
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT|TBSTYLE_LIST, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_TOOLBAR_MAIN))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
m_wndToolBar.SetWindowText( _T( "标准工具栏" ) );
InitializeToolbar();
// m_wndToolBar.AddDropDownButton(ID_TBMENU_IMPORT,IDR_TBMENU_IMPORT,TRUE);
m_wndToolBar.SetHeight(30);
// Create the workspace bar.
if( !m_wndTabDockBar.Create(this, IDW_TABDOCKBAR, _T("频道树窗口"),
CSize(300, 150), CBRS_LEFT,CBRS_XT_DEFAULT))
{
TRACE0("Failed to create workspace dock window\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndMenuBar.EnableDockingEx(CBRS_ALIGN_ANY, CBRS_XT_ALL_FLAT);
m_wndToolBar.EnableDockingEx(CBRS_ALIGN_ANY, CBRS_XT_ALL_FLAT);
m_wndTabDockBar.EnableDockingEx(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT, CBRS_XT_ALL_FLAT|CBRS_XT_GRIPPER_GRAD);
EnableDockingEx(CBRS_ALIGN_ANY, CBRS_XT_ALL_FLAT);
DockControlBar(&m_wndMenuBar);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndTabDockBar);
// TODO: Remove this line if you don't want cool menus.
InstallCoolMenus(IDR_MAINFRAME);
//TODO:设置RSSManager参数.
CBeeReaderApp* pApp = (CBeeReaderApp*)AfxGetApp();
ASSERT(pApp);
pRSSManager = pApp->GetRSSManager();
ASSERT(pRSSManager);
pRSSManager->GetReader()->SetCallbackHandle( GetSafeHwnd() );
pRSSManager->GetWriter()->SetCallbackHandle( GetSafeHwnd() );
pRSSManager->SetSuspend_Writer_Thread(GetSafeHwnd());
InitGroup();
//TODO:My Work...
InitList();
uTimer = SetTimer(1, 1000, 0);
return 0;
}
void CMainFrame::InitializeToolbar()
{
m_imageListTB1.Create(16, 16, ILC_COLOR24|ILC_MASK, 7, 1);
m_bitmap.LoadBitmap(IDB_MAINTOOL);
m_imageListTB1.Add(&m_bitmap, RGB(255,0,255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&m_imageListTB1);
m_wndToolBar.SetButtonText(m_wndToolBar.CommandToIndex(IDR_ADD), _T("刷新频道"));
m_wndToolBar.SetButtonText(m_wndToolBar.CommandToIndex(IDR_REMOVE), _T("添加频道"));
m_wndToolBar.SetButtonText(m_wndToolBar.CommandToIndex(IDR_UPDATE), _T("移去频道"));
m_wndToolBar.SetButtonText(m_wndToolBar.CommandToIndex(IDR_AUTODISCOVER), _T("智能发现"));
if (!m_CobSearch.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWN|WS_CLIPCHILDREN,
CRect(0,0,150,150), &m_wndToolBar, IDR_COB_SEARCH ))
{
TRACE0("Failed to create combo box.\n");
return ; // fail to create
}
m_wndToolBar.InsertControl(&m_CobSearch);
if (!m_CobFilter.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|WS_CLIPCHILDREN,
CRect(0,0,150,180), &m_wndToolBar, IDR_COB_FILTER ))
{
TRACE0("Failed to create combo box.\n");
return ; // fail to create
}
m_CobFilter.AddString(_T("所有取回的项"));
m_CobFilter.AddString(_T("今天取回的项"));
m_CobFilter.AddString(_T("昨天取回的项"));
m_CobFilter.AddString(_T("前三天取回的项"));
m_CobFilter.AddString(_T("星期内取回的项"));
m_CobFilter.AddString(_T("月内取回的项"));
m_CobFilter.AddString(_T("所有已读的项"));
m_CobFilter.AddString(_T("所有未读的项"));
m_CobFilter.AddString(_T("重要标记的项"));
m_CobFilter.AddString(_T("非重要标记的项"));
m_CobFilter.SetCurSel(0); //
m_wndToolBar.InsertControl(&m_CobFilter);
// Resize the toolbar to accommodate for the text we just added.
m_wndToolBar.AutoSizeToolbar();
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~FWS_ADDTOTITLE;
cs.lpszName = _T("BeeReader 0.9(Beta)");
if( !CXTFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
// Helps to reduce screen flicker.
cs.lpszClass = AfxRegisterWndClass(0, NULL, NULL,
AfxGetApp()->LoadIcon(IDR_MAINFRAME));
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CXTFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CXTFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
m_wndSplit.CreateStatic(this, 2, 1);
m_wndSplit.CreateView(0,0,RUNTIME_CLASS(CBeeReaderView), CSize(175, 200), pContext);
m_wndSplit.CreateView(1,0, RUNTIME_CLASS(CHtmlFrameWnd), CSize(175, 500), pContext);
// Activate tree view pane.
// SetActiveView( (CView*)m_wndSplit.GetPane(0,0));
RecalcLayout();
return TRUE;
//return CXTFrameWnd::OnCreateClient(lpcs, pContext);
}
CListCtrl* CMainFrame::GetListCtrl()
{
// CItemFrameWnd* pFrame = (CItemFrameWnd*)m_wndSplit.GetPane(0,0);
// ASSERT(pFrame);
//CBeeReaderView* pView = (CBeeReaderView*)pFrame->GetActiveView();
CBeeReaderView* pView = (CBeeReaderView*)m_wndSplit.GetPane(0,0);
ASSERT(pView);
return (CListCtrl*)pView;
}
void CMainFrame::InitList()
{
}
void CMainFrame::OnTbmenuImport()
{
// TODO: Add your command handler code here
}
BOOL CMainFrame::InitGroup()
{
PCHANNELDATA pData = NULL;
CRSSChannel* pChannel = NULL;
CString szCachePath;
CNewsGroup* pGroupData;
CBeeReaderApp* pApp = (CBeeReaderApp*)AfxGetApp();
ASSERT(pApp);
pGroupData = pApp->GetNewsGroup();
PGROUPNODE pChannelNode = pGroupData->GetRootNode()->pNextSibling;
while( pChannelNode )
{
pData = (PCHANNELDATA)pChannelNode->dwData;
pChannel = pData->pChannel;
//程序启动后第一次刷新所有的频道.
if( pChannel )
{
pChannel = pRSSManager->AddChannel( pChannel, pData->szLink );
GetNewsTree()->SendMessage(WM_UPDATE_CHANNEL,1,(LPARAM)pChannel);
GetNewsTree()->SendMessage(WM_UPDATE_ITEMCOUNT,0,(LPARAM)pChannel);
}
pChannelNode = pChannelNode->pNextNode;
}
return TRUE;
}
void CMainFrame::OnFileNewgroup()
{
// TODO: Add your command handler code here
CTabTreeCtrl* pTree = GetNewsTree();
ASSERT(pTree);
HTREEITEM htSelect = pTree->GetSelectedItem();
if( htSelect )
{
PGROUPNODE pNode = (PGROUPNODE)pTree->GetItemData( htSelect );
if( pNode->dwData != 0 ) //如选中的是频道,则取父项。
htSelect = pTree->GetParentItem(htSelect);
CCreateGroupDlg cgd( (PGROUPNODE)pTree->GetItemData(htSelect) );
if( cgd.DoModal() == IDOK )
{
CBeeReaderApp* pApp = (CBeeReaderApp*)AfxGetApp();
ASSERT(pApp);
CNewsGroup* pNewsGroup = pApp->GetNewsGroup();
ASSERT(pNewsGroup);
pNode = pNewsGroup->Insert( cgd.GetParentNode(),NULL,cgd.GetGroupName(),0);
if( pNode )
{
pTree->InsertGroup( cgd.GetParentNode(),pNode );
}
}
}
}
//////////////////////////////////////////////////////////////////////////////
/// 频道刷新信息处理函数
//////
LRESULT CMainFrame::OnReader(WPARAM wParam, LPARAM lParam)
{
CRSSChannel* pChannel = (CRSSChannel* )lParam;
CTabTreeCtrl* pNewsTree = GetNewsTree();
int iCode = (int)LOWORD(wParam);
switch( iCode )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -