全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1641
推到 Plurk!
推到 Facebook!

輸出至印表機的 Canvas.TextOut() 可以調整字母距離嗎?

尚未結案
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-01-26 16:53:04 IP:211.75.xxx.xxx 訂閱
各位好,

程式遇到一個奇怪問題,同一台電腦,同一台印表機,另一支程式和我的程式,字型都是細明體,也都是 11 點的字,但列印出來後,另一支程式字母之間的距離(水平方向)比較大,我的程式卻比較窄,文字變得比較擠壓,客戶要我做到跟另一支程式一樣,Canvas 沒有字距可以設定,說明裡面也查不到,有人知道解決方法嗎?
我用 TextOut() 另一支程式好像是用 TextRect(),該不會差在這裡吧?
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-01-26 20:33:12 IP:202.39.xxx.xxx 訂閱
自行計算 TextOut() 要用的 x 座標值, 每字印完後, x+=字寬+間隔, 再印次字, 可達所求.
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-01-28 15:25:10 IP:211.75.xxx.xxx 訂閱
herbert2 大,大部份字型,字母寬度都不相同,一個字一個字印出來,程式每列印一個字母,都要去算寬度,會很慢,我會被罵死。

===================引 用 herbert2 文 章===================
自行計算 TextOut() 要用的 x 座標值, 每字印完後, x =字寬 間隔, 再印次字,?可達所求.
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-01-28 16:31:08 IP:202.39.xxx.xxx 訂閱
若要非常彈性且精確, 當然計算會較複雜.
但若只想在某個寬度內調整字間隔, 並不需要複雜的計算.

欲佈滿的寬度(例如 Word 檔的左右邊界間的 Pixels 數),
減去字串全部的寬度(例如 Word 檔一列文字的 Pixels 數, Canvas.TextWidth(PrintString) ),
得到空白Pixels, 再將他平均分配到各字間(注意植數問題, 兩端有字, 間隔數=字數-1),
注意: 1 Byte 字元各算一個字, 中文每字也算一個字.

則列印每字後, 次字的 x = 本字的 x 本字的寬 固定的平均間隔.

此式並不複雜, 速度不會慢很多, 自行測試一下列印的起訖時間便知道.
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-01-28 19:40:41 IP:211.75.xxx.xxx 訂閱
herbert2 大,謝了。
我這支程很難搞,它是報表程式,資料庫資料抓進來之後,跑出來的報表,全部以 Canvas.Text() 呈現在預覽畫面,一頁可以有一、兩百個文字方塊,兩個文字方塊可能是成對的,例如 "數量 單位",如果列印的時候修正字母之間的間隔,文字方塊之間可能會有文字重疊的情形。當然,我可以在預覽的 TForm.OnPaint 也修正字母間隔,但這樣我必須把每一個字母用文字方塊來呈現,換頁速度會很慢,但沒關係,更慘的是,我的報表是 "可以修改的",報表產生後,使用者可以自由新增、修改、移動、刪除、剪下、複製、貼上文字,甚至存檔下次再載進來修改,改到滿意之後,才去列印,如果每一個字母都獨立成一個文字方塊,使用者很難做修改,使用者不可能接受。
herbert2
尊榮會員


發表:58
回覆:632
積分:878
註冊:2004-04-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-01-28 22:11:30 IP:202.39.xxx.xxx 訂閱
您開始只說要調間隔, 並未說是要給 User Edit 完再印.

小弟是用 MetaFile 做預覽及列印, 故不准 User 改, 但可先存檔等下次再叫出來印.

原則上, 要改內容, 最好是用 TEdit 較恰當, 改完在 Print 出去.
若要存檔再叫出來改, 小弟就幫不上忙了!
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-02-10 13:47:01 IP:220.128.xxx.xxx 訂閱
的確有困難,不過,還是再描述一下。這是報表程式,資料庫抓到資料後用 TForm.Canvas.TextOut() 一行一行顯示出來,要修改,用滑鼠點文字兩下,即顯示 TEdit 元件供修改,修改好 TEdit 自動隱藏,再呼叫 TForm.Invalidate() 更新畫面,列印時,使用 Print.erCanvas.Text(),所以,預覽和列印都是用 TextOut(),只是 Canvas 不同而已,Canvas 裡面找不到可以調整字距的屬性。
===================引 用 herbert2 文 章===================
您開始只說要調間隔, 並未說是要給 User Edit 完再印.

小弟是用 MetaFile 做預覽及列印, 故不准 User 改, 但可先存檔等下次再叫出來印.

原則上, 要改內容, 最好是用 TEdit 較恰當, 改完在 Print 出去.
若要存檔再叫出來改, 小弟就幫不上忙了!
t27
中階會員


發表:34
回覆:95
積分:90
註冊:2002-06-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-02-10 17:02:53 IP:61.224.xxx.xxx 訂閱
直接將報表產生 word 檔案後編輯,列印. 可以嗎?
cancer
高階會員


發表:58
回覆:319
積分:190
註冊:2004-07-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-03-09 16:09:52 IP:211.75.xxx.xxx 訂閱
應該不行,因為有些報表是套底圖列印的,轉出到 Word 後,位置難以配合底圖的特定位置。
沒關係,我原本是用細明體 10 點字,後來改用 11 點,就好多了。
===================引 用 t27 文 章===================
直接將報表產生 word 檔案後編輯,列印. 可以嗎?
系統時間:2017-10-18 6:31:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!