摘要:介紹了辦公室工作提醒軟件的開發(fā)背景以及在這種背景下該軟件應(yīng)具有的各項(xiàng)功能,簡(jiǎn)單說(shuō)明了在開發(fā)過(guò)程中需要用到的編程技術(shù),詳細(xì)說(shuō)明了這些功能的具體實(shí)現(xiàn)原理,并對(duì)后續(xù)開發(fā)完善提出了建議。
關(guān)鍵詞:控件;消息;消息映射宏;隊(duì)列;工作記錄;編輯;定時(shí)器;打印
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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 引言
辦公室的工作內(nèi)容比較雜且比較多,大部分需要保密,所以要辦理的手續(xù)很多。有的任務(wù)需要馬上處理;有的任務(wù)相對(duì)而言可以緩一緩;有的任務(wù)目前無(wú)法完成,需要定時(shí)檢查是否滿足條件,滿足后馬上辦理;有的任務(wù)可能剛進(jìn)行到一半,領(lǐng)導(dǎo)又決定取消了。在這樣一種工作內(nèi)容高度交叉、時(shí)刻都可能有新的任務(wù)并且經(jīng)常被中斷、中斷完成之后還得繼續(xù)處理的情況下,為了防止工作太忙而忘記某些事項(xiàng),借助于可視化開發(fā)工具VC++開發(fā)了“工作提醒”軟件,利用計(jì)算機(jī)來(lái)規(guī)劃安排工作、提醒自己關(guān)于工作的進(jìn)展情況。
2 編輯功能
2.1 錄入
借助于CEdit類文本框?qū)崿F(xiàn)該功能。用鼠標(biāo)雙擊選中欲修改的或還沒(méi)有填入內(nèi)容的記錄欄,在鼠標(biāo)附近出現(xiàn)一個(gè)CEdit類文本框控件,CEdit類文本框控件內(nèi)顯示記錄欄的當(dāng)前內(nèi)容。編輯相應(yīng)的文本內(nèi)容,當(dāng)焦點(diǎn)離開CEdit類文本框控件時(shí),發(fā)送的EN_KILLFOCUS消息通過(guò)消息映射宏ON_EN_KILLFOCUS(IDC_EDIT, OnKillfocusEdit)來(lái)調(diào)用CWorkNoticeView::OnKillfocusEdit()函數(shù),促使記錄欄中的內(nèi)容更改為CEdit類文本框控件的文本內(nèi)容,同時(shí)CEdit類文本框控件從界面上消失。關(guān)鍵代碼如下:
m_Edit.GetWindowText(temp);
m_MSFlexGrid.SetTextMatrix(save_row,save_col,temp);
2.2 刪除、添加、清空
通過(guò)右鍵點(diǎn)擊選中某項(xiàng)記錄,彈出彈出式菜單,選擇相應(yīng)的選項(xiàng),系統(tǒng)自動(dòng)發(fā)送的COMMAND消息通過(guò)ON_COMMAND(Delete,OnDelete)、ON_COMMAND(Add,OnAdd)、ON_COMMAND(clear, OnCLear) 消息映射宏映射到相應(yīng)函數(shù)實(shí)現(xiàn)。
2.3 刪除記錄
點(diǎn)擊菜單“刪除數(shù)據(jù)庫(kù)記錄”,系統(tǒng)自動(dòng)發(fā)送COMMAND消息,該消息通過(guò)消息映射宏ON_COMMAND(DeleteAll, OnDeleteAll)調(diào)用執(zhí)行CWorkNoticeView::OnDeleteAll()函數(shù),該函數(shù)實(shí)現(xiàn)刪除界面上所有記錄的功能。關(guān)鍵代碼如下:
do{m_ContentSet.Delete( );m_ContentSet.MoveNext();}
while(!m_ContentSet.IsEOF( ));
2.4 設(shè)置、記錄時(shí)間
用鼠標(biāo)雙擊選中時(shí)間記錄欄,在鼠標(biāo)附近出現(xiàn)一個(gè)CDateTimeCtrl類控件,通過(guò)微調(diào)按鈕調(diào)整CDateTimeCtrl類控件的時(shí)間設(shè)置,當(dāng)焦點(diǎn)離開CDateTimeCtrl類控件時(shí),發(fā)送的NM_KILLFOCUS消息通過(guò)消息映射宏ON_NOTIFY(NM_KILLFOCUS, IDC_DATETIMEPICKER1, OnKillfocusDatetimepicker1)調(diào)用OnKillfocusDatetimepicker1()函數(shù),借助于CDateTime、CTime、CDateTimeCtrl這三個(gè)類將時(shí)間記錄欄中的內(nèi)容更改為CDateTimeCtrl類控件的時(shí)間設(shè)置,同時(shí)CDateTimeCtrl類控件從界面上消失。關(guān)鍵代碼如下:
m_DateTime.GetTime(timeDest);
m_Time.Format(\"%d時(shí)%d分\",timeDest.GetHour(),timeDest.GetMinute());
m_MSFlexGrid.SetTextMatrix(save_row,save_col,m_Time);
2.5 修改屬性
用鼠標(biāo)雙擊某項(xiàng)記錄對(duì)應(yīng)的“是否公事”屬性項(xiàng),對(duì)應(yīng)的屬性值在“True”與“False”之間交替變動(dòng)。當(dāng)鼠標(biāo)雙擊MSHFLEXGRID 表格控件時(shí),系統(tǒng)自動(dòng)發(fā)送DblClick消息,該消息通過(guò)消息映射宏ON_EVENT(CWorkNoticeView, IDC_MSHFLEXGRID1, -601, OnDblClickMshflexgrid1, VTS_NONE)調(diào)用執(zhí)行CWorkNoticeView::OnDblClickMshflexgrid()函數(shù),實(shí)現(xiàn)修改屬性的功能。關(guān)鍵代碼如下:
if(m_MSFlexGrid.GetText()==\"True\")m_MSFlexGrid.SetText(\"False\");
else m_MSFlexGrid.SetText(\"True\");
2.6 保存
點(diǎn)擊菜單“保存新記錄”,系統(tǒng)自動(dòng)發(fā)送COMMAND消息,該消息通過(guò)消息映射宏ON_COMMAND(Save, OnSave)調(diào)用執(zhí)行CWorkNoticeView::OnSave()函數(shù),該函數(shù)將最終數(shù)據(jù)更新寫入數(shù)據(jù)庫(kù)。關(guān)鍵代碼如下:
for(int row=1;row<=m_MSFlexGrid.GetRows()-1;row++)
{m_ContentSet.AddNew( );m_ContentSet.m_column1=m_MSFlexGrid.GetTextMatrix(row,0);……}
2.7 撤銷
對(duì)之前的操作進(jìn)行撤銷處理,需要設(shè)置兩個(gè)隊(duì)列,一個(gè)是Undo隊(duì)列,另一個(gè)是Redo隊(duì)列。所有正常的添加、刪除、修改操作都按序進(jìn)入U(xiǎn)ndo隊(duì)列,留給Undo操作時(shí)使用;每一次Undo操作之后將剛剛進(jìn)行的Undo操作放入Redo隊(duì)列,留給Redo操作時(shí)使用。UnDo操作的代碼略, ReDo操作的關(guān)鍵代碼如下:
list2[List2Num].operand=list1[List1Num].operand;
list2[List2Num++].XuHao=m_MSFlexGrid.GetTextMatrix(LineUndo,ColUndo);
m_MSFlexGrid.SetTextMatrix(LineUndo,ColUndo,list1[List1Num--].XuHao);
3 打印輸出
調(diào)用CWorkNoticeView::OnPrint()函數(shù),該函數(shù)在執(zhí)行時(shí)提示設(shè)置打印機(jī),設(shè)置打印機(jī)后可打印界面上所有的工作記錄。關(guān)鍵代碼為:
for(int row=0;row<=m_MSFlexGrid.GetRows()-1;row++)
{pDC->TextOut(X_pos,Y_pos,m_MSFlexGrid.GetTextMatrix(row,0));……}
4 定時(shí)提醒
4.1 設(shè)置提醒
可以通過(guò)菜單實(shí)現(xiàn)定時(shí)器的開關(guān),點(diǎn)擊選中菜單“設(shè)置”以發(fā)送COMMAND消息,COMMAND消息通過(guò)消息映射宏ON_COMMAND(AttributeReset, OnAttributeReset)調(diào)用執(zhí)行CWorkNoticeView:: OnAttributeReset()函數(shù),該函數(shù)負(fù)責(zé)對(duì)定時(shí)器的開關(guān)屬性進(jìn)行設(shè)置。如果定時(shí)器狀態(tài)為開,那么定時(shí)器會(huì)周期性地發(fā)出提醒信號(hào)。關(guān)鍵代碼如下:
TimerSetDialog.DoModal();TimerInteval=TimerSetDialog.gap*1000*60;
4.2 設(shè)置間隔
通過(guò)CDialog類的派生類設(shè)置。如果設(shè)置“提醒時(shí)間間隔”為5分鐘,那么程序在運(yùn)行時(shí)會(huì)每間隔5分鐘查詢一次數(shù)據(jù)庫(kù)中所有記錄,所有“完成時(shí)間記錄”為空的工作記錄將顯示在對(duì)話框界面上作為提醒。關(guān)鍵宏為:DDX_Text(pDX, IDC_EDIT1, gap);ON_BN_CLICKED(IDOK, On_TimerSetDialog_OK)
5 查詢
所有的工作記錄都存儲(chǔ)在數(shù)據(jù)庫(kù)中,需要查閱時(shí),可以通過(guò)菜單中的“SQL語(yǔ)句查詢”輸入查找條件。借助于CDaoRecordset類實(shí)現(xiàn),關(guān)鍵代碼如下:
m_DaoRecordset->Open(dbOpenDynaset,strSelect);
while (!m_DaoRecordset->IsEOF())
{COleVariant var = m_DaoRecordset->GetFieldValue(1);……}
6 格式轉(zhuǎn)換
把界面上顯示的工作記錄直接轉(zhuǎn)換成最終所需的word表格文檔,關(guān)鍵代碼如下:
創(chuàng)建Word實(shí)例:
oWordApp.CreateDispatch(\"Word.Application\", NULL)
創(chuàng)建新的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 結(jié)束語(yǔ) 辦公室的事情比較繁雜,在經(jīng)費(fèi)拮據(jù)的情況下如何利用現(xiàn)有的計(jì)算機(jī)硬件條件來(lái)幫助處理文秘類的事務(wù),是一項(xiàng)很實(shí)用的研究課題。考慮到保密工作的需要,將辦公輔助軟件做成B-S結(jié)構(gòu)的應(yīng)用程序,同時(shí)將此工作提醒程序封裝成一個(gè)小模塊,以ActiveX控件的形式嵌入到辦公輔助軟件中,這樣所有的涉密數(shù)據(jù)均駐留在服務(wù)器上,客戶端只需有瀏覽器即可。 參考文獻(xiàn): [1] 廖進(jìn)華,文昌辭,王昭順.數(shù)據(jù)結(jié)構(gòu)[M].上海:上海交通大學(xué)出版社,2008:181-201. [2] 潘愛(ài)民,王國(guó)印.Visual C++技術(shù)內(nèi)幕[M].北京:清華大學(xué)出版社,1999:3-210. [3] 薩師煊,王珊.數(shù)據(jù)庫(kù)系統(tǒng)概論[M].北京:高等教育出版社,2000:84-166. [4] 文昌辭,王昭順.軟件測(cè)試自動(dòng)化靜態(tài)分析研究[J].計(jì)算機(jī)工程與設(shè)計(jì),2005(4):987-989.