  | 
				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^; | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |