輸出至印表機的 Canvas.TextOut() 可以調整字母距離嗎? |
尚未結案
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
若要非常彈性且精確, 當然計算會較複雜.
但若只想在某個寬度內調整字間隔, 並不需要複雜的計算. 欲佈滿的寬度(例如 Word 檔的左右邊界間的 Pixels 數), 減去字串全部的寬度(例如 Word 檔一列文字的 Pixels 數, Canvas.TextWidth(PrintString) ), 得到空白Pixels, 再將他平均分配到各字間(注意植數問題, 兩端有字, 間隔數=字數-1), 注意: 1 Byte 字元各算一個字, 中文每字也算一個字. 則列印每字後, 次字的 x = 本字的 x 本字的寬 固定的平均間隔. 此式並不複雜, 速度不會慢很多, 自行測試一下列印的起訖時間便知道. |
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
herbert2 大,謝了。
我這支程很難搞,它是報表程式,資料庫資料抓進來之後,跑出來的報表,全部以 Canvas.Text() 呈現在預覽畫面,一頁可以有一、兩百個文字方塊,兩個文字方塊可能是成對的,例如 "數量 單位",如果列印的時候修正字母之間的間隔,文字方塊之間可能會有文字重疊的情形。當然,我可以在預覽的 TForm.OnPaint 也修正字母間隔,但這樣我必須把每一個字母用文字方塊來呈現,換頁速度會很慢,但沒關係,更慘的是,我的報表是 "可以修改的",報表產生後,使用者可以自由新增、修改、移動、刪除、剪下、複製、貼上文字,甚至存檔下次再載進來修改,改到滿意之後,才去列印,如果每一個字母都獨立成一個文字方塊,使用者很難做修改,使用者不可能接受。 |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
的確有困難,不過,還是再描述一下。這是報表程式,資料庫抓到資料後用 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 發送簡訊給我 |
|
cancer
高階會員 發表:58 回覆:319 積分:190 註冊:2004-07-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |