蔡洪濤,田中軒
武漢工程大學(xué)機(jī)電工程學(xué)院,湖北 武漢 430205
材料是壓力容器與設(shè)備設(shè)計(jì)過(guò)程最重要的參數(shù),它影響到壓力容器與設(shè)備的設(shè)計(jì)、制造、安裝與運(yùn)行.GB150中提供了眾多材料可供設(shè)計(jì)選擇[1].這些材料能滿足一般設(shè)計(jì)要求;但是隨著材料技術(shù)的進(jìn)步,新材料不斷出現(xiàn);國(guó)際貿(mào)易使得國(guó)外材料的選用也日益頻繁.這些都要求能讓用戶方便地在設(shè)備強(qiáng)度計(jì)算軟件包中增加新材料、刪除淘汰的老材料.為此軟件包必須提供“用戶材料數(shù)據(jù)庫(kù)管理”模塊.其運(yùn)行界面如圖1所示.

圖1 用戶材料數(shù)據(jù)庫(kù)管理系統(tǒng)界面Fig.1 The interface of user material database management system
啟動(dòng)時(shí)左邊列表中最后的材料處于選中狀態(tài),右邊則表明該材料的名稱、標(biāo)準(zhǔn)號(hào)及材料類型、力學(xué)性能等.用戶點(diǎn)擊左邊不同的材料,右邊各項(xiàng)相應(yīng)做出改變.當(dāng)點(diǎn)擊“增加”按鈕,則右邊上部各控件清空,下方的表格也消失;當(dāng)選中“強(qiáng)度數(shù)據(jù)類型”下的任一選項(xiàng)時(shí),又會(huì)彈出表格,讓用戶輸入材料力學(xué)性能,且表格上方的紅色文字與選項(xiàng)相匹配.當(dāng)點(diǎn)擊“更新、保存”按鈕,將該材料的各項(xiàng)參數(shù)寫入文件中,并在列表最后增加一行.當(dāng)點(diǎn)擊“刪除”按鈕時(shí),首先從列表中刪除被選中的一行,然后從文件中刪除這種材料的各項(xiàng)參數(shù),最后將光標(biāo)移到列表最后一行,右邊顯示該材料的各項(xiàng)參數(shù).
從圖1中可以看出,運(yùn)行界面是一個(gè)有兩個(gè)屬性頁(yè)的屬性對(duì)話框,屬性頁(yè)名分別為“用戶材料數(shù)據(jù)操作(1)”和“用戶材料數(shù)據(jù)操作(2)”.第一頁(yè)主要由名為“請(qǐng)選擇材料:”的列表控件和4個(gè)成組框控件組成,這4個(gè)成組框的名稱分別是“材料類型”、“材料類別”、“應(yīng)力類別”和“強(qiáng)度數(shù)據(jù)類型”;右下角的是兩個(gè)CMSFlexGrid型網(wǎng)格控件,都是10行、2列,用于材料在20個(gè)不同溫度下的強(qiáng)度值的輸入.第二頁(yè)主要由兩個(gè)成組框組成,名稱分別是“基于彈性模量的材料分類”和“基于線膨脹系數(shù)的材料分類”.
CMSFlexGrid網(wǎng)格控件是Visual C++提供的已注冊(cè)的ActiveX控件,以表格的形式顯示和操作數(shù)據(jù).該控件在MSDN中有用于VB的詳細(xì)的文檔;但是用于VC的說(shuō)明卻沒有.該控件不具備對(duì)網(wǎng)格的編輯功能.給CMSFlexGrid控件添加編輯功能的思路是[2]:設(shè)置一個(gè)編輯框控件,該控件可以在網(wǎng)格控件移動(dòng),并與某個(gè)單元格重合,在該編輯框控件中輸入數(shù)據(jù),并將該數(shù)據(jù)寫入單元格中.
在VC環(huán)境下開發(fā)數(shù)據(jù)庫(kù)應(yīng)用程序一般都要采用第三方軟件如Microsoft Office Access、Microsoft Office Excel、Microsoft Visual FoxPro等形成數(shù)據(jù)文件,然后注冊(cè)形成數(shù)據(jù)源[3-4],再通過(guò)ODBC、DAO或ADO技術(shù)操縱數(shù)據(jù)源以實(shí)現(xiàn)對(duì)數(shù)據(jù)的管理.本文利用MFC的文件讀寫功能在模塊中形成數(shù)據(jù)文件,不需要第三方軟件的支持.MFC的鏈表類包括CPtrList、CStringList、CobList[5],本文利用CptrList類創(chuàng)建鏈表對(duì)象.
首先啟動(dòng)VC++6.0,創(chuàng)建一個(gè)名為yhmaterial的單文檔工程,該工程視類的基類是CFormView,其余保持默認(rèn)選項(xiàng)不變.添加兩個(gè)對(duì)話框資源,其ID分別為IDD_PROPPAGE1和IDD_PROPPAGE2.參照?qǐng)D1在兩個(gè)對(duì)話框中添加各控件.對(duì)話框IDD_PROPPAGE1中添加各控件后,還要添加一個(gè)多余的編輯框控件“Edit”,用于網(wǎng)格控件的編輯化.右下角網(wǎng)格控件的添加方法是點(diǎn)擊工程添加到工程Components and Controls,在彈出的對(duì)話框中選擇Registered and ActiveX Controls文件夾,雙擊之,再選擇Microsoft FlexGrid Control,version 6.0,點(diǎn)擊insert按鈕,彈出Confirm Class對(duì)話框.選中前面三項(xiàng),點(diǎn)擊OK.此時(shí)在控件工具箱中出現(xiàn)Microsoft FlexGrid Control的圖標(biāo).并且在工程的ClassView區(qū)出現(xiàn)剛才選中的三個(gè)類:CMSflexGrid、CRowCursor和ColeFont,在工程的FileView區(qū)出現(xiàn)類的頭文件msflexgrid.h、font.h和rowcursor.h及源文件msflexgrid.cpp、font.cpp和rowcursor.cpp.兩次添加Microsoft FlexGrid Control到IDD_PROPPAGE1上.修改其ID分別為IDC_MSFLEXGRID1和IDC_MSFLEXGRID2.參照?qǐng)D1設(shè)置其屬性,并適當(dāng)調(diào)節(jié)網(wǎng)格控件所占范圍的大小,使得后面設(shè)置的網(wǎng)格的高度與寬度既能完全顯示出來(lái),又無(wú)黑邊.注意設(shè)置四個(gè)成組框控件下面第一個(gè)控件的“Group”屬性.將列表控件設(shè)置為“Report”屬性.為各控件綁定變量,為這兩個(gè)對(duì)話框資源添加響應(yīng)的類Cpage1和Cpage2,并創(chuàng)建屬性對(duì)話框.
此時(shí)編譯運(yùn)行,發(fā)現(xiàn)屬性對(duì)話框要么完全顯示出來(lái),但是只占整個(gè)視區(qū)的一部分,要么占住整個(gè)視區(qū),但是只顯示了一部分,多了兩個(gè)滾動(dòng)條,需要滾動(dòng)才能看到屬性對(duì)話框的各個(gè)部位.要想將屬性對(duì)話框完全嵌入視區(qū),不出現(xiàn)滾動(dòng)條,可以添加函數(shù)void CYhmaterialView::OnSize(UINT nType,int cx,int cy).
void CYhmaterialView::OnSize(UINT nType,int cx,int cy)
{
CFormView::OnSize(nType,cx,cy);
propSheet.SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE);
CTabCtrl* m_tabctrl=propSheet.GetTabControl( );//
m_tabctrl->SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE);//
CRect rect;CSize size;
GetClientRect(&rect);//獲取當(dāng)前客戶區(qū)view大小
size.cx=rect.right-rect.left;
size.cy=rect.bottom-rect.top;
SetScrollSizes(MM_TEXT,size);//將CScrollView的大小設(shè)置為當(dāng)前客戶區(qū)大小
}
再次編譯運(yùn)行,發(fā)現(xiàn)無(wú)滾動(dòng)條,調(diào)節(jié)視區(qū)大小(用鼠標(biāo)拖動(dòng)),對(duì)話框的尺寸也跟著變化,視區(qū)與對(duì)話框大小同步.效果如圖1所示.
編輯網(wǎng)格就是在單擊單元格時(shí)能接受用戶的輸入.為此按第二節(jié)的思路進(jìn)行.首先要響應(yīng)FlexGrid控件的Click事件.利用類向?qū)г陬怌page1中添加響應(yīng)函數(shù)void Cpage1::OnClickMsflexgrid1()和void Cpage1::OnClickMsflexgrid2().
當(dāng)編輯完成釋放焦點(diǎn)之后,將數(shù)據(jù)寫回單元格.此時(shí)應(yīng)該響應(yīng)CEdit控件的EN_KILLFOCUS事件.利用類向?qū)砑雍瘮?shù)void Cpage1::OnKillfocusEdit().
材料參數(shù)眾多,其中最主要的是材料的力學(xué)性能指標(biāo).由于各種材料適用的溫度范圍不同,故力學(xué)性能的個(gè)數(shù)也不同.本章給出的溫度等級(jí)數(shù)為20(參考GB150),當(dāng)材料力學(xué)性能溫度等級(jí)不夠20時(shí),以0補(bǔ)齊溫度與力學(xué)性能.構(gòu)建如下的結(jié)構(gòu)體:
struct CAILIAOCANSHU
{
CString name;//材料名稱
CString biaozhun;//材料標(biāo)準(zhǔn)
double houdumax,houdumin,wendumin,wendumax,cailiaomidu,sigma,qufu;//最小、最大尺寸,最高、最低適用溫度,材料重度,常溫抗拉強(qiáng)度及屈服極限
int banfou,gangfou,gaoyinglifou,qiangdulei;//材料形式、材質(zhì)類別、應(yīng)力高低、應(yīng)力類別
double yingli[20];//應(yīng)力等級(jí)值
double wendu[20];//溫度等級(jí)值
};
材料形式即板材、鍛件等之分;材質(zhì)類別有碳鋼、不銹鋼、銅、鋁及鈦材之分;應(yīng)力高低即高應(yīng)力與低應(yīng)力.GB150對(duì)某些材料在同一個(gè)溫度下給出了兩種許用應(yīng)力,應(yīng)力較高者僅適用于允許產(chǎn)生微量永久變形的元件;對(duì)于法蘭或其他有微量永久變形就引起泄漏或故障的場(chǎng)合則采用較低應(yīng)力以增加元件的尺寸,增加安全可靠性.
圖1是啟動(dòng)界面.可以看出啟動(dòng)時(shí)將文件中的各個(gè)材料名稱讀入屬性頁(yè)的列表控件中,光標(biāo)處于最后一個(gè)材料,并將這個(gè)材料的參數(shù)顯示在屬性頁(yè)的各個(gè)控件中.用戶點(diǎn)擊任意一個(gè)材料名稱,則右邊各控件數(shù)據(jù)跟著變化.如果文件為空,或不存在,則顯示空白的界面,即各個(gè)控件為空.
實(shí)現(xiàn)思路是:先將網(wǎng)格控件和列表控件初始化;打開文件,將數(shù)據(jù)讀入材料參數(shù)結(jié)構(gòu)體,形成一個(gè)鏈結(jié)點(diǎn)添加到鏈尾,直到文件讀完.再遍歷鏈表,將每一個(gè)結(jié)點(diǎn)中對(duì)應(yīng)的材料名稱數(shù)據(jù)及應(yīng)力類別寫到列表框,并將最后一個(gè)材料的參數(shù)寫入各個(gè)編輯框中.這些工作可由函數(shù)BOOL Cpage1::OnInitDialog()完成.
“增加”按鈕的功能實(shí)現(xiàn).用戶單擊該按鈕時(shí),首先將網(wǎng)格控件隱藏,各控件數(shù)據(jù)清空,將此按鈕變灰,等待用戶輸入數(shù)據(jù),當(dāng)選擇材料力學(xué)性能單選按鈕時(shí),再?gòu)棾鼍W(wǎng)格控件,并將網(wǎng)格控件上方的靜態(tài)文本控件的標(biāo)題做出相應(yīng)的修改.在Cpage1類中添加“增加”按鈕IDC_BUTTONADD單擊消息響應(yīng)函數(shù)OnButtonadd().
在Cpage1類中添加單選按鈕“溫度下許用應(yīng)力”、“溫度下屈服極限”和“溫度下持久極限”的單擊消息響應(yīng)函數(shù),以修改網(wǎng)格控件上方的靜態(tài)文本控件的標(biāo)題.添加WM_CTLCOLOR消息響應(yīng)函數(shù)HBRUSH Cpage1::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor) ,將靜態(tài)文本標(biāo)題顏色修改為紅色.
“更新、保存”按鈕的功能實(shí)現(xiàn).首先將用戶輸入的數(shù)據(jù)形成一個(gè)結(jié)構(gòu)體,并得到新的鏈節(jié)點(diǎn)添加到鏈尾.此鏈?zhǔn)窃诤瘮?shù)OnInitDialog()中形成的.再將新增加的材料名稱及應(yīng)力類別數(shù)據(jù)寫入列表框的最后面.最后將該材料的數(shù)據(jù)寫入文件末尾;并將本按鈕變灰,恢復(fù)“增加”按鈕.
“刪除”按鈕的功能實(shí)現(xiàn).首先在列表框中捕獲用戶要?jiǎng)h除的材料表項(xiàng),將此表項(xiàng)刪除,然后從鏈表中刪除該材料對(duì)應(yīng)的結(jié)點(diǎn),并從文件中刪除該材料的數(shù)據(jù)(實(shí)際上重寫整個(gè)文件),并將最后一個(gè)結(jié)點(diǎn)的材料顯示在各個(gè)控件中.
最后還要添加列表框選中表項(xiàng)改變時(shí)的消息響應(yīng)函數(shù)OnItemchangedList1(),并將對(duì)應(yīng)的材料參數(shù)顯示在各個(gè)控件中以便用戶查看瀏覽.
“更新、保存”按鈕單擊響應(yīng)函數(shù)程序框圖如圖2所示.

