座標的轉換 canvas.textout 與解析度的差異在哪 |
尚未結案
|
isthatu
初階會員 發表:80 回覆:47 積分:25 註冊:2002-06-26 發送簡訊給我 |
請問螢幕畫布上的座標點 如何正卻轉換成報表的座標 即便是我們更動螢幕解析度 或印表機紙張大 在螢幕上輸出的文字間的相對位置 呈現在報表上都是一樣的 我現在遇到預覽OK 列印卻出現文字變小 整個文字的對應位置都跑掉了 假設 我們都已經抓到了 報表解析度
XDPM := GetDeviceCaps(Printer.Handle, LOGPIXELSX );
YDPM := GetDeviceCaps(Printer.Handle, LOGPIXELSY );
及螢幕幾析度
XDPM1 := GetDeviceCaps(canvas.Handle, LOGPIXELSX );
YDPM1 := GetDeviceCaps(canvas.Handle, LOGPIXELSY );
那麼在兩著間轉換過程中 paintbox.canvas.textout(x,y,str) = printer.canvas.textout(x,y,str) x y 座標該如何做處理 是否有特定的常數 例 (X * 100/XDPM ) 來讓螢幕預覽與鰾表列印不致發生 不相對應的現象 問的很模糊 因為實際做法我也不懂 只是我預覽跟報表的CANVAS 都是相同跑一段FUNCTION來畫一張表單 Draw(MyCanvas : TCanvas ; XDPM,YDPM:integer) 其中 MyCanvas 就是傳入 螢幕paintbox 跟printer 的TCanvas
而 XDPM,YDPM 是已經靠GetDeviceCaps來算縱橫向的解析度了 問題我在MyCanvas.textout(20.30,'abcde')位置 預覽跟實際報表就是不同 不曉得對繪圖座標比較熟的朋友能否指點迷津!!!
------
BCDEFHIJKLMNOPQRSTUVWXZ |
shieh2700
高階會員 發表:0 回覆:127 積分:100 註冊:2002-06-13 發送簡訊給我 |
針對上述問題: 印表機位置 = 螢幕位置 / 螢幕解析度 * 印表機解析度 假若下列情況: 螢幕解析度 96*96 DPI
印表機解析度 1440*1440 DPI
若在螢幕上顯示位置為 x=20,y=30 則在印表機上位置則應為: x = 20 / 96 * 1440 = 300
y = 30 / 96 * 1440 = 450
var res : TSize; begin res.cx := 20; res.cy := 30; res := PosConvert( Form1.Canvas.Handle, Printer.Handle, res ); ShowMessage( IntToStr( res.cx ) ', ' IntToStr( res.cy ) ); end; function PosConvert(sourceHDC, targetHDC: HDC; xy: TSize): TSize; var sDPI, tDPI : TSize; begin sDPI.cx := GetDeviceCaps( sourceHDC, LOGPIXELSX ); sDPI.cy := GetDeviceCaps( sourceHDC, LOGPIXELSY ); tDPI.cx := GetDeviceCaps( targetHDC, LOGPIXELSX ); tDPI.cy := GetDeviceCaps( targetHDC, LOGPIXELSY ); Result.cx := ROUND( xy.cx / sDPI.cx * tDPI.cx ); Result.cy := ROUND( xy.cy / sDPI.cy * tDPI.cy ); end; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |