線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1494
推到 Plurk!
推到 Facebook!

如何擷取某元件內的圖(含不可視範圍)?

答題得分者是:jcjroc
mysteriousGE
一般會員


發表:4
回覆:3
積分:1
註冊:2011-03-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-10-26 14:24:09 IP:60.251.xxx.xxx 訂閱
 
我現在使用的是BCB6中的TdxFlowChart元件

現在想要製作預覽列印的功能 也就是我希望將TdxFlowChart中「整個畫面」擷取出來

存入某Canvas以製作預覽列印的功能

所謂「整個畫面」是包含捲軸捲動後可視的範圍


目前嘗試過 使用Handle、GetDC()等方式從螢幕上直接擷取畫面

但這個方法無法取得「不可視」範圍的圖,除此之外也可能擷取到某些檔在前面的視窗畫面

故不是很妥當...


請問有什麼方式可以取得TdxFlowChart上「整個圖」呢?

請給我一點方向~~ 謝謝各位版友!


編輯記錄
mysteriousGE 重新編輯於 2011-10-26 00:25:28, 註解 無‧
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-10-26 19:47:07 IP:211.23.xxx.xxx 訂閱
你確認該元件也會對無效顯示區做繪圖動作????
你可以對那個元件的DC assign一個Bitmap ,但有一個問題,你不知要多大的Bitmap.
別抱太大希望拿到完整的圖.
mysteriousGE
一般會員


發表:4
回覆:3
積分:1
註冊:2011-03-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-11-02 10:20:19 IP:60.251.xxx.xxx 訂閱
 謝謝您的回覆~

嗯...仔細想了想不可視範圍的確沒有實際繪圖..

那我該如何取得該元件的整個繪圖呢?

我不是很懂你說的Assign一個Bitmap是什麼意思...

應該在什麼時間點Assign給那個元件呢?
mysteriousGE
一般會員


發表:4
回覆:3
積分:1
註冊:2011-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-11-09 16:15:12 IP:60.251.xxx.xxx 訂閱
 參考此篇文章,我找到答案了!!

雖然有部份的Code我不是很懂為什麼要這樣寫,但土法煉鋼把他拼出來了

我詳細的Code如下:

(※我要列印的圖假設是只有橫向捲軸出現的情況,所以特別擷取橫向畫布寬度)


//先算出畫布總寬度
int oriLeftEdge = dxFlowChart_Main->LeftEdge;
dxFlowChart_Main->LeftEdge = TO_END;
int canvasWidth = dxFlowChart_Main->LeftEdge dxFlowChart_Main->Width;
dxFlowChart_Main->LeftEdge = oriLeftEdge;
Graphics::TBitmap* memoryBitmap = new Graphics::TBitmap;
memoryBitmap->Width = canvasWidth;
memoryBitmap->Height = dxFlowChart_Main->ClientHeight;
TPoint Position;
TControl* flowChartControl = ((TControl*) dxFlowChart_Main);
int iSaveIndex = SaveDC(memoryBitmap->Canvas->Handle);
GetViewportOrgEx( memoryBitmap->Canvas->Handle, &Position);
SetViewportOrgEx( memoryBitmap->Canvas->Handle, Position.x - flowChartControl->Left, Position.y - flowChartControl->Top, NULL);
IntersectClipRect(memoryBitmap->Canvas->Handle, 0, 0, canvasWidth , flowChartControl->ClientHeight);
flowChartControl->Perform(WM_ERASEBKGND, (int)memoryBitmap->Canvas->Handle, 0);
flowChartControl->Perform(WM_PAINT, (int)memoryBitmap->Canvas->Handle, 0);
RestoreDC(memoryBitmap->Canvas->Handle, iSaveIndex);
PrintCanvas->CopyRect(Rect(0,0,pageRightBound,dxFlowChart_Main->Height),memoryBitmap->Canvas,Rect(0,0,canvasWidth,dxFlowChart_Main->Height));



打完收工!!

感謝曾經回應的大大!

編輯記錄
mysteriousGE 重新編輯於 2011-11-09 01:15:57, 註解 無‧
mysteriousGE 重新編輯於 2011-11-09 01:16:36, 註解 無‧
mysteriousGE 重新編輯於 2011-11-09 01:16:54, 註解 無‧
mysteriousGE 重新編輯於 2011-11-09 01:17:41, 註解 Code都貼不好,改為純文字‧
系統時間:2017-10-19 5:57:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!