|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 1 樓
|
發表於: 星期二 八月 26, 2003 1:09 pm 文章主題: 自訂紙張的另種思維(轉貼) |
|
|
請參考這篇文章試試
應 用 開 發 中“ 定 制 紙 張” 打 印 的 技 巧
中 軟 總 公 司 周 獻 民
---- 隨 著 高 平 台 數 據 庫 技 術 在 各 行 各 業 的 廣 泛 應 用, 基 于WINDOWS/ WINDOWS NT 平 台 的 應 用 開 發 系 統 越 來 越 多 地 替 代 以 往 基 于DOS 平 台 的 桌 面 數 據 庫 系 統, 出 現 在 各 個 應 用 領 域。
---- 我 們 對 於 這 些 年 來 在 應 用 開 發 中, 不 斷 遇 到 定 制 格 式 紙 張 打 印 的 問 題, 也 積 累 了 一 定 的 經 驗 和 教 訓。 在 此 對 其 中 具 有 普 遍 意 義 的 部 分 做 一 個 大 致 的 陳 述, 希 望 能 夠 起 到“ 拋 磚 引 玉” 的 作 用, 供 大 家 參 考 指 正。
一、 按 定 制 紙 張 打 印 查 詢 或 統 計 結 果, 是 一 個 應 用 軟 件 系 統 中 不 可 或 缺 的 部 分
---- “ 定 制 紙 張” 主 要 指 打 印 結 果 需 在 指 定 格 式、 指 定 尺 寸 的 紙 張 上 打 印。 如 果 是 連 續 紙, 需 要 在 打 印 完 本 頁 內 容 後, 自 動 停 在 下 一 個 打 印 起 始 位 置 上 等 待 後 面 的 打 印 任 務, 否 則 就 會 出 現“ 跑 紙” 的 現 象。 這 種 需 求 主 要 是 出 於 行 業 或 職 能 的 需 要。 例 如: 稅 務 局 要 求 按 照15.2cm 乘 24.2cm 的 紙 張 尺 寸 打 印 稅 收 繳 款 書;
---- 按 照9.3cm 乘 18.9cm 的 紙 張 尺 寸 打 印 發 票 憑 單。
二、WINDOWS 操 作 系 統 實 現 定 制 紙 張 打 印 與DOS 系 統 的 不 同
---- 基 於 圖 形 界 面 的WINDOWS 系 統 下 的 打 印, 不 同 於 基 於 字 符 模 式 的DOS 系 統 下 的 行 式 打 印 方 式。 大 家 知 道WINDOWS 95 或 WINDOWS NT 控 制 面 板 中 有 一 個“ 打 印 機 管 理 器”, 打 印 紙 張 的 類 型 和 尺 寸 由 此 指 定。 在 上 述 稅 務 管 理 系 統 的 例 子 中, 操 作 人 員 需 要 在 開 具 稅 收 繳 款 書 之 前, 在 打 印 管 理 器 中, 按 指 定 尺 寸 設 置“ 自 定 義 紙 張”; 如 果 該 操 作 人 員 又 需 要 開 具 發 票 憑 單, 則 又 需 要 重 新 進 入 打 印 管 理 器 中 改 變 相 應 設 置。 如 此 操 作, 需 要 進 行 比 較 多 的 手 工 調 整, 勢 必 要 求 開 發 商 提 供 更 方 便 的 手 段, 而 我 們 目 前 使 用 的 開 發 工 具(PowerBuilder 、VisualBasic 等 等), 又 大 多 只 能 改 變 當 前 所 使 用 的 紙 張 類 型( 即 將 當 前 默 認 的A4 紙 改 為B5 紙 型), 而 不 能 提 供 直 接 調 整 打 印 紙 張 定 制 尺 寸 的 函 數。
三、 我 們 在WINDOWS 95 環 境 下 的 解 決 方 案
---- 在WINDOWS 95 中, 每 種 預 制 的 紙 張 在 系 統 中 都 有 一 個 默 認 的ID 號, 例 如:Us standard Fanfold( 美 標 寬 行 打 印 紙) 對 應 的ID 號 為39, 而“ 用 戶 定 義 的 尺 寸” 的 紙 張ID 號 為256, 我 們 可 以 通 過 調 用WINDOWS API 接 口 函 數, 來 直 接 修 改 該 自 定 義 紙 型 的 長 度 和 寬 度( 單 位 為0.1 毫 米)。
---- 每 種 打 印 機 都 會 提 供WINDOWS 95 下 的 驅 動 程 序( 後 綴 為 .drv), 例 如EPSON LQ1600K 打 印 機 的 驅 動 程 序 為Escp24sc.drv, 我 們 可 以 在 應 用 程 序 中 通 過 檢 索system.ini, 來 找 出 當 前 系 統 默 認 的 打 印 機 驅 動 程 序 名, 並 加 載 其 中windows 與 打 印 機 廠 商 約 定 的API 函 數ExtDeviceMode(), 來 相 應 調 整 打 印 紙 張 的 類 型 和 尺 寸, 其 中 通 過DEVMODE 結 構 指 定 的 參 數 包 括: 是 否 顯 式 地 彈 出 打 印 配 置 對 話 框; 是 否 從 緩 沖 區 取 得 配 置 參 數; 是 否 將 本 次 調 整 的 尺 寸 作 為 默 認 值 存 放 在 注 冊 表 和WIN.INI 中; 是 否 將 當 前 打 印 的 配 置 參 數 提 取 到 緩 沖 區 中。
… …
// 從SYSTEM.INI 中 取 得 打 印 驅 動 的 文 件 名,
並 使 用Load Library 加 載
lpfnDevMode = (LPFNDEVMODE)GetProcAddress
(hDriver,"EXTDEVICEMODE");
if (lpfnDevMode != NULL)
{
memset(&dmIn,0x00,sizeof(DEVMODE));
lstrcpy(dmIn.dmDeviceName,lpPrinter);
dmIn.dmSpecVersion = DM_SPECVERSION ;
dmIn.dmDriverVersion = 0 ;
dmIn.dmDriverExtra = 0 ;
dmIn.dmFields =
DM_COPIES|DM_PAPERSIZE|DM_PAPERLENGTH|DM_PAPERWIDTH ;
// 本 次 改 變 的DEVMODE 的 域 包 括 打 印 份 數、
紙 張 類 型、 該 型 的 長、 寬
dmIn.dmSize = sizeof(DEVMODE) ;
dmIn.dmCopies = 1 ; // 打 印 的 份 數 為1
dmIn.dmPaperSize = 256 ; // 使 用“ 自 定 義 紙 張” 的 類 型
dmIn.dmPaperLength = atoi(Length) ; // 指 定 的 紙 張 的 長
dmIn.dmPaperWidth = atoi(Width) ; // 指 定 的 紙 張 的 寬
// 對 於 繳 款 書 的 情 況,Length = '1270',Width = '3556'
wDevResult = lpfnDevMode(hWnd,hDriver,(LPDEVMODE)&dmOut,
lpPrinter,lpPntrInterface,(LPDEVMODE)&dmIn,NULL,
DM_IN_BUFFER|DM_OUT_BUFFER|DM_OUT_DEFAULT) ;
if (wDevResult == IDOK)
bDevMode = TRUE ;
else
bDevMode = FALSE ;
InvalidateRect(hWnd,NULL,TRUE);
}
FreeLibrary(hDriver) ;
break ;
四、 我 們 在WINDOWS NT 環 境 下 的 解 決 方 案
---- 在WINDOWS NT 中, 預 制 的 紙 張 類 型 比WINDOWS 系 統 下 略 多, 默 認 的ID 號 大 致 相 同, 但 其“ 用 戶 定 義 的 尺 寸” 的 紙 張ID 號 不 為256, 而 是 每 增 加 一 種 新 紙 張, 就 將 當 前 預 制 紙 張 最 大 的ID 號 加1, 賦 為 這 種 新 紙 張 的ID 號。 例 如: 當 前 預 制 紙 張 的 最 大 的ID 號 為135, 那 麼 再 增 加 的 定 制 尺 寸 紙 張 的ID 號 為136, 以 下 依 此 類 推。
---- 那 麼, 我 們 則 可 以 在 程 序 中, 通 過 開 發 工 具 中 改 變 當 前 紙 張 類 型 的 函 數, 來 直 接 將 當 前 的 紙 張 類 型 修 改 成136。
---- 例 如:
… …
choose case
case ( 新 紙 型 的 情 況)
dw_prn.modify("datawindow.print.paper.size = 136")
dw_prn.print()
… …
end choose
五、 需 要 注 意 的 一 些 問 題
---- 以 下 均 為 我 們 在 開 發 應 用 軟 件 系 統 中 遇 到 的 實 際 問 題。
---- 1、 windows 版 本 與 打 印 機 驅 動 程 序 版 本 的 差 異
---- 96 年 以 前, 大 家 廣 泛 使 用 的WINDOWS 3.2 是 一 個16 位 的 操 作 系 統, 打 印 機 廠 商 提 供 配 套 的 打 印 機 驅 動 程 序 也 都 是16 位 的 程 序。 而 後 操 作 系 統 慢 慢 向WINDOWS 95 過 渡, 隨 著 操 作 系 統 升 級 為32 位, 配 套 的 打 印 機 驅 動 程 序 也 逐 漸 更 新 成32 位 驅 動。 但 由 於 操 作 系 統 支 持“ 向 下 兼 容”, 所 以WINDOWS 95 也 基 本 相 應 支 持 以 前 的16 位 打 印 驅 動, 當 然 驅 動 程 序 中 有 關 接 口 的API 函 數 中 因 WINDOWS 95 新 變 動 的 部 分 將 被 省 略。 所 以, 我 們 在 執 行API 函 數 時, 需 要 注 意 打 印 驅 動 程 序 與windows\system 下 的unidrv.dll 版 本 相 對 應。 即 在windows 95 下, 如 果 打 印 驅 動 程 序 為32 位, 則 應 使 用32 位 的unidrv.dll; 如 果 打 印 驅 動 程 序 為16 位, 則 應 拷 貝 一 份WINDOWS 3.2 下 的16 位 的unidrv.dll, 以 便 於 我 們 在 後 面 的 調 整 尺 寸 的 應 用 程 序 能 夠 順 利 加 載 打 印 驅 動。
---- 2、 打 印 設 置 改 變 在 多 任 務、 多 線 程 系 統 下 的 時 間 差
---- 如 果 我 們 將 上 述 的 改 變 紙 張 尺 寸 的 應 用 程 序 單 獨 編 譯 成 為paper_size.exe, 然 後 在 系 統 中 采 取RUN(paper_size 紙 長 參 數 紙 寬 參 數) 的 方 式, 設 置 紙 張 尺 寸。 在WINDOWS 95 的 多 任 務 狀 態 時, 往 往 可 能 發 現 紙 張 尺 寸 尚 未 來 得 及 改 變, 便 已 開 始 執 行 打 印 任 務。 對 於 這 種 情 況, 我 們 可 以 采 取 在 程 序 中 加 入 適 量 的 延 時, 來 確 保 當 前 打 印 機 紙 張 尺 寸 的 改 變 已 經 生 效。
---- 當 然, 也 可 以 將 改 變 紙 張 尺 寸 的 應 用 編 譯 成 動 態 鏈 結 庫paper_size.dll, 這 樣 我 們 就 可 以 在 應 用 中 直 接 加 載 其 中 的 函 數 順 序 執 行。
---- 聯 系 電 話:(010)62174196
---- E_mail 地 址:zxm@rxic.com _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
|
奔跑的愛情
註冊時間: 2003-08-28 文章: 27
第 2 樓
|
發表於: 星期四 八月 28, 2003 4:06 pm 文章主題: |
|
|
好文! _________________ delphi vf sql |
|
回頂端 |
|
|
catjoke
註冊時間: 2003-06-16 文章: 175 來自: 香港
第 3 樓
|
發表於: 星期三 九月 10, 2003 2:59 pm 文章主題: |
|
|
可是, 怎樣處理 Print Margin?!
上下左右有 4mm, 特別是 Epson 印表機是不能印出來...
印 "8h" 會出了 "on" 來, 上面的 4mm 被殺了頭!!
還有, 雖然點出了問題: 不足一頁就不能印出來..
可是, 很多時印發票是不足一頁的!
除非整個程式離開才可以印下去...
否則, 就算印算打了程式:
SET PRINTER OFF
它仍舊不會印出來!!
你說你所寫的程式, 每印一次要離開一次, 方便不方便!? _________________ 喵喎~ 貓當然是 "茅" 的嘛! ^0^; |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|