📄 diary.c
字号:
/*#########################################################################
Copyright (c) 2004, MEIJIN COMPUTER TECH LTD.
All rights reserved.
File name :Diary.c
Description :日记本
Version :1.00
Author :黄猛
Complete Date :2004-08-XX
Function List :
History :
_________________________________________________________________________
DATE AUTHOR VERSION DESCRIBE
-------------------------------------------------------------------------
2004-08-15 黄 猛 Ver1.00 Create
-------------------------------------------------------------------------
2004-09-21 黄 猛 Ver1.01 怎加了日记查找的内容查找方式,改进了心
跳回忆的部分算法。
-------------------------------------------------------------------------
#########################################################################*/
/*初始化###########################################################初始化*/
#include "Diary.h"
/*程序模式定义*/
#define AP_MODE_CURVE (EV_APPLICATION+11) /*心跳回忆模式*/
/*日记本的相关常量*/
#define INDEX_NUM 1 /*数据库的索引数*/
#define FIELD_NUM 4 /*多域编辑器域数,数据库的字段数*/
#define KEYFIELD 0 /*数据库的关键字段号*/
#define ROWSPACE 2 /*多域编辑器的行间距*/
#define INDENT 0 /*多域编辑器缩进大小*/
#define SPIRIT_NUM 5 /*心情域的选项数*/
#define WEATHER_NUM 5 /*天气域的选项数**/
#define MAX_SEARCHLEN 64 /*按内容查找时查找缓冲区长度*/
/*心跳回忆的相关设置*/
#define POINT_SIZE 4 /*点的大小(以所给值作正方形)*/
#define Y_SPACE 20 /*纵轴(标示心情)各坐标之间距离*/
#define X_SPACE 4 /*横轴(标示日期)各坐标之间距离*/
#define CHAR_SIZE SYSFONT_GBK12 /*标示坐标值的字符的风格*/
#define CHAR_SPACE 1 /*坐标轴与标示坐标值的字符的间距*/
#define NUM_WIDTH 7 /*用于标示日期的数字字符的宽度*/
#define NUM_HEIGH 12 /*用于标示日期的数字字符的高度*/
#define HEAD_SPACE 5 /*坐标轴头部的空闲长度*/
#define TAIL_SPACE 5 /*坐标轴尾部的空闲长度*/
#define LEFT_SPACE (1+2*CHAR_SIZE+CHAR_SPACE) /*坐标系纵轴与窗口左边框间距*/
#define BOTTOM_SPACE (2*CHAR_SPACE+CHAR_SIZE+15) /*坐标系横轴与窗口工具条间距*/
/*有关心情的选项*/
UINT8* DiaryClass_Spirit[] =
{
"激动",
"高兴",
"一般",
"郁闷",
"沮丧"
};
/*有关天气的选项*/
const UINT8* const DiaryClass_Weather[] =
{
"大雨",
"小雨",
"晴天",
"阴天",
"多云"
};
/*多域编辑器参数数组*/
const MEditParam pFieldEditParam[]=
{
/*日期域*/
{DateFldExtraHandle, MAKE_ID(IDS_DIARY_FIELD_DATE), 10, EDITALLOW_ALL, EDITALLOW_DATE},
/*心情域*/
{TypeFldExtraHandle, MAKE_ID(IDS_DIARY_FIELD_SPIRIT), AP_MAX_EDITLEN, EDITALLOW_CLASS|EDITALLOW_NOMARK, EDITALLOW_CLASS},
/*天气域*/
{TypeFldExtraHandle, MAKE_ID(IDS_DIARY_FIELD_WEATHER), AP_MAX_EDITLEN, EDITALLOW_CLASS|EDITALLOW_NOMARK, EDITALLOW_CLASS},
/*日记内容域*/
{NULL, MAKE_ID(IDS_DIARY_FIELD_CONTENT), AP_MAX_EDITLEN, EDITALLOW_ALL, EDITALLOW_SBCCASE}
};
/*浏览日记窗口的工具栏*/
const MToolBar Diary_View_ToolBar[] =
{
{(UINT8*)IDS_DIARY_VIEW_PREVIOUS, DIARY_CMD_PREVIOUS}, /*上一篇按钮*/
{(UINT8*)IDS_DIARY_VIEW_NEXT, DIARY_CMD_NEXT}, /*下一篇按钮*/
{(UINT8*)IDS_DIARY_VIEW_FIND, DIARY_CMD_FIND}, /*查找按钮*/
{(UINT8*)IDS_DIARY_VIEW_MODIFY, DIARY_CMD_MODIFY}, /*修改按钮*/
{(UINT8*)IDS_DIARY_VIEW_DELETE, DIARY_CMD_DELETE}, /*删除按钮*/
{(UINT8*)IDS_DIARY_VIEW_WRITE, DIARY_CMD_WRITE}, /*写日记按钮*/
{0,0}
};
/*浏览查找到的日记窗口的工具栏*/
const MToolBar Diary_Index_ToolBar[] =
{
{(UINT8*)IDS_DIARY_VIEW_PREVIOUS, DIARY_CMD_PREVIOUS}, /*上一篇按钮*/
{(UINT8*)IDS_DIARY_VIEW_NEXT, DIARY_CMD_NEXT}, /*下一篇按钮*/
{0,0}
};
/*心跳回忆窗口的工具栏*/
const MToolBar Diary_Curve_ToolBar[] =
{
{(UINT8*)IDS_DIARY_CURVE_PREVIOUS, DIARY_CMD_PREVIOUS}, /*上一月按钮*/
{(UINT8*)IDS_DIARY_CURVE_NEXT, DIARY_CMD_NEXT}, /*下一月按钮*/
{(UINT8*)IDS_DIARY_CURVE_CUSTOM, DIARY_CMD_FIND}, /*自定义月份按钮*/
{0,0}
};
/*数据库域数组常量*/
const StructDbField DiaryField[] =
{
{"日期", DB_FIELDTYPE_STRING, 1},
{"心情", DB_FIELDTYPE_STRING, 1},
{"天气", DB_FIELDTYPE_STRING, 1},
{"内容", DB_FIELDTYPE_STRING, 1}
};
/*数据库索引数组常量*/
const StructDbIndex DiaryIndex[] =
{
DB_INDEXTYPE_NORMAL,
0
};
/*数据库创建信息常量*/
const StructDbCreate DiaryDbCreate =
{
"日记本", /*数据库名*/
NULL, /*创建者标志 */
FIELD_NUM, /*字段数*/
(StructDbField*)DiaryField, /*字段结构数组的地址*/
INDEX_NUM, /*索引数*/
(StructDbIndex*)DiaryIndex /*索引结构数组的地址*/
};
/*初始化结束###################################################初始化结束*/
/*全局变量声明###############################################全局变量声明*/
/*==========================================================
VARIABLE NAME :g_PresentChoice
DESCRIPTION :表述当前选择那项功能
VALUE : 1:写日记
2:浏览日记
3:心跳回忆
OTHERS :被函数DiayInit初始化为1
==========================================================*/
UINT g_PresentChoice;
/*==========================================================
VARIABLE NAME :g_DbHandle
DESCRIPTION :在整个程序执行过程中保存数据库句柄
VALUE :
OTHERS :被函数DiayInit初始化
==========================================================*/
INT g_DbHandle;
/*==========================================================
VARIABLE NAME :g_PreViewRecID
DESCRIPTION :记录浏览日记窗体正在浏览的日记在数据库中的记录
ID
VALUE :
OTHERS :被函数DiayInit初始化为0
==========================================================*/
UINT16 g_PreViewRecID;
/*==========================================================
VARIABLE NAME :g_PreViewRecID
DESCRIPTION :索引窗体的索引缓冲区,即记录的句柄集
VALUE :
OTHERS :被函数DiayInit初始化为NULL
==========================================================*/
UINT16* g_IndexBuf;
/*==========================================================
VARIABLE NAME :g_IndexStatus
DESCRIPTION :索引窗体是否已暂存g_PreViewRecID
VALUE :
FALSE:未暂存
TRUE:一暂存
OTHERS :被函数DiayInit初始化为FALSE
==========================================================*/
BOOL g_IndexStatus;
/*==========================================================
VARIABLE NAME :g_Index_BGround
DESCRIPTION :暂存索引窗体的背景
VALUE :
OTHERS :被函数DiayInit初始化为FALSE
==========================================================*/
BITMAPINFO* g_Index_BGround;
/*==========================================================
VARIABLE NAME :g_DiaryViewFont
DESCRIPTION :记录浏览日记窗体所使用的字体
VALUE :
OTHERS :被函数DiayInit初始化为SYSFONT_GBK12
==========================================================*/
UINT16 g_DiaryViewFont;
/*==========================================================
VARIABLE NAME :g_Date
DESCRIPTION :记录心跳回忆窗体所察看的心跳曲线对应的日期
VALUE :
OTHERS :被函数DiayInit初始化为当前日期
==========================================================*/
DateType g_Date;
/*全局变量声明结束#######################################全局变量声明结束*/
/*函数声明#######################################################函数声明*/
VOID DiaryInit(VOID);
VOID DiaryEnd(VOID);
/*主窗体相关函数*/
MWindow* DiaryCreateWin_ALL(VOID);
VOID DiaryALL_BG_CallBack(MDC* hDC);
VOID DiaryInvertRect(MDC* hDC);
UINT32 DiaryALL_EV_CallBack(MView* handle, MEvent* pEvent);
/*写日记、浏览日记相关函数*/
MWindow* DiaryCreateWin_WR(VOID);
VOID EditInitBuf(UINT8* pBuf);
BOOL EditSetBuf(UINT8* pBuf);
UINT16 RenewEditExChar(UINT8 *editbuf, UINT8 *databuf, UINT32 ItemAddr
, UINT16 ItemNum, UINT8 ItemWidth);
VOID DiaryNEW_BG_CallBack(MDC* hDC);
UINT32 DiaryNEW_EV_CallBack(MView* handle, MEvent* pEvent);
BOOL CheckDateField(MFldEdit* hEdit);
VOID DiaryVIEW_BG_CallBack(MDC* hDC);
UINT32 DiaryVIEW_EV_CallBack(MView* handle, MEvent* pEvent);
BOOL ViewCmdProcess(MWindow* hWnd, MEvent* pEvent);
INT DiaryViewSearch(MWinView* hApWnd, UINT16 wField, UINT8* const pszChar);
VOID DiaryPringMessage(MWindow* hWnd, UINT8* hEditor
, MEditParam* pEditParam, UINT16 wIndex);
/*索引窗口相关函数*/
MWindow* DiaryCreateWin_INDEX(VOID);
VOID DiaryINDEX_BG_CallBack(MDC* hDC);
UINT32 DiaryINDEX_EV_CallBack(MView* handle, MEvent* pEvent);
/*心跳回忆相关函数*/
MWindow* DiaryCreateWin_CURVE(VOID);
VOID DiaryCURVE_BG_CallBack(MDC* hDC);
VOID Draw_CoordinatesSys(MDC* hDC, MPoint* pOrigin);
VOID Draw_Curve(MDC* hDC, MPoint* pOrigin);
VOID Draw_Point(MDC* hDC, MPoint* pOrigin, UINT32 uDate, UINT32 uSpirit);
VOID Draw_Point2(MDC* hDC, MPoint* pOrigin, UINT8 (*pSpiritList)[31]);
UINT32 DiaryCURVE_EV_CallBack(MView* handle, MEvent* pEvent);
/*查找窗口相关函数*/
VOID CreateFindDialog(UINT8 *handle);
VOID FindDialogDrawCallback(MDC *hDC);
UINT32 FindDialogHandleEvent(UINT8 *handle, MEvent *pEvent);
BOOL DiaryCreatList(MWindow* hWnd, MRect* pRect, UINT32 dwStyle, UINT16* pIndexBuf);
/*函数声明结束###############################################函数声明结束*/
/*主函数###########################################################主函数*/
APP_DLL UINT32 GuiMain(UINT32 hInstance, UINT32 hPrev, UINT8* pCmdLine, INT nCmdShow)
{
MWindow* hDiaryWin;
UINT32 dwMode;
DiaryInit(); /*初始化*/
hDiaryWin = NULL;
dwMode = ApGetMode();
while (TRUE)
{
switch (dwMode)
{
case AP_MODE_ALL:
{
hDiaryWin = DiaryCreateWin_ALL();
if (NULL == hDiaryWin)
{
dwMode = QUIT_ERROR;
}
break;
}
case AP_MODE_NEW:
case AP_MODE_VIEW:
case AP_MODE_MODIFY:
{
hDiaryWin = DiaryCreateWin_WR();
if (NULL == hDiaryWin)
{
dwMode = QUIT_ERROR;
}
break;
}
case AP_MODE_INDEX:
{
hDiaryWin = DiaryCreateWin_INDEX();
if (NULL == hDiaryWin)
{
dwMode = QUIT_ERROR;
}
break;
}
case AP_MODE_CURVE:
{
hDiaryWin = DiaryCreateWin_CURVE();
if (NULL == hDiaryWin)
{
dwMode = QUIT_ERROR;
}
break;
}
}
if (NULL == hDiaryWin)
{
break;
}
dwMode = ApRun ((MWinView *)hDiaryWin);
GuiDestroy ((MView *)hDiaryWin);
ApSetMode (dwMode);
hDiaryWin = NULL;
}
DiaryEnd(); /*关闭数据库*/
return dwMode;
}
/*主函数结束###################################################主函数结束*/
/*函数定义#######################################################函数定义*/
/*==========================================================
FUNCTION :DiaryInit
DESCRIPTION:初始化全局变量,打开数据库,设置工作模式
INPUTS :
OUTPUTS :
RETURN :
____________________________________________________________
DATE AUTHOR VERSION DESCRIBE
------------------------------------------------------------
2004-08-XX 黄 猛 Ver1.00 Create
==========================================================*/
VOID DiaryInit(VOID)
{
UINT32 msgResult;
HDB dbHandle;
STATUS state;
StructDbCreate dbCreate;
StructDbInfo dbInfo;
/*初始化全局变量*/
g_PresentChoice = 1; /*当前选择的功能,初始化为1,代表“写日记”*/
g_DbHandle = NULL;
g_IndexBuf = NULL;
g_Index_BGround = NULL;
g_IndexStatus = FALSE;
g_PreViewRecID = 0; /*当前浏览的日记的数据库记录ID,0表示第一条*/
/*即最近的一篇日记*/
g_DiaryViewFont = SYSFONT_GBK16; /*浏览日记的字体*/
TimGetDate(&g_Date); /*获取当前日期*/
/*打开或创建数据库*/
memcpy(&dbCreate, &DiaryDbCreate, sizeof(StructDbCreate));
state = ApMakeDir(USER_DEFAULT_PATH);
if (state < 0 && (state != NUF_EXIST))
{
ApErrorMessage(state);
return;
}
FileSetCurrentDir(USER_DEFAULT_PATH);
FileSetAttributes("日记本.DBF", ATTR_NORMAL);
dbHandle = DbCreate(&dbCreate);
if ((dbHandle == DB_ERR_NONE) || (dbHandle == DB_ERR_ISEXIST))
{
dbHandle = DbOpen(dbCreate.pDbName, DBMODE_READWRITE|DBMODE_DESCEND, 0);
}
if (dbHandle < 0)
{
ApErrorMessage(dbHandle);
ApSetMode(QUIT_ERROR);
return;
}
g_DbHandle = dbHandle;
DbGetDbInfo(dbHandle, &dbInfo);
if (0 != dbInfo.uRecordNum)
{
ApSetMode(AP_MODE_ALL);
return;
}
/*在第一次打开日记本时提示用户写日记*/
msgResult = MsgBoxRun(NULL, NULL, MAKE_ID(IDS_DIARY_ASKNEW)
, MAKE_ID(IDS_DIARY_APNAME), MT_YESNO|MT_ICONQUESTION);
if (QUIT_YES == msgResult)
{
ApSetMode(AP_MODE_NEW);
}
else
{
ApSetMode(QUIT_NORMAL);
}
}
/*==========================================================
FUNCTION :DiaryCreateWin_ALL
DESCRIPTION:创建主窗体
INPUTS :
OUTPUTS :
RETURN :主窗体句柄
____________________________________________________________
DATE AUTHOR VERSION DESCRIBE
------------------------------------------------------------
2004-08-XX 黄 猛 Ver1.00 Create
==========================================================*/
MWindow* DiaryCreateWin_ALL()
{
MWindow* hWnd;
MRect rect;
GuiGetUserFullRect(&rect);
hWnd = WindowCreate(NULL, NULL, DIARY_WND_ALL_ID
, &rect, WS_APWINDOW|WS_TITLE
, MAKE_ID(IDR_HELP_MAIN)
, MAKE_ID(IDS_DIARY_TITLE_ALL)
, NULL, NULL);
((MView*)hWnd) -> fpDrawBackGround = DiaryALL_BG_CallBack;
((MView*)hWnd)->fpHandleEvent = DiaryALL_EV_CallBack;
return hWnd;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -