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

為何在WIN98下無法列印!

尚未結案
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-12 19:40:31 IP:163.28.xxx.xxx 未訂閱
程式碼如下: PrintDialog1->Execute(); Prntr->BeginDoc() ; Chart1->PaintTo(Prntr->Handle,300,200); Prntr->EndDoc(); 結果我在WIN2000下印出來正常… 可是在WIN98下印出來卻是一片空白… 為什麼呢? 還有啊…我在BCB HELP中看TPrinter::Canvas的說明: Description Canvas represents the printing surface of a page. Use the Brush, Font, and Pen properties of the Canvas object to determine how drawing or text appears on the page. Note: C Builder canvases use device-dependent bitmaps to implement the Draw, StretchDraw, or CopyRect methods. Because of this, you can't use these methods with most printers. Instead, to create graphic images on the printers canvas, create a device-independent bitmap and draw it directly to the canvass Handle property. 是不是因為TPrinter::Canvas是device-dependent bitmaps的關係… 所以印不出來呢? 發表人 - superlarry 於 2003/05/12 23:08:03
tech_state
版主


發表:44
回覆:638
積分:641
註冊:2003-02-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-12 21:46:44 IP:203.204.xxx.xxx 未訂閱
superlarry, 您好 試試將印表機的驅動程式移除在重新安裝, 有時候不一定是程式的問題, 而是驅動程式的問題。 祝 好運 ======================= <>涵養怒中氣。謹防順口言。留心忙裡錯。珍惜有時錢。 <>是非終日有,不聽自然無 <>天下本無事,庸人自擾之
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-12 21:53:16 IP:163.28.xxx.xxx 未訂閱
可是我試了二台WIN98電腦的電腦… 和二台WIN2000的電腦… 試了二台印表機… 都是在98下才印不出東西! 同一台印表機在2000下才可以… 為什麼呢?
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-12 22:49:58 IP:61.59.xxx.xxx 未訂閱
superlarry 你好,   試試這段程式吧       Graphics::TBitmap* pBmp = new Graphics::TBitmap;    // set associated properties of pBmp    //...    TPrinter* pntr = new TPrinter;    pntr->Canvas->Lock();    Chart1->PaintTo(pBmp, 300, 200);    pntr->Canvas->Draw(0, 0, pBmp);    pntr->Canvas->Unlock();    delete pBmp;    delete pntr;    *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-13 10:43:09 IP:163.28.xxx.xxx 未訂閱
抱歉!我第一次PO那段英文說明時…因為是用複製貼上的… 所以you can't use these methods with most printers的 can't 變成can了!剛才改正了! 我照Royce520的方法做了一次…程式碼如下: PrintDialog1->Execute(); Graphics::TBitmap* pBmp = new Graphics::TBitmap; TPrinter* pntr = Printer(); pntr->BeginDoc(); pntr->Canvas->Lock(); Chart1->PaintTo(pBmp, 300, 200); pntr->Canvas->Draw(0, 0, pBmp); pntr->Canvas->Unlock(); pntr->EndDoc(); delete pBmp; 這樣反而連在2000下印出來都是空白的了! 是我哪裡做錯了嗎?
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-13 14:51:08 IP:61.59.xxx.xxx 未訂閱
Supperlarry 你好,    不好意思, 沒有寫清楚些...麻煩你再試一下 好嗎       Graphics::TBitmap* pBmp = new Graphics::TBitmap;    pBmp->PixelFormat = pf24bit;    pBmp->Width = 200;    pBmp->Height = 200;    TPrinter* pntr = new TPrinter;    // 請記得調整... 相關設定... 不然印出來大小 會差很多喔    pntr->BeginDoc();    pntr->Canvas->Lock();    Chart1->PaintTo(pBmp->Canvas, 0, 0);    pntr->Canvas->Draw(0, 0, pBmp);    pntr->Canvas->Unlock();    pntr->EndDoc();       delete pBmp;    delete pntr; <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-13 16:53:23 IP:147.8.xxx.xxx 未訂閱
In your codes you are using device dependant bitmaps and I think you should use device independant bitmaps instead.  href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21090">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21090
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-05-13 22:36:59 IP:163.28.xxx.xxx 未訂閱
感謝Royce520和william… 我用了Royce520後來PO的那個方法… Royce520的第一個方法不行的原因就是因為我沒有設定BITMAP的長、寬 和pBmp->PixelFormat… 我以前好像也犯過這種錯誤…謝謝Royce520的提醒… 而且很神奇的… HELP裡面不是說TPrinter::Canvas不能用StretchDraw嗎? 可是我用了下面的程式碼… PrintDialog1->Execute(); Graphics::TBitmap* pBmp = new Graphics::TBitmap; pBmp->PixelFormat = pf24bit; pBmp->Width = 361; pBmp->Height = 217; TPrinter* pntr = Printer(); pntr->BeginDoc(); pntr->Canvas->Lock(); Chart1->PaintTo(pBmp->Canvas, 0, 0); pntr->Canvas->StretchDraw(TRect(0,0,800,800), pBmp); pntr->Canvas->Unlock(); pntr->EndDoc(); delete pBmp; 在98或在2000下都可以印出來ㄟ! 哎…愈弄愈混亂了! 因為學校沒有98的電腦…所以要測試都要拜託別人測試…很麻煩… 等下星期回家在好好試試看到底是差在哪裡! 發表人 - superlarry 於 2003/05/13 22:38:50 發表人 - superlarry 於 2003/05/14 12:00:22
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-05-14 10:01:54 IP:147.8.xxx.xxx 未訂閱
引言:而且很神奇的… HELP裡面不是說TPrinter::Canvas不能用StretchDraw嗎?
You can use StretchDraw on SOME printers only, so I think you would better create a device independentbitmap and use the API StretchDIBits using the pritner's handle.
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-14 10:46:39 IP:163.28.xxx.xxx 未訂閱
請問一下william 那Royce520那個方法是算用device dependent bitmap的囉! 我昨天翻了一下書! 發現device dependent和independent差在一個有調色盤一個沒有… 所以即使在同一台電腦的同一台顯示器上… 二張device dependent的BITMAP圖片看起來顏色也不一樣… 那如果我只是要印出黑白圖形…顏色不重要的話… 是不是不一定要用device independent bitmap? 還是說要列印的話… device independent bitmap不光是顏色會出問題… 甚至會全部印不出來?
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-14 11:07:57 IP:147.8.xxx.xxx 未訂閱
引言: 請問一下william 那Royce520那個方法是算用device dependent bitmap的囉! Not sure but I think it is device dependent. You can set its HandleType to bmDIB for a DIB. However I have rather bad experience relying on this property of TBitmap to obtain a DIB long ago when Delphi first introduces it, so I personally prefer using the function GetDIB. 我昨天翻了一下書! 發現>> < face="Verdana, Arial, Helvetica">
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-14 12:41:41 IP:163.28.xxx.xxx 未訂閱
我發現在william提到的這篇文章中 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21090 領航天使站長一開始說: 「我用下面的指令 var s,d:trect; begin s.left:=0; s.top:=0; s.right:=20; s.bottom:=20; d:=s; image1.canvas.copyrect(d,form1.canvas,s); printer.begindoc; printer.canvas.copyrect(d,image1.canvas,s); printer.enddoc; end; 果真Image1有Printer出不來,說不定那句話說的是真的! 」 這是因為 Image1->Picture->Bitmap->PixelFormat=pf24bit; Image1->Picture->Bitmap->Width = 361; Image1->Picture->Bitmap->Height = 217; 這三個值沒有先設好… 如果這三個值先設定好再作上面的動作… 印表機也印得出來了… 這也是為什麼他們後來提到要先LOAD一張BITMAP進來才可以… 可能LOAD進來後會自己設好PixelFormat、Width、Height這些值…
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-14 16:41:08 IP:147.8.xxx.xxx 未訂閱
引言: 我發現在william提到的這篇文章中 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=21090 領航天使站長一開始說: 「我用下面的指令 var s,d:trect; begin s.left:=0; s.top:=0; s.right:=20; s.bottom:=20; d:=s; image1.canvas.copyrect(d,form1.canvas,s); printer.begindoc; printer.canvas.copyrect(d,image1.canvas,s); printer.enddoc; end; 果真Image1有Printer出不來,說不定那句話說的是真的! 」 這是因為 Image1->Picture->Bitmap->PixelFormat=pf24bit; Image1->Picture->Bitmap->Width = 361; Image1->Picture->Bitmap->Height = 217; 這三個值沒有先設好… 如果這三個值先設定好再作上面的動作… 印表機也印得出來了… 這也是為什麼他們後來提到要先LOAD一張BITMAP進來才可以… 可能LOAD進來後會自己設好PixelFormat、Width、Height這些值…
After looking at the TBitmap VCL source. Setting PixelFormat to pfXBit will convert the bitmap into a DIB. 發表人 -
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-05-14 18:44:55 IP:61.59.xxx.xxx 未訂閱
superlarry 你好,   還記得 給你的第二次範例中有提到: // 請記得調整... 相關設定... 不然印出來大小 會差很多喔 在你的應用中最重要是大小的問題吧, 如果是顏色的話, 那麼處理的 問題相對複雜了些, 正確的處理方式 我想也不是透過, 建立了不同 device 的 DIB Bitmap, 然後做圖形轉換就可以的, 這部份是色彩 處理的範疇. 回到這個問題上, 正是因為不同 device 之間的資料點 寬度特性不同(如 pixel 怎麼轉換成 dpi 的問題)所造成. 在DIB Bitmap 中有所謂的 biXPixelsPerMeter 與 biYPixelsPerMeter 兩的屬性, 正是說明了這不同 device 間長寬轉換的關係... 因此, 透 過這個動作 就可以進行合理的轉換比例.... 恩, 之前 我使用的 bitmap 就是 device dependent 的, 所以如果你 把他直些印出 不做 stretch 的話, 那麼它通常會很小(要看列表機就 是了), 要解決這個問題呢 除了建立列表機的 DIB bitmap 之外, 你 還可以自己取得列表機的特性(使用 GetDeviceCaps 配合上正確的參數) 來做放大縮小 <><>*真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
superlarry
一般會員


發表:10
回覆:22
積分:6
註冊:2002-10-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-05-15 00:17:53 IP:163.28.xxx.xxx 未訂閱
嗯…我統整一下大家給我的寶貴意見… 因為HELP裡面提到: Note: C++Builder canvases use device-dependent bitmaps to implement the Draw, StretchDraw, or CopyRect methods. Because of this, you can't use these methods with most printers. Instead, to create graphic images on the printers canvas, create a device-independent bitmap and draw it directly to the canvass Handle property.    為了怕有些印表機不吃device-dependent bitmaps 所以我們不能用pntr->Canvas->StretchDraw來對圖做放大縮小… 而要用StretchDIBits直接把圖畫到pntr->Handle    程式如下: TPrinter *Prntr = Printer(); Graphics::TBitmap *bmp= new Graphics::TBitmap; unsigned InfoSize,BitSize; bmp->Width=500;//這二個值一定要設,不然GetDIBSizes會錯 bmp->Height=500; Chart1->PaintTo(bmp->Canvas,0,0); GetDIBSizes(bmp->Handle,InfoSize,BitSize); LPBITMAPINFO lpBi=(LPBITMAPINFO)new BYTE[InfoSize]; LPBYTE lpBits=new BYTE[BitSize]; GetDIB(bmp->Handle,bmp->Palette,lpBi,lpBits);    Prntr->BeginDoc() ; StretchDIBits(Prntr->Handle,0,0,800,800,0,0,bmp->Width,bmp->Height,     lpBits,lpBi,DIB_RGB_COLORS,SRCCOPY); Prntr->EndDoc();    delete bmp; delete lpBi; delete lpBits;    這樣對吧!    而william大大有提到: 只要設定bmp->PixelFormat就會把bmp變成device-independent bitmaps    請問william大大有沒有方法可以從bmp中取出LPBITMAPINFO和LPBYTE這二個 在StretchDIBits中要用的到參數呢? 這樣會方便多…    又請問Royce520大大… biXPixelsPerMeter和biYPixelsPerMeter這二個屬性為什麼 我在TBitmap中找不到 是在哪裡呢? 還有我不太懂要如何建立列表機的
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-05-15 09:47:32 IP:147.8.xxx.xxx 未訂閱
> >
系統時間:2024-05-02 23:19:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!