遇到难题,怎样将一个Penel上的东西(文字和图形)保存为一个BMP??真的不知怎么下手了,请大家不吝指教; 不明白什么意思!是不是要将panel上的label, shape, image所显示的东西保存到一个bmp中? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 搞了半天,坐标转换还没搞定,你自己看看,能不能把坐标转换一下。搞定了告诉我一下。procedure TForm1.Button1Click(Sender: TObject);var dc: hdc; Mycan: Tcanvas; R: TRect; Mybmp:TBitmap; p, CP:TPoint ;begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := TCanvas.Create; {屏幕截取} dc := GetWindowDC(0); try p.x:= panel1.left; p.y:=panel1.top; CP:= ClientToScreen(p); Mycan.Handle := dc; R := Rect(cp.x ,cp.y, panel1.Width, panel1.Height); Mybmp.Width := R.Right; Mybmp.Height := R.Bottom; Mybmp.Canvas.CopyRect(R, Mycan, R); mybmp.SaveToFile('c:\test.bmp'); finally releaseDC(0, DC); mycan.Free; mybmp.Free; end;end; : kevin_gao(困了!累了!睡觉了!) :抓下的是张空白图片,什么都没有的,这是什么原因? 稍微修改一下~~呵呵~~procedure TForm1.Button3Click(Sender: TObject);var dc: hdc; Mycan: Tcanvas; R: TRect; Mybmp:TBitmap; p, CP:TPoint ;begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := TCanvas.Create; {屏幕截取} dc := GetWindowDC(0); try p.x:= Panel1.Left; p.y:= Panel1.Top; CP:= ClientToScreen(p); Mycan.Handle := dc; R := Rect(CP.x,CP.y,CP.x+Panel1.Width,CP.y+Panel1.Height); Mybmp.Width := Panel1.Width; Mybmp.Height := Panel1.Height; Mybmp.Canvas.CopyRect(Mybmp.Canvas.ClipRect,Mycan,R); mybmp.SaveToFile('E:\test.bmp'); finally releaseDC(0, DC); mycan.Free; mybmp.Free; end;end; kevin_gao(困了!累了!睡觉了!),tikkypeng(一两狂死郎之天衣有缝): 太谢谢你了。。我试以下,要是可以了马上给分:) 是啊~~~sos_zqx(踏破铁鞋)你是不是看错了啊?? 我的真的是空白图呀procedure Tfrm_dkkb.BitBtn1Click(Sender: TObject);var dc: hdc; Mycan: Tcanvas; R : TRect; Mybmp:TBitmap; p, CP:TPoint ;begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := TCanvas.Create; {屏幕截取} dc := GetWindowDC(0); try p.x:= panel2.left; p.y:=panel2.top; CP:= ClientToScreen(p); Mycan.Handle:= dc; R:= Rect(cp.x ,cp.y, panel2.Width, panel2.Height); Mybmp.Width:= R.Right; Mybmp.Height:= R.Bottom; Mybmp.Canvas.CopyRect(R, Mycan, R); mybmp.SaveToFile('d:\test.bmp'); finally releaseDC(0, DC); mycan.Free; mybmp.Free; end;end;代码基本没有改变呀。。为什么我的不行??我的penel上有文字和图形的呀 老大~~~~你看看我的话啊~~~~~要修改一下的~~~老大~~~~你看看我的话啊~~~~~要修改一下的~~~老大~~~~你看看我的话啊~~~~~要修改一下的~~~老大~~~~你看看我的话啊~~~~~要修改一下的~~~稍微修改一下~~呵呵~~procedure TForm1.Button3Click(Sender: TObject);var dc: hdc; Mycan: Tcanvas; R: TRect; Mybmp:TBitmap; p, CP:TPoint ;begin Mybmp := Tbitmap.Create; {建立BMPMAP } Mycan := TCanvas.Create; {屏幕截取} dc := GetWindowDC(0); try p.x:= Panel1.Left; p.y:= Panel1.Top; CP:= ClientToScreen(p); Mycan.Handle := dc; R := Rect(CP.x,CP.y,CP.x+Panel1.Width,CP.y+Panel1.Height); Mybmp.Width := Panel1.Width; Mybmp.Height := Panel1.Height; Mybmp.Canvas.CopyRect(Mybmp.Canvas.ClipRect,Mycan,R); mybmp.SaveToFile('E:\test.bmp'); finally releaseDC(0, DC); mycan.Free; mybmp.Free; end;end; 是没有问题。你不要在这段代码中设置断点,那样会取得ide窗口的东西。tikkypeng(一两狂死郎之天衣有缝),偶忘了加两个东东了,偶说怎么不对来着,看来还是菜了点。 function GetDesktopBitmap(mBitmap: TBitmap): Boolean;{ 取得当前屏幕背景图案 }var vDesktopHWnd: THandle; vDesktopDC: HDC;begin Result := True; with mBitmap do try vDesktopHWnd := GetDesktopWindow; vDesktopDC := GetDC(vDesktopHWnd); Width := Screen.Width; Height := Screen.Height; BitBlt(Canvas.Handle, 0, 0, Width, Height, vDesktopDC, 0, 0, SRCCOPY); ReleaseDC(vDesktopHWnd, vDesktopDC); except Result := False; end;end; { GetDesktopBitmap } tikkypeng(一两狂死郎之天衣有缝)你的分肯定够多了,这个分就少要点吧,偶很可怜的。 :) 呵呵~~zswang(伴水)(伤心中)师兄啊~~~你也让着我一点啊~~~ 试试这个,先Uses个Gridsprocedure TForm1.Button1Click(Sender: TObject);var Mem: TBitmap; Rect: TRect;begin Mem := TBitmap.Create; Rect := Panel1.ClientRect; Mem.Width := Panel1.Width; Mem.Height := Panel1.Height; Mem.Canvas.CopyRect(Rect, TDrawGrid(Panel1).Canvas, Rect); Mem.SaveToFile('c:\g.bmp'); Mem.Free;end; 应该好了吧?tikkypeng(一两狂死郎之天衣有缝)的代码能用的。 //这是需要的?//不用给我分!function GetDesktopBitmap(mBitmap: TBitmap; mRect: TRect): Boolean;{ 取得当前屏幕背景图案 }var vDesktopHWnd: THandle; vDesktopDC: HDC;begin Result := True; with mBitmap do try vDesktopHWnd := GetDesktopWindow; vDesktopDC := GetDC(vDesktopHWnd); Width := mRect.Right - mRect.Left; Height := mRect.Bottom - mRect.Top; BitBlt(Canvas.Handle, -mRect.Left, -mRect.Top, mRect.Right, mRect.Bottom, vDesktopDC, 0, 0, SRCCOPY); ReleaseDC(vDesktopHWnd, vDesktopDC); except Result := False; end;end; { GetDesktopBitmap }procedure TForm1.Button1Click(Sender: TObject);var vRect: TRect;begin GetWindowRect(Panel1.Handle, vRect); GetDesktopBitmap(Image1.Picture.Bitmap, vRect);end; zswang(伴水)(伤心中): ,。。谢谢。。也收我做师弟把呜呜,,分我到底怎么给呢不过还有一点问提。好象坐标转换有问题。用PENEL的坐标带进去就抓到空白。。 师弟与我的作品都可以实现需要不同的是我的是取当前屏幕 如果Panel被其它程序的窗体挡住时就会把它也一起提出来他的是取当前Form 不会被其它程序影响比较合理 Panel的坐标时相对于它的容器的用GetWindowRect(Panel1.Handle, vRect);可以得到绝对坐标 zswang,偶有点疑问,谁是师傅? 师傅姓唐名三藏zswang偷偷地递一本书给xzgyb“这是师傅的绝技是用VC写的,你给我翻译成Delphi”xzgyb一看书名<<葵花宝典6.0>>! “师弟”一下太多了导演说:“不许!”委屈xzgyb 当白马先待你翻译完葵花宝典我当极力向导演推荐 to xzgyb(老达摩): 误会啊,英雄! 只看 xzgyb 头也不会的飞走了(忘了用道具,摔了一交,从身上掉了两本书--<<葵花宝典7.0>>和<<葵花宝典7.0补丁>>) to sos_zqx(踏破铁鞋): “别多说快挑担子” to Bob7946(X度空间): 跟我说话吗?不是跟我说话的吧?认错人啦! 哈哈,zswang,客气啦太抬举我了,英雄,头一次听到有人这么说不过据我了解,<<葵花宝典>>早已问世江湖人物人手一本,呵呵哈哈,老狼,没关系,虽然我是老达摩但我们可以是忘年交吗,哈哈 to xzgyb(老达摩):老人家今年高龄?听说<<葵花宝典>>很厉害,不知你的少林72艺与之相比如何? 如何在delphi7中插入的图片上画点 请教以函数方式给数组赋值的写法? 如何保存每个进程只HOOK一次?? 请介绍几本数据库的书籍? 谁用过这样的sql语句(delphi中)再现等待 关于CHART 图 的 BAR 柱子大小控制,急,。急 ,求救,马上给分 文件拷贝 query filter 关于MaskEdit的问题! 请问用ADOquery怎么写SQL语句?我想在SQL SERVER中建新表。 如何能在两台计算机之间复制文件,不能用共享! 请问用WINSOCK编程发送邮件,如何判断是否需要SMTP验证?如何进行验证?(不是用控件,看清楚)
var
dc: hdc;
Mycan: Tcanvas;
R: TRect;
Mybmp:TBitmap;
p, CP:TPoint ;
begin
Mybmp := Tbitmap.Create; {建立BMPMAP }
Mycan := TCanvas.Create; {屏幕截取}
dc := GetWindowDC(0); try
p.x:= panel1.left;
p.y:=panel1.top;
CP:= ClientToScreen(p); Mycan.Handle := dc;
R := Rect(cp.x ,cp.y, panel1.Width, panel1.Height);
Mybmp.Width := R.Right;
Mybmp.Height := R.Bottom;
Mybmp.Canvas.CopyRect(R, Mycan, R);
mybmp.SaveToFile('c:\test.bmp');
finally
releaseDC(0, DC);
mycan.Free;
mybmp.Free;
end;
end;
抓下的是张空白图片,什么都没有的,这是什么原因?
var
dc: hdc;
Mycan: Tcanvas;
R: TRect;
Mybmp:TBitmap;
p, CP:TPoint ;
begin
Mybmp := Tbitmap.Create; {建立BMPMAP }
Mycan := TCanvas.Create; {屏幕截取}
dc := GetWindowDC(0); try
p.x:= Panel1.Left;
p.y:= Panel1.Top;
CP:= ClientToScreen(p); Mycan.Handle := dc;
R := Rect(CP.x,CP.y,CP.x+Panel1.Width,CP.y+Panel1.Height);
Mybmp.Width := Panel1.Width;
Mybmp.Height := Panel1.Height;
Mybmp.Canvas.CopyRect(Mybmp.Canvas.ClipRect,Mycan,R);
mybmp.SaveToFile('E:\test.bmp');
finally
releaseDC(0, DC);
mycan.Free;
mybmp.Free;
end;
end;
太谢谢你了。。我试以下,要是可以了马上给分:)
procedure Tfrm_dkkb.BitBtn1Click(Sender: TObject);
var
dc: hdc;
Mycan: Tcanvas;
R : TRect;
Mybmp:TBitmap;
p, CP:TPoint ;
begin
Mybmp := Tbitmap.Create; {建立BMPMAP }
Mycan := TCanvas.Create; {屏幕截取}
dc := GetWindowDC(0); try
p.x:= panel2.left;
p.y:=panel2.top;
CP:= ClientToScreen(p);
Mycan.Handle:= dc;
R:= Rect(cp.x ,cp.y, panel2.Width, panel2.Height);
Mybmp.Width:= R.Right;
Mybmp.Height:= R.Bottom;
Mybmp.Canvas.CopyRect(R, Mycan, R);
mybmp.SaveToFile('d:\test.bmp');
finally
releaseDC(0, DC);
mycan.Free;
mybmp.Free;
end;
end;
代码基本没有改变呀。。为什么我的不行??我的penel上有文字和图形的呀
老大~~~~你看看我的话啊~~~~~要修改一下的~~~
老大~~~~你看看我的话啊~~~~~要修改一下的~~~
老大~~~~你看看我的话啊~~~~~要修改一下的~~~稍微修改一下~~呵呵~~procedure TForm1.Button3Click(Sender: TObject);
var
dc: hdc;
Mycan: Tcanvas;
R: TRect;
Mybmp:TBitmap;
p, CP:TPoint ;
begin
Mybmp := Tbitmap.Create; {建立BMPMAP }
Mycan := TCanvas.Create; {屏幕截取}
dc := GetWindowDC(0); try
p.x:= Panel1.Left;
p.y:= Panel1.Top;
CP:= ClientToScreen(p); Mycan.Handle := dc;
R := Rect(CP.x,CP.y,CP.x+Panel1.Width,CP.y+Panel1.Height);
Mybmp.Width := Panel1.Width;
Mybmp.Height := Panel1.Height;
Mybmp.Canvas.CopyRect(Mybmp.Canvas.ClipRect,Mycan,R);
mybmp.SaveToFile('E:\test.bmp');
finally
releaseDC(0, DC);
mycan.Free;
mybmp.Free;
end;
end;
{ 取得当前屏幕背景图案 }
var
vDesktopHWnd: THandle;
vDesktopDC: HDC;
begin
Result := True;
with mBitmap do try
vDesktopHWnd := GetDesktopWindow;
vDesktopDC := GetDC(vDesktopHWnd);
Width := Screen.Width;
Height := Screen.Height;
BitBlt(Canvas.Handle, 0, 0, Width, Height, vDesktopDC, 0, 0, SRCCOPY);
ReleaseDC(vDesktopHWnd, vDesktopDC);
except
Result := False;
end;
end; { GetDesktopBitmap }
zswang(伴水)(伤心中)师兄啊~~~
你也让着我一点啊~~~
procedure TForm1.Button1Click(Sender: TObject);
var
Mem: TBitmap;
Rect: TRect;
begin
Mem := TBitmap.Create;
Rect := Panel1.ClientRect;
Mem.Width := Panel1.Width;
Mem.Height := Panel1.Height;
Mem.Canvas.CopyRect(Rect, TDrawGrid(Panel1).Canvas, Rect);
Mem.SaveToFile('c:\g.bmp');
Mem.Free;
end;
tikkypeng(一两狂死郎之天衣有缝)的代码能用的。
//不用给我分!function GetDesktopBitmap(mBitmap: TBitmap; mRect: TRect): Boolean;
{ 取得当前屏幕背景图案 }
var
vDesktopHWnd: THandle;
vDesktopDC: HDC;
begin
Result := True;
with mBitmap do try
vDesktopHWnd := GetDesktopWindow;
vDesktopDC := GetDC(vDesktopHWnd);
Width := mRect.Right - mRect.Left;
Height := mRect.Bottom - mRect.Top;
BitBlt(Canvas.Handle, -mRect.Left, -mRect.Top, mRect.Right, mRect.Bottom,
vDesktopDC, 0, 0, SRCCOPY);
ReleaseDC(vDesktopHWnd, vDesktopDC);
except
Result := False;
end;
end; { GetDesktopBitmap }procedure TForm1.Button1Click(Sender: TObject);
var
vRect: TRect;
begin
GetWindowRect(Panel1.Handle, vRect);
GetDesktopBitmap(Image1.Picture.Bitmap, vRect);
end;
,。。谢谢。。也收我做师弟把呜呜,,分我到底怎么给呢
不过还有一点问提。好象坐标转换有问题。用PENEL的坐标带进去就抓到空白。。
都可以实现需要
不同的是我的是取当前屏幕
如果Panel被其它程序的窗体挡住时就会把它也一起提出来
他的是取当前Form
不会被其它程序影响比较合理
用GetWindowRect(Panel1.Handle, vRect);可以得到绝对坐标
zswang偷偷地递一本书给xzgyb
“这是师傅的绝技是用VC写的,你给我翻译成Delphi”
xzgyb一看书名<<葵花宝典6.0>>!
导演说:“不许!”
委屈xzgyb 当白马先
待你翻译完葵花宝典
我当极力向导演推荐
误会啊,英雄!
(忘了用道具,摔了一交,从身上掉了两本书--<<葵花宝典7.0>>和<<葵花宝典7.0补丁>>)
“别多说快挑担子”
跟我说话吗?不是跟我说话的吧?认错人啦!
太抬举我了,英雄,头一次听到有人这么说
不过据我了解,<<葵花宝典>>早已问世
江湖人物人手一本,呵呵
哈哈,老狼,没关系,虽然我是老达摩
但我们可以是忘年交吗,哈哈