張 靖,黃海英,穆立茂
(解放軍軍械工程學院,河北 石家莊 050003)
Pro/TOOLKIT開發工具包,是Pro/ENGINEER(簡稱Pro/E)提供的實現參數化設計的應用程序接口(API)。其封裝了許多針對Pro/E底層資源調用的庫函數與頭文件,借助第三方編譯環境(如VC等)進行調試,可以開發出能夠與Pro/E的無縫連接的應用程序[1]。
對話框是實現人機交互的重要通道。目前對話框的開發方式有兩種:UI對話框和MFC對話框。雖然利用Pro/TOOLKIT提供的UI對話框與Pro/E界面風格相一致,但不足之處是用文本文件的形式定義對話框,不能直觀地反映界面的布局。而MFC是VC++程序的一個重要軟件資源,使用MFC可以充分利用VC++開發環境的先進技術的工具,實現程序界面的可視化設計,與UI對話框相比,使用MFC的對話框界面布局上更為容易,設計、修改和調試更為方便。
MFC對話框的顯示方式分為兩種:模態對話框和非模態對話框。
模態對話框(Mode):在模態對話框激活狀態下,不允許用戶再選擇或激活其他窗口,只有在模態對話框關閉之后,用戶才能對其他窗口進行操作。模態對話框的設計比較簡單,但在Pro/E中使用有些不配套。
非模態對話框(Modeless):在非模態對話框激活狀態下,用戶可以激活其他窗口,激活其他窗口之后,非模態對話框處于非活動狀態;只要用鼠標重新選中非模態對話框,就可以激活它。
非模態對話框使用更為靈活。模態對話框激活時,不能使用其他窗口,這與Pro/E的慣例不相符,從而使得有些功能無法實現,比如查詢長度時需要和主界面交互數據。因此,一般情況下,我們使用MFC的非模態對話框。
編輯控件(Edit Control)是對話框實現鍵盤輸入的重要的人機交互接口。通過編輯控件,用戶可以輸入文本信息,并將輸入信息轉換為各種類型的數據。然而由于Pro/E對中文的支持得不夠完善,在使用Edit Control控件編程過程中,當此控件位于非模態對話框中時不能輸入中文。
針對這個問題,在《Pro/ENGINEER二次開發技術基礎》著作中提出了一種解決方案[3],就是建立模態對話框,然后在模態對話框中使用Edit Control控件,這樣就可以接收中文輸入了,也就是通過模態對話框進行中轉。然而這種方案存在兩方面不足:
一是與Pro/E軟件的整體風格不一致,其軟件的風格是絕大多數對話框使用非模態對話框。
二是此模態對話框不是純粹的模態對話框。雖然采用的是模態對話框,但Pro/E主窗口仍然能接收到鼠標消息。比如:在打開模態對話框的環境下,如果不小心單擊了Pro/E主窗口上的“新建”按鈕,雖然“新建”功能不會立即執行,但是當退出模態對話框后,“新建”功能會馬上實現,也就是會立刻彈出一個“新建”對話框。所以在Pro/E環境下基于MFC開發的模態對話框,不是真正意義上的模態對話框。因此這種方案還不夠理想,下面提供另外一種解決方案。
首先進行問題分析,出現在非模態對話框中Edit Control控件不能接收中文的這種情況的原因是:輸入的文本先被Pro/E翻譯,然后才傳到對話框資源中,在這個轉換過程中,就會出現亂碼。
因為使用的是非模態對話框,而使用模態對話框就不會出現這個問題。因為非模態對話框和Pro/E的主對話框是同時進行工作的,這個時候如果響應一個消息,是Pro/E的主窗口首先響應這個消息,然后經過翻譯,才傳到開發者設計的對話框當中,所以是在這個轉換過程中出現了BUG,造成顯示結果是亂碼。
下面就提供一種解決方案:
(1)第一步。為Edit Control控件的EN_SETFOCUS消息添加消息處理函數,代碼如下:
(2)第二步。為Edit Control控件的EN_KILLFOCUS消息添加消息處理函數,代碼如下:
當點擊Edit Control控件時,也就是輸入的焦點放到了Edit Control控件上面,這時就產生一次EN_SETFOCUS消息,在這個消息處理函數中,建立一個新的消息循環,這個消息循環是不經過Pro/E主程序的當前的消息循環,這時候輸入的數據直接進入對話框當中,不經過再進行翻譯。
當離開Edit Control控件結束了輸入操作,這時就產生一次失去焦點EN_KILLFOCUS消息,在這個消息處理函數中,使用PosTQuiTMessage(0)命令,結束開發人員建立的消息循環。也就是當點擊開始輸入的時候和退出輸入的時候,這之間建立了一個消息循環,使得輸入的文字直接傳遞到對話框當中。圖1是此解決方案在齒輪參數化設計程序中的應用實例(實例是使用Pro/E 4.0版本搭配Visual Studio 2008進行開發的)。
圖1 Pro/E參數化設計生成內齒輪界面
Pro/TOOLKIT是Pro/E系統中功能強大的二次開發工具,使用Pro/TOOLKIT進行專業化應用程序設計、創建和調試是一種最佳的選擇。此文針對Pro/E的一個BUG提出了一種有效的解決方法,為開發過程中遇到的Edit Control控件不能錄入中文的問題提供了一種新思路。
[1]李世國.Pro/Toolkit程序設計[M].北京:機械工業出版社,2003.
[2]Parametric Technology Corporation.Prop ToolkiTUser’s Guide[M].USA:Parametric Technology Corporation,2004.
[3]吳立軍.Pro/ENGINEER二次開發技術基礎[M].北京:電子工業出版社,2006.