圖2 “更新、保存”按鈕單擊消息響應(yīng)函數(shù)框圖Fig.2 The block diagram of message response function clicking update and save button
本模塊的運(yùn)行界面如圖1所示,在模塊目錄下生成一個(gè)文本文件.實(shí)踐表明不需第三方軟件的支持也可以進(jìn)行數(shù)據(jù)庫(kù)應(yīng)用程序的開發(fā).該方法不需要考慮數(shù)據(jù)源,也不需要考慮安裝目錄問(wèn)題;只有一個(gè)運(yùn)行文件.在數(shù)據(jù)量不太大的情況下,相比需要第三方軟件的數(shù)據(jù)庫(kù)開發(fā)方法,該方法簡(jiǎn)單、靈活.
致 謝
本人在學(xué)習(xí)MFC編程的過(guò)程中得到武漢工程大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院盧濤博士的指點(diǎn),在此表示衷心的感謝!
[1] GB150-2011.《壓力容器》[S].北京:中國(guó)標(biāo)準(zhǔn)出版社,2003.
GB150-2011.Pressure Vessels [S].Beijing:Standards Press of China,2003.(in Chinese)
[2] 王勇,申延平.在Visual C++中實(shí)現(xiàn)MSFlexGrid控件的網(wǎng)格編輯功能[J].電腦編程技巧與維護(hù),2001(10):45-47.
WANG Yong,SHEN Yan-ping.To achieve Mesh editing functionsof MSFlexGrid control in Visual C++ in[J].Computer Programming Skills & Maintenance,2001(10):45-47.(in Chinese)
[3] 范冠雄.基于Visual C++的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)比較研究[J].計(jì)算機(jī)與數(shù)字工程,2010,38(1):64-66.
FAN Guan-xiong.Visual C++ based database access technology comparison[J].Computer & Digital Eng ineering,2010,38(1):64-66.(in Chinese)
[4] 陳偉亞,劉芳芳.地理信息系統(tǒng)在水污染控制規(guī)劃中的應(yīng)用[J].武漢工程大學(xué)學(xué)報(bào),2013,35(1):21-26.
CHEN Wei-ya,LIU Fang-fang.Application of geographic information system technology in planning of water pollution control[J].Journal of Wuhan Institute of Technology,2010,32(7):9-14.(in Chinese)
[5] Microsoft Developer Network Library Visual Studio 6.0[EB/OL].http://download.csdn.net/download/medium_ck/3973780.[2012-06-12]