65.9K
CodeProject 正在变化。 阅读更多。
Home

BasicAdmin - 个人组织者

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.94/5 (13投票s)

2009年8月1日

CPOL

6分钟阅读

viewsIcon

53646

downloadIcon

5612

财务、联系人、笔记组织器

Imagen

引言

网上有很多财务管理程序。但它们缺少我需要的功能。快捷方式、快速过滤、分层账户结构、速度。所以最后我决定自己写一个。这可能看起来像是在重新发明轮子(又一个财务经理程序)。另一方面,这也是一个学习的机会,而且我已经拥有了构建它的大部分组件。

程序

该实用程序是一个使用功能包的 MFC 程序。它还使用了 CodeProject 的许多控件。它将数据存储在 SQLite 数据库中。它被编译成从 Windows 2000 开始即可运行(据我所知没有依赖项)。可以通过 PE Explorer 更改版本、添加 *GDIPlus.dll* 和代码中的一些函数来修改以适用于 Win9x。

它有自己的帮助,但还没有英文版本。
我已禁用了一些功能

  • 从网络获取/上传:我有一个网页,可以访问 SQL Server 数据库。我无法在 Web 服务器上编写。因此,我可以通过 HTTP 保存和检索数据。所有数据库都经过加密并放入文本字段。
  • 密码/安全:该实用程序使用密码提供非常基本的保护。您可以在 *BasicAdmin.cpp* 中启用/禁用它。

结构

代码是直接编写的。没有经过深思熟虑。我根据需要添加了功能。这段代码不应被视为教程。它也不是一篇文章。我发布它是为了感谢我从 CodeProject 使用了很多代码。代码的总体结构是

Imagen

我修改了原始代码以在文章中上传。SQLite 和 Crypto++ 在原始代码中是独立的 DLL。这是为了加快完整编译速度。
另外,“*Graph*”目录中的代码是一个较大项目(也称为 Graph)的子集,该项目与此项目静态链接,这也是为了加快编译速度。

使用 VS 2008 编译会带有警告。

功能

这个项目实现了许多通常在许多项目中都需要的功能

  • 快速搜索
  • 添加、修改、删除
  • 打印
  • 树管理
  • 屏幕缩放
  • 数据库管理
  • 加密(安全)
  • 帮助

另一方面,这些功能并不是以正确性为重。它的实现考虑了时间(我没有多少时间)和功能。

设计与理念

Explorer 视图

我一直很喜欢 Explorer 的工作方式。左侧是树形窗格,右侧是视图窗格。原因很简单

  • 人们习惯了 Explorer 的工作方式
  • 它允许组织大量项目
  • 它并不复杂

有许多其他程序也这样工作:Visual Studio、SQL Server Manager 等等。所以,我在这里(某种程度上)复制了这种功能。如果您点击树中的一个文件夹,您将在右侧窗格中看到其子项的列表,直到达到没有子项的项目。

单点击访问

我不喜欢“隐藏”在屏幕内的功能。例如,要转到 screen4。Screen1 调用 Screen2 调用 Screen3 调用 Screen4。所以,如果可能,每个屏幕都应该可以直接从树访问。

屏幕使用

数据视图(网格)应使用所有可用空间。毕竟,数据视图是您最常用的屏幕之一。因此,它应该随着应用程序一起调整大小。其列也应调整大小。网格应显示所有加载的数据。

网格和筛选

网格应该很快。它应该快速过滤数据。问题是,当您想要过滤时,您必须访问数据库。但是,如果您已经加载了所有数据,为什么要访问数据库呢?因此,您可以直接在网格中过滤数据(将不匹配过滤器的行设为不可见)。添加项目时,您也可以将其添加到列表中(无需重新查询数据库)。这虽然会使代码稍微复杂一些,但可以大大提高性能和响应速度。

图形

我真的很喜欢 Office 2007 的外观。VS 2008 提供了功能包。那么,为什么不使用它呢?为了保持颜色一致,我必须为背景、按钮、网格等添加代码。

速度

我通常不喜欢输入数据。当我需要数据时,应该很容易获取。因此,该实用程序具有

  • 系统托盘最小化模式
  • 快速过滤(再次)
  • 快捷方式
  • 少量字段(列)

代码

代码中有几个部分可以用于解决不同的问题。例如

为背景着色并避免灰色静态控件

BEGIN_MESSAGE_MAP(CFrmCashManTotals, CDialog)
	ON_WM_CTLCOLOR()
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
HBRUSH CFrmCashManTotals::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	int nID = pWnd->GetDlgCtrlID();

	switch (nID)
    {
	case LBLFROM2:case LBLFROM3: case LBLACC: case LBLORDEN:
			pDC->SetBkMode(OPAQUE);
			pDC->SetBkColor(DarColor());
			return (HBRUSH) GetStockObject(NULL_BRUSH);
	}
	return hbr;
}
BOOL CFrmCashManTotals::OnEraseBkgnd(CDC* pDC)
{
	CRect rect;
	GetClientRect(&rect);
	pDC->FillSolidRect(0,0,rect.Width(),rect.Height(),DarColor());
	return TRUE;
}

其中 `DarColor` 根据应用程序外观获取正确的颜色

const COLORREF TemaCeleste            = RGB(227,239,255);
const COLORREF TemaPlateado           = RGB(240,241,242);
const COLORREF TemaNegro              = RGB(220,222,224);
const COLORREF TemaAqua               = RGB(195,202,217);
static COLORREF DarColor()
{
	switch (theApp.m_nAppLook)
	{
		case ID_VIEW_APPLOOK_OFF_2007_BLUE: return TemaCeleste;
		case ID_VIEW_APPLOOK_OFF_2007_BLACK: return TemaNegro;
		case ID_VIEW_APPLOOK_OFF_2007_SILVER: return TemaPlateado;
		case ID_VIEW_APPLOOK_OFF_2007_AQUA: return TemaAqua;
	}
}

打印

void CFrmAccounts::OnBnClickedBtnPrint2()
{
	CMainFrame* pDato = (CMainFrame*)(AfxGetMainWnd( ));
	::SetWindowLong(this->m_hWnd, GWL_ID, 0);
	CCreateContext context;
	context.m_pNewViewClass=RUNTIME_CLASS(CViewPrintPreview);
	context.m_pCurrentDoc=NULL;
	context.m_pNewDocTemplate=NULL;
	context.m_pLastView=NULL;
	context.m_pCurrentFrame=NULL;
	CViewPrintPreview* pviewpreview = 
		(CViewPrintPreview*)pDato->CreateView(&context);
	pviewpreview->pant = this;
	pviewpreview->m_pCtrl=&m_grid;
	pDato->SetActiveView(pviewpreview);	
	pviewpreview->OnFilePrintPreview();
	ShowWindow(SW_HIDE);
}

并在关闭时,切换回旧视图

void CViewPrintPreview::OnEndPrintPreview
	(CDC* pDC, CPrintInfo* pInfo, POINT point, CPreviewView* pView) 
{
	CView::OnEndPrintPreview(pDC, pInfo, point, pView);
	// Show the original frame
	CMainFrame* pDato = (CMainFrame*)(AfxGetMainWnd( ));
	pDato->CambiarCantRows(nrows);
	pant->ShowWindow(SW_SHOW);
	pDato->SetActiveView((CView*)pant, TRUE);
	pant->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
	this->DestroyWindow();
}

这里最重要的几行是

::SetWindowLong(this->m_hWnd, GWL_ID, 0);
pant->SetDlgCtrlID(AFX_IDW_PANE_FIRST); 

功能包

我修改了功能区(使其不显示 orb),Outlook 控件(使其不显示按钮)和标题栏(多行文本)。为此,我创建了继承自功能包类的类,并重写了方法。

自定义功能区

class CCustRibbon: public CMFCRibbonBar
{
	BOOL OnShowRibbonContextMenu
		(CWnd* pWnd, int x, int y, CMFCRibbonBaseElement* pHit);
};

BOOL CCustRibbon::OnShowRibbonContextMenu
		(CWnd* pWnd, int x, int y, CMFCRibbonBaseElement* pHit)
{
	return TRUE;
}

Outlook 栏

class CControlOutLook: public CMFCOutlookBarTabCtrl
{
public:
	CMFCOutlookBarToolBar* GetToolBar();
	DECLARE_MESSAGE_MAP()
	void RecalcLayout();
};

CMFCOutlookBarToolBar* CControlOutLook::GetToolBar()
{
	return &m_wndToolBar;
}
void CControlOutLook::RecalcLayout()
{
	ShowWindow(SW_HIDE);
	CMFCOutlookBarTabCtrl::RecalcLayout();
	GetToolBar()->EnableCustomizeButton(FALSE, 0, _T(""), FALSE);
	GetToolBar()->Invalidate();
	ShowWindow(SW_SHOW);
}

标题栏

class CBarraOutLook: public CMFCCaptionBar
{
protected:
	void OnDrawText(CDC* pDC,CRect rect,const CString& strText);
	DECLARE_MESSAGE_MAP()
public:
	CBarraOutLook();
	int AltoTexto;
	void OnSize(UINT nType, int cx, int cy);
	
	//afx_msg void CBarraOutLook::OnNcCalcSize
	// (BOOL bCalcValidRects,NCCALCSIZE_PARAMS* lpncsp);
};

void CBarraOutLook::OnDrawText(CDC* pDC,CRect rect,const CString& strText)
{
	CString dato = strText;
	LPSTR valor = dato.GetBuffer();

	CRect rectdato;
	GetClientRect(&rectdato);

	rect.top = rectdato.top + 9;
	AltoTexto = pDC->DrawTextEx(valor, dato.GetLength(), 
				rect, DT_NOCLIP | DT_WORDBREAK, NULL);
	AltoTexto +=  14;
	
	dato.ReleaseBuffer();

}

我确定一定有更简单的方法来“定制”功能包控件。但我找不到。

参考文献

引用的文章在“关于”屏幕中。我修改了一些代码并对其中一些进行了更正。

其他个人理财软件

SourceForge 上有许多许多优秀的复式记账财务管理程序,如 GNUCashMoney Manager Ex。SourceForge 甚至还有一个个人理财类别。
在自己编写之前,您应该先查看一下。如果您发现喜欢的,可以使用它,甚至可以贡献。

但是,正如您已经知道的,在使用软件时需要考虑很多“因素”

  • 编程语言和框架:它们极大地影响可视化、代码简洁性、速度、支持的平台等。
  • 功能决策。许多人优先考虑某些功能,而另一些人则优先考虑其他功能。在大多数情况下,您必须做出选择(您不能两者兼得)。
  • 简洁性。我喜欢易于使用的软件,我也喜欢定制和强大的功能。
  • 控制。最终,某个人控制着项目。如果它不统一,就会分叉。

这些考虑因素促使我写了自己的程序。我觉得使用个人软件(很长一段时间,我使用 Excel)很困难,我必须对组织软件感到满意。

待办事项

该实用程序的日历部分尚未完成,需要进行重大改进。事实上,我还没有使用那部分。我仍然在使用 TodoList(另一个很棒的个人组织者软件)。对于密码,我使用的是 Keepass,但最终会尝试将其包含在此实用程序中。我还有一个简陋的 PocketPC 版本,我在我的 IPAQ 上使用,尚未准备好发布。

历史

  • 2009 年 8 月 1 日:初始发布
© . All rights reserved.