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

📄 mainfrm.cpp

📁 离线的RSS阅读器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "DiamondReader.h"
#include "SkinFeature.h"

#include "MainFrm.h"
#include "ChannelListView.h"
#include "ExploreToolView.h"
#include "ExploreView.h"
#include "ItemListView.h"
#include "StaticSplitterWnd.h"
#include "DiamondReaderDoc.h"
#include "ToolBarView.h"
#include <afxwin.h>
#include "NewChannelDlg.h"
#include "NewCategory.h"
#include "db.h"
#include "SearchDlg.h"
#include "helper.h"
#include "xml.h"
#include "ModifyCategoryDlg.h"


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

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
	ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
	ON_COMMAND(ID_FILE_EXIT, OnFileExit)
	ON_COMMAND(ID_CATEGORY_NEW, OnCategoryNew)
	ON_COMMAND(ID_CHANNEL_NEW, OnChannelNew)
	ON_COMMAND(ID_CATEGORY_DELETE, OnCategoryDelete)
	ON_COMMAND(ID_CATEGORY_MODIFY, OnCategoryModify)
	ON_COMMAND(ID_RSS_VIEW,onShowChannel)
	ON_COMMAND(ID_RSS_UPDATE,onUpdateChannel)
	ON_COMMAND(ID_RSS_DELETE,onDeleteChannel)
	ON_COMMAND(ID_RSS_SEARCH,onSearchChannel)
	ON_COMMAND(ID_CATEGORY_SEARCH, OnCategorySearch)
	ON_COMMAND(ID_UPDATEALL,OnUpdateALL)
	ON_UPDATE_COMMAND_UI(ID_CATEGORY_NEW, OnUpdateTreeSelect)
	ON_UPDATE_COMMAND_UI(ID_RSS_DELETE, OnUpdateRss)
	ON_UPDATE_COMMAND_UI(ID_CATEGORY_SEARCH, OnUpdateChannelAndCategory)
	ON_COMMAND(ID_CHANNEL_SORT_AUTHOR, OnChannelSortAuthor)
	ON_COMMAND(ID_CHANNEL_SORT_DOWN, OnChannelSortDown)
	ON_COMMAND(ID_CHANNEL_SORT_TITLE, OnChannelSortTitle)
	ON_COMMAND(ID_CHANNEL_SORT_UP, OnChannelSortUp)
	ON_COMMAND(ID_CHANNEL_SORT_TIME, OnChannelSortTime)
	ON_WM_CLOSE()
	ON_UPDATE_COMMAND_UI(ID_CATEGORY_DELETE, OnUpdateTreeSelect)
	ON_UPDATE_COMMAND_UI(ID_CATEGORY_MODIFY, OnUpdateTreeSelect)
	ON_UPDATE_COMMAND_UI(ID_CHANNEL_NEW, OnUpdateTreeSelect)
	ON_UPDATE_COMMAND_UI(ID_RSS_UPDATE, OnUpdateRss)
	ON_COMMAND(ID_CATEGORY_NEW_ROOT, OnCategoryNewRoot)
	//}}AFX_MSG_MAP
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()
{
	// TODO: add member initialization code here

	gszFile = new char[255];
	int length = 255;
	//获取当前模块的地址
	::GetModuleFileName(AfxGetInstanceHandle(),gszFile,length);
	int ii = GetLastError();
	//去掉文件名,得到当前目录
	for (int i=length-1;i;i--)
	{
		if (gszFile[i-1]=='\\')
		{
			gszFile[i] = '\0';
			length = i;
			break;
		}
	}

	strcat(gszFile,"diamondReader.db");
	
	//打开数据库连接
	sqlite3_open(gszFile,&db);

	sqlite3_open(gszFile,&channelDB);

	//获取可用的id,目录和频道id
	MyTreeNode::nextID = getMaxID(db)+1;
	ItemList::nextID = getMaxItemID(db)+1;
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	HBITMAP h = (HBITMAP)::LoadImage(NULL,TEXT("C:\\2.bmp"),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
	CBitmap bmp;
	//bool b = bmp.Attach(h);
	CMenu *mmenu = GetMenu();
	CMenu *submenu = mmenu->GetSubMenu(0);
	//b = submenu->SetMenuItemBitmaps(0,MF_BYPOSITION,&bmp,&bmp);
	::SetMenuItemBitmaps(submenu->m_hMenu,0,MF_BYPOSITION,h,h);

	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
	}
	
	typedef struct tagMENUINFO {
	  DWORD   cbSize;
	  DWORD   fMask;
	  DWORD   dwStyle;
	  UINT    cyMax;
	  HBRUSH  hbrBack;
	  DWORD   dwContextHelpID;
	  DWORD  dwMenuData;
	} MENUINFO, FAR *LPMENUINFO;
typedef MENUINFO CONST FAR *LPCMENUINFO; 

	typedef BOOL (WINAPI* GETMENUINFO)(HMENU hmenu,const LPMENUINFO lpcmi);  
	typedef BOOL (WINAPI* SETMENUINFO)(HMENU hmenu,const LPMENUINFO lpcmi); 
    GETMENUINFO pfGetMenuInfo=(GETMENUINFO)::GetProcAddress(LoadLibrary(TEXT("USER32")),"GetMenuInfo");   
	MENUINFO info;
	memset(&info,0,sizeof(MENUINFO));
	info.cbSize = sizeof(MENUINFO);
	pfGetMenuInfo(mmenu->m_hMenu,&info);
	info.hbrBack = ::CreateSolidBrush(RGB(222,222,222));
	info.fMask = MIM_BACKGROUND |  MIM_APPLYTOSUBMENUS;
	SETMENUINFO pfSetMenuInfo = (SETMENUINFO)::GetProcAddress(LoadLibrary(TEXT("USER32")),"SetMenuInfo");
	pfSetMenuInfo(mmenu->m_hMenu,&info);
	
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;

}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){
	//分割窗口
	//获取客户区大小
	CRect rect;
	this->GetClientRect(&rect);

	//创建分割窗口
	//分割工具栏和其他
	m_spli4.CreateStatic(this,2,1);
	m_spli4.CreateView(0,0,RUNTIME_CLASS(CToolBarView),CSize(rect.right-rect.left,25),pContext);
	m_spli1.CreateStatic(&m_spli4,1,2,WS_CHILD|WS_VISIBLE,m_spli4.IdFromRowCol(1,0));
	if (m_spli1.m_hWnd)
	{
		//分割左边的tab
		m_spli1.CreateView(0,0,RUNTIME_CLASS(CChannelListView),CSize(200,rect.bottom-rect.top),pContext);
		m_spli2.CreateStatic(&m_spli1,2,1,WS_CHILD|WS_VISIBLE,m_spli1.IdFromRowCol(0,1));
	}
	if (m_spli2.m_hWnd)
	{
		//分割右上方的list
		m_spli2.CreateView(0,0,RUNTIME_CLASS(CItemListView),CSize(rect.right-rect.left-200,200),pContext);
		m_spli3.CreateStatic(&m_spli2,2,1,WS_CHILD|WS_VISIBLE ,m_spli2.IdFromRowCol(1,0));
	}
	if (m_spli3.m_hWnd)
	{
		//分割右下方的工具栏和浏览页面
		m_spli3.CreateView(0,0,RUNTIME_CLASS(CExploreToolView),CSize(rect.right-rect.left-200,25),pContext);
		m_spli3.CreateView(1,0,RUNTIME_CLASS(CExploreView),CSize(rect.right-rect.left-200,rect.bottom-rect.top-225),pContext);
	}

	InitializeSkin();
    LoadSkinFile("skins\\jarilo.rss");

	
	return true;
}

//导入文件
void CMainFrame::OnFileImport() 
{
	// TODO: Add your command handler code here
	CFileDialog *fd = new CFileDialog(true,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_EXPLORER,TEXT("opml files (*.opml)|*.opml|All files (*.*)|*.*||"));
	if (fd->DoModal()==IDOK)
	{
		
		CString path = fd->GetPathName();
		MyTreeNode * root = XMLLoadOPML((LPTSTR)(LPCTSTR)path);

		CChannelListView *view = (CChannelListView*)m_spli1.GetPane(0,0);
		view->rebuildChannelList(root);
		AfxBeginThread((AFX_THREADPROC)DBImportChannelList,(void*)root);
		/*DBImportChannelList(root);*/
	}
}

//导出文件
void CMainFrame::OnFileExport() 
{
	// TODO: Add your command handler code here
	CFileDialog *fd = new CFileDialog(FALSE,"opml",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,TEXT("opml files (*.opml)|*.opml|All files (*.*)|*.*||"));
	if (fd->DoModal()==IDOK)
	{
		CString path = fd->GetPathName();
		CChannelListView *view = (CChannelListView*)m_spli1.GetPane(0,0);
		MyTreeNode *result = view->getChannelRoot();
		XMLsaveOPML((LPTSTR)(LPCTSTR)path,(DirNode*)result);
	}
	
	
}

//退出
void CMainFrame::OnFileExit() 
{
	// TODO: Add your command handler code here
	/*::PostQuitMessage(0);*/
	CFrameWnd::OnClose();
}

//添加分类
void CMainFrame::OnCategoryNew() 
{
	// TODO: Add your command handler code here
	
	char c;
	char *name = &c;
	CNewCategory nc(&name);

	char *pbuff = NULL;

	if (nc.DoModal()==1)
	{
		//获取分类名,保存在name中
		CChannelListView *view = (CChannelListView*)m_spli1.GetPane(0,0);
		GetMBCSString(&pbuff,name);
		view->addCategory(name);
		delete name;
	}
}

//新建频道
void CMainFrame::OnChannelNew() 
{
	// TODO: Add your command handler code here
	char c;
	char *url = &c;
	CNewChannelDlg cnc(&url);
	if (cnc.DoModal()==1)
	{
		//返回请求的XML的地址,保存在*URL中
		

⌨️ 快捷键说明

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