摘要:介紹了辦公室工作提醒軟件的開發背景以及在這種背景下該軟件應具有的各項功能,簡單說明了在開發過程中需要用到的編程技術,詳細說明了這些功能的具體實現原理,并對后續開發完善提出了建議。
關鍵詞:控件;消息;消息映射宏;隊列;工作記錄;編輯;定時器;打印
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)32-1116-02
Research about Designing Office Work Notice Software
WEN Chang-ci, Yang Bao-hua, JIANG Zhi
(Jingchang office of Air Force, Beijng 100041, China)
Abstract: It introduces the development background and various functions of Office Work Notice Software,describes the programming techniques which are necessary in the related development process. In the following, it elaborates the detailed theory of realizing the previous function mentioned, and makes the suggestion which aims to fulfill the software functions in the future development.
Key words: control; message; message mapping macro; queue; work record; edit; timer; print
1 引言
辦公室的工作內容比較雜且比較多,大部分需要保密,所以要辦理的手續很多。有的任務需要馬上處理;有的任務相對而言可以緩一緩;有的任務目前無法完成,需要定時檢查是否滿足條件,滿足后馬上辦理;有的任務可能剛進行到一半,領導又決定取消了。在這樣一種工作內容高度交叉、時刻都可能有新的任務并且經常被中斷、中斷完成之后還得繼續處理的情況下,為了防止工作太忙而忘記某些事項,借助于可視化開發工具VC++開發了“工作提醒”軟件,利用計算機來規劃安排工作、提醒自己關于工作的進展情況。
2 編輯功能
2.1 錄入
借助于CEdit類文本框實現該功能。用鼠標雙擊選中欲修改的或還沒有填入內容的記錄欄,在鼠標附近出現一個CEdit類文本框控件,CEdit類文本框控件內顯示記錄欄的當前內容。編輯相應的文本內容,當焦點離開CEdit類文本框控件時,發送的EN_KILLFOCUS消息通過消息映射宏ON_EN_KILLFOCUS(IDC_EDIT, OnKillfocusEdit)來調用CWorkNoticeView::OnKillfocusEdit()函數,促使記錄欄中的內容更改為CEdit類文本框控件的文本內容,同時CEdit類文本框控件從界面上消失。關鍵代碼如下:
m_Edit.GetWindowText(temp);
m_MSFlexGrid.SetTextMatrix(save_row,save_col,temp);
2.2 刪除、添加、清空
通過右鍵點擊選中某項記錄,彈出彈出式菜單,選擇相應的選項,系統自動發送的COMMAND消息通過ON_COMMAND(Delete,OnDelete)、ON_COMMAND(Add,OnAdd)、ON_COMMAND(clear, OnCLear) 消息映射宏映射到相應函數實現。
2.3 刪除記錄
點擊菜單“刪除數據庫記錄”,系統自動發送COMMAND消息,該消息通過消息映射宏ON_COMMAND(DeleteAll, OnDeleteAll)調用執行CWorkNoticeView::OnDeleteAll()函數,該函數實現刪除界面上所有記錄的功能。關鍵代碼如下:
do{m_ContentSet.Delete( );m_ContentSet.MoveNext();}
while(!m_ContentSet.IsEOF( ));
2.4 設置、記錄時間
用鼠標雙擊選中時間記錄欄,在鼠標附近出現一個CDateTimeCtrl類控件,通過微調按鈕調整CDateTimeCtrl類控件的時間設置,當焦點離開CDateTimeCtrl類控件時,發送的NM_KILLFOCUS消息通過消息映射宏ON_NOTIFY(NM_KILLFOCUS, IDC_DATETIMEPICKER1, OnKillfocusDatetimepicker1)調用OnKillfocusDatetimepicker1()函數,借助于CDateTime、CTime、CDateTimeCtrl這三個類將時間記錄欄中的內容更改為CDateTimeCtrl類控件的時間設置,同時CDateTimeCtrl類控件從界面上消失。關鍵代碼如下:
m_DateTime.GetTime(timeDest);
m_Time.Format(\"%d時%d分\",timeDest.GetHour(),timeDest.GetMinute());
m_MSFlexGrid.SetTextMatrix(save_row,save_col,m_Time);
2.5 修改屬性
用鼠標雙擊某項記錄對應的“是否公事”屬性項,對應的屬性值在“True”與“False”之間交替變動。當鼠標雙擊MSHFLEXGRID 表格控件時,系統自動發送DblClick消息,該消息通過消息映射宏ON_EVENT(CWorkNoticeView, IDC_MSHFLEXGRID1, -601, OnDblClickMshflexgrid1, VTS_NONE)調用執行CWorkNoticeView::OnDblClickMshflexgrid()函數,實現修改屬性的功能。關鍵代碼如下:
if(m_MSFlexGrid.GetText()==\"True\")m_MSFlexGrid.SetText(\"False\");
else m_MSFlexGrid.SetText(\"True\");
2.6 保存
點擊菜單“保存新記錄”,系統自動發送COMMAND消息,該消息通過消息映射宏ON_COMMAND(Save, OnSave)調用執行CWorkNoticeView::OnSave()函數,該函數將最終數據更新寫入數據庫。關鍵代碼如下:
for(int row=1;row<=m_MSFlexGrid.GetRows()-1;row++)
{m_ContentSet.AddNew( );m_ContentSet.m_column1=m_MSFlexGrid.GetTextMatrix(row,0);……}
2.7 撤銷
對之前的操作進行撤銷處理,需要設置兩個隊列,一個是Undo隊列,另一個是Redo隊列。所有正常的添加、刪除、修改操作都按序進入Undo隊列,留給Undo操作時使用;每一次Undo操作之后將剛剛進行的Undo操作放入Redo隊列,留給Redo操作時使用。UnDo操作的代碼略, ReDo操作的關鍵代碼如下:
list2[List2Num].operand=list1[List1Num].operand;
list2[List2Num++].XuHao=m_MSFlexGrid.GetTextMatrix(LineUndo,ColUndo);
m_MSFlexGrid.SetTextMatrix(LineUndo,ColUndo,list1[List1Num--].XuHao);
3 打印輸出
調用CWorkNoticeView::OnPrint()函數,該函數在執行時提示設置打印機,設置打印機后可打印界面上所有的工作記錄。關鍵代碼為:
for(int row=0;row<=m_MSFlexGrid.GetRows()-1;row++)
{pDC->TextOut(X_pos,Y_pos,m_MSFlexGrid.GetTextMatrix(row,0));……}
4 定時提醒
4.1 設置提醒
可以通過菜單實現定時器的開關,點擊選中菜單“設置”以發送COMMAND消息,COMMAND消息通過消息映射宏ON_COMMAND(AttributeReset, OnAttributeReset)調用執行CWorkNoticeView:: OnAttributeReset()函數,該函數負責對定時器的開關屬性進行設置。如果定時器狀態為開,那么定時器會周期性地發出提醒信號。關鍵代碼如下:
TimerSetDialog.DoModal();TimerInteval=TimerSetDialog.gap*1000*60;
4.2 設置間隔
通過CDialog類的派生類設置。如果設置“提醒時間間隔”為5分鐘,那么程序在運行時會每間隔5分鐘查詢一次數據庫中所有記錄,所有“完成時間記錄”為空的工作記錄將顯示在對話框界面上作為提醒。關鍵宏為:DDX_Text(pDX, IDC_EDIT1, gap);ON_BN_CLICKED(IDOK, On_TimerSetDialog_OK)
5 查詢
所有的工作記錄都存儲在數據庫中,需要查閱時,可以通過菜單中的“SQL語句查詢”輸入查找條件。借助于CDaoRecordset類實現,關鍵代碼如下:
m_DaoRecordset->Open(dbOpenDynaset,strSelect);
while (!m_DaoRecordset->IsEOF())
{COleVariant var = m_DaoRecordset->GetFieldValue(1);……}
6 格式轉換
把界面上顯示的工作記錄直接轉換成最終所需的word表格文檔,關鍵代碼如下:
創建Word實例:
oWordApp.CreateDispatch(\"Word.Application\", NULL)
創建新的word文檔:
Documents oDocs = oWordApp.GetDocuments(); Selection oSel = oWordApp.GetSelection();
添加工作記錄:
for(int row=0;row {for(int col=0;col<6;col++)oSel.TypeText(m_MSFlexGrid.GetTextMatrix(row, col));……} 保存word文檔: oActiveDoc.SaveAs(COleVariant(strFn), COleVariant((short)0),……); 7 結束語 辦公室的事情比較繁雜,在經費拮據的情況下如何利用現有的計算機硬件條件來幫助處理文秘類的事務,是一項很實用的研究課題。考慮到保密工作的需要,將辦公輔助軟件做成B-S結構的應用程序,同時將此工作提醒程序封裝成一個小模塊,以ActiveX控件的形式嵌入到辦公輔助軟件中,這樣所有的涉密數據均駐留在服務器上,客戶端只需有瀏覽器即可。 參考文獻: [1] 廖進華,文昌辭,王昭順.數據結構[M].上海:上海交通大學出版社,2008:181-201. [2] 潘愛民,王國印.Visual C++技術內幕[M].北京:清華大學出版社,1999:3-210. [3] 薩師煊,王珊.數據庫系統概論[M].北京:高等教育出版社,2000:84-166. [4] 文昌辭,王昭順.軟件測試自動化靜態分析研究[J].計算機工程與設計,2005(4):987-989.