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

如何取得元件上顯示的畫面內容

答題得分者是:william
Happyjalin
一般會員


發表:1
回覆:2
積分:0
註冊:2003-02-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-26 11:02:13 IP:211.76.xxx.xxx 未訂閱
是這樣的... 我想取得某一元件上顯示的畫面內容, 但是卻發現: 當該元件被其他視窗所遮蓋時, 我所取得的畫面內容會變成被遮蓋的畫面. 這是我採用的方式: procedure TForm1.BitBtn1Click(Sender: TObject); var DC: HDC; Canvas: TCanvas; MyBitmap: TBitmap; begin Canvas := TCanvas.Create; MyBitmap := TBitmap.Create; DC := GetDC( ColorGrid1.Handle ); try with ColorGrid1 do begin Canvas.Handle := DC; MyBitmap.Width := Width; MyBitmap.Height := Height; MyBitmap.Canvas.CopyRect(Rect(0, 0, Width, Height), Canvas, Rect(-10, -10, Width, Height)); end; finally ReleaseDC(0, DC); Image1.Picture.Graphic := MyBitmap; MyBitmap.Free; Canvas.Free end; end; 請問有無其他方式可以真正取得該元件的顯示內容,且不受被遮蔽而受影響呢?? 請多多指教
------
請多多指教
william
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-26 11:19:54 IP:147.8.xxx.xxx 未訂閱
http://www.fengyuan.com/article/wmprint.html For TWinControl, there is also a PaintTo method.
Happyjalin
一般會員


發表:1
回覆:2
積分:0
註冊:2003-02-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-26 13:59:06 IP:211.76.xxx.xxx 未訂閱
我照著他的sample code做, 失敗了 不知道我有無做錯... nad我發現在panel上畫的畫面也沒有辦法取出來耶... 我做一個player, 是使用別人的component 那個component是以TCustomControl為base class寫的 不知道還有無其他方式可以取得它上面顯示的畫面,且不會受遮蔽所影響 以下是我照著他的sample code所寫出來的code: procedure TPlayer.Button2Click(Sender: TObject); var hDCMem,hDCMem1 : HDC; hDC_ : HDC; rect: TRECT; hBmp: HBITMAP; hOld: HGDIOBJ; begin with panel1 do begin hDC_ := GetDC( Handle ); hDCMem := CreateCompatibleDC(hDC_); GetWindowRect( Handle , rect); hBmp := CreateCompatibleBitmap(hDC_, rect.right - rect.left, rect.bottom - rect.top); ReleaseDC( Handle, hDC_); hOld := SelectObject(hDCMem, hBmp); SendMessage(Handle, WM_PRINT, WPARAM(hDCMem), PRF_CHILDREN PRF_CLIENT PRF_ERASEBKGND PRF_NONCLIENT PRF_OWNED); SelectObject(hDCMem, hOld); DeleteObject(hDCMem); OpenClipboard(Handle); EmptyClipboard(); SetClipboardData(CF_BITMAP, hBmp); CloseClipboard(); end; end; 請多多指教
------
請多多指教
william
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-26 14:35:25 IP:147.8.xxx.xxx 未訂閱
If this is VCL, then you may want to try PainTo, e.g.
var
    Bmp: Tbitmap;
{...}
Bmp.Width := Ctl.Width; { Ctl is the control }
Bmp.Height := Ctl.Height;
with Bmp.Canvas do
    FillRect(ClientRect);
Ctl.PatintTo(Bmp.Canvas,0,0);
Happyjalin
一般會員


發表:1
回覆:2
積分:0
註冊:2003-02-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-26 15:05:38 IP:211.76.xxx.xxx 未訂閱
我一開始使用的就是利用Canvas, Canvas雖然可以如我所願地取出完整影像資料 但是卻有一個致命傷 就是 當該元件被其他元件換視窗所遮蔽時, 則取出的畫面就是被遮蔽的畫面 而不是我想取得的"該元件所應顯示的畫面". 我想了想, 會不會根本就沒有方法可以取出我想要的元件畫面呢?? 請多多指教
------
請多多指教
william
版主


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-26 15:16:44 IP:147.8.xxx.xxx 未訂閱
Tested with overlapping buttons, no problem:    
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
    with TWinControl(Sender) do begin
        Image1.Picture.Bitmap.Width := Width;
        Image1.Picture.Bitmap.height := Height;
        with Image1.Picture.Bitmap do begin
            Canvas.FillRect(ClientRect);
            PaintTo(Canvas,0,0);
        end;
    end;
end;
P.S. Image1 is a TImage I put on the form.
系統時間:2024-05-20 12:59:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!