在vfp中實現(xiàn)表單的輸出(一)時間:2007-05-09
- 說在前面 VB、Delphi 都為 Form 對象封裝了 PrintForm 方法,允許用戶方便的將 Form 轉(zhuǎn)換成為 BMP。這是一個不錯的功能,在實際開發(fā)過程中是經(jīng)常有這種需求的,比如把統(tǒng)計圖表作為圖片保存下來…… 然而很不幸的是 Visual FoxPro(包括即將登場的 7.0) 并沒有為我們封裝此種功能。這個問題一定困擾著不少狐友吧,包括我。雖然我們知道使用 Win API 就可以解決問題,實際編程卻又談何容易? 很高興得到了 George Tasker 編寫的“OBJ2BMP”工具,并得到了所有原始代碼。George Tasker 為我們提供了一個 Visual FoxPro 版的抓圖工具,但我認(rèn)為這個工具不見得實用——總不能在我們的應(yīng)用程序中老是要調(diào)用一個工具才能完成 PrintFrom 的工作吧,這樣既不專業(yè)也不美觀。于是我利用 George Tasker 提供的源代碼作了簡單的二次開發(fā),重新封裝了部分功能,希望能這個很棒的工具更合適開發(fā)人員使用。 原始代碼版權(quán)屬于 George Tasker,本文及二次開發(fā)的版權(quán)屬于 BOE 數(shù)據(jù)網(wǎng)絡(luò)工作室。該軟件屬于免費軟件,您可以隨意使用,但如果造成什么不良后果,我們不承擔(dān)任何責(zé)任。 以下所有討論均以“象素”為單位?。?! 使用 OBJ2BMP 工具 先讓我們來看看怎樣使用 George Tasker 為我們提供的 OBJ2BMP 工具吧! 編譯項目成為 obj2bmp.app 使用 obj2bmp.app 工具 新建一個表單,設(shè)定表單的 alwaysOnTop屬性為 .t.或者設(shè)定 alwaysOnBottom 屬性為.t.,運行表單。 在“命令窗口”中鍵入如下命令,并執(zhí)行: oObjPicker=.null. 如下圖: 右面的表單就是抓圖工具,請注意它下方的按下拉式列表框中列示了兩個對象:“抓圖”和“Select Object”(目的表單的Caption 屬性)?!白D”是指左面的表單,“Select Object”就是它自己。由于我們在下拉式列表框中選擇了“抓圖”表單,所以列表框中就列示了“抓圖”中的所有可視控件:表單、Olecontrol、Command,您可以選擇要抓拍的控件的名稱,按下“Capture”按鈕,您將得到該控件的當(dāng)前模樣的圖片。 對于畫面的質(zhì)量您也可以控制,24 Bit Color 質(zhì)量最好。 FormPrint 類的使用詳解 從開發(fā)人員的角度看“obj2bmp”工具,好像實用性不大,于是我對源代碼進(jìn)行了簡單的封裝。 必備的支持文件
關(guān)于 Foxtools.fll 的說明。Foxtools.fll 是 Visual FoxPro 自帶的 API 庫,默認(rèn)存放在 Home() 目錄下。在建立 FormPrint 類實例時(init 事件)檢測是否已對 Foxtools.fll 引用,如果沒有則執(zhí)行如下命令: set library to (home()+"foxtools.fll") addi 請務(wù)必保證 Home() 目錄下有此文件,如果您想把 Foxtools.fll放在其它地方,請修改以上語句。 引用 Foxtools.fll 的目地在于得到表單的句柄,在 Visual FoxPro 7 中每個表單都有句柄屬性,就不用麻煩 Foxtools.fll 了。 FormPrint 類的用戶接口
有關(guān) cFileName 屬性的說明。在使用 makebitmap 方法前設(shè)定此屬性,可指定圖片文件的名稱及輸出路徑。如: obj.cFileName="C:\BMP\abc.bmp" 將圖片文件保存在C:\BMP目錄下,文件名稱是abc.bmp。 如果執(zhí)行makebitmap方法時,目標(biāo)文件已經(jīng)存在,程序?qū)⒃诓煌ㄖ那闆r下覆蓋它;如果執(zhí)行 makebitmap 方法時文件不能建立(可能是目錄不存在、路徑無效、無法覆蓋已存在的文件……),程序?qū)⒅匦略O(shè)定圖片文件的名稱及保存目錄,新文件名及目錄是這樣確定: sys(5)+sys(2003)+"\"+left(sys(2015),8)+".bmp" 如果事先不設(shè)定 cFileName 屬性,使其保持默認(rèn)值 .null. 或設(shè)定 cFileName 為 .null. 值,程序也將使用“sys(5)+sys(2003)+"\"+left(sys(2015),8)+".bmp"”確定圖片的名稱及保存目錄。 每次圖片生成完畢,cFileName 屬性自動設(shè)定為 .null. 值。 有關(guān) makebitmap(pnhWnd, pnBPP, pnTop, pnLeft, pnHeight, pnWidth)方法的說明。 所有六個參數(shù)均可省略,但我建議調(diào)用時不要省略前兩個參數(shù)。 ——pnhWnd 代表被輸出表單的句柄。如果 PrintForm 實例化以后其父對象是被輸出表單的話,傳遞 0 即代表打印當(dāng)前表單;如果要打印其他表單的話,請使用如下代碼得到它的句柄,并以此句柄作為 pnhwnd 傳遞: _WhTohWnd(_WFindTitl(cCaption)) && cCaption 代表被輸出表單的 Caption 屬性。 ——pnBPP 代表輸出圖片的質(zhì)量。有三種選擇:4,8,24,數(shù)字越大質(zhì)量越好。 輸出整個表單 新建表單(實例一),添加控件。別忘了把 PrintForm 類加入表單,使之成為表單的子對象。如圖: A.最簡單的應(yīng)用,在“輸出”按鈕的“Click”事件中加入如下代碼: ThisForm.printform1.makebitmap(0,24) B.指定輸出目的地,在“輸出”按鈕的“Click”事件中加入如下代碼: Thisform.printform1.cFileName="C:\ABC.BMP" C.輸出其他表單。 建立一新表單(實例二),加入控件,運行。 在“實例一”表單的“輸出”按鈕的“Click”事件中加入如下代碼,運行: ThisForm.printform1.makebitmap(_WhTohWnd(_WFindTitl("實例二"))
,24) 如圖: |
|