BasicAdmin - 个人组织者






4.94/5 (13投票s)
财务、联系人、笔记组织器

引言
网上有很多财务管理程序。但它们缺少我需要的功能。快捷方式、快速过滤、分层账户结构、速度。所以最后我决定自己写一个。这可能看起来像是在重新发明轮子(又一个财务经理程序)。另一方面,这也是一个学习的机会,而且我已经拥有了构建它的大部分组件。
程序
该实用程序是一个使用功能包的 MFC 程序。它还使用了 CodeProject 的许多控件。它将数据存储在 SQLite 数据库中。它被编译成从 Windows 2000 开始即可运行(据我所知没有依赖项)。可以通过 PE Explorer 更改版本、添加 *GDIPlus.dll* 和代码中的一些函数来修改以适用于 Win9x。
它有自己的帮助,但还没有英文版本。
我已禁用了一些功能
- 从网络获取/上传:我有一个网页,可以访问 SQL Server 数据库。我无法在 Web 服务器上编写。因此,我可以通过 HTTP 保存和检索数据。所有数据库都经过加密并放入文本字段。
- 密码/安全:该实用程序使用密码提供非常基本的保护。您可以在 *BasicAdmin.cpp* 中启用/禁用它。
结构
代码是直接编写的。没有经过深思熟虑。我根据需要添加了功能。这段代码不应被视为教程。它也不是一篇文章。我发布它是为了感谢我从 CodeProject 使用了很多代码。代码的总体结构是

我修改了原始代码以在文章中上传。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 上有许多许多优秀的复式记账财务管理程序,如 GNUCash 和 Money Manager Ex。SourceForge 甚至还有一个个人理财类别。
在自己编写之前,您应该先查看一下。如果您发现喜欢的,可以使用它,甚至可以贡献。
但是,正如您已经知道的,在使用软件时需要考虑很多“因素”
- 编程语言和框架:它们极大地影响可视化、代码简洁性、速度、支持的平台等。
- 功能决策。许多人优先考虑某些功能,而另一些人则优先考虑其他功能。在大多数情况下,您必须做出选择(您不能两者兼得)。
- 简洁性。我喜欢易于使用的软件,我也喜欢定制和强大的功能。
- 控制。最终,某个人控制着项目。如果它不统一,就会分叉。
这些考虑因素促使我写了自己的程序。我觉得使用个人软件(很长一段时间,我使用 Excel)很困难,我必须对组织软件感到满意。
待办事项
该实用程序的日历部分尚未完成,需要进行重大改进。事实上,我还没有使用那部分。我仍然在使用 TodoList(另一个很棒的个人组织者软件)。对于密码,我使用的是 Keepass,但最终会尝试将其包含在此实用程序中。我还有一个简陋的 PocketPC 版本,我在我的 IPAQ 上使用,尚未准备好发布。
历史
- 2009 年 8 月 1 日:初始发布