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

📄 mainfrm.cpp

📁 beereader source code
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -