屏幕捕捉的问题。(20分)

  • 主题发起人 主题发起人 lwcsoft
  • 开始时间 开始时间
L

lwcsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
在进行屏幕捕捉时,捉不到桌面的图像,是灰色的。是窗口最大化问题,但我没有解决的方法。
源码如下,程序有两个窗体。
主窗体:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ColorGrd;
type
TmainForm = class(TForm)
Button1: TSpeedButton;
Button2: TSpeedButton;
grdColor: TColorGrid;
procedure Button1Click(Sender: TObject);
procedure grdColorChange(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
mainForm: TmainForm;
implementation
uses draw;
{$R *.dfm}
procedure TmainForm.Button1Click(Sender: TObject);
begin
mainform.Hide;
drawform.show;
button1.Down:=true;
end;
procedure TmainForm.grdColorChange(Sender: TObject);
begin
with grdColor do
begin
drawform.drawimage.Canvas.Brush.Color := ForegroundColor;
drawform.FDesktopBits.Canvas.Brush.Color := ForegroundColor;
drawform.FDesktopBits.Canvas.Pen.Color := ForegroundColor;
end;
end;
end.
捕捉后窗体:
unit draw;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;

type
TdrawForm = class(TForm)
drawImage: TImage;
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure drawImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure drawImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure drawImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormShow(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public

FDrawing: Boolean;

FCursorBits, FDesktopBits: TBitmap;
FCursorPos: TPoint;

procedure GrabScreenImage;
procedure WMSetFocus(var message: TWMSetFocus); message WM_SETFOCUS;
procedure WMKillFocus(var message: TWMSetFocus); message WM_KILLFOCUS;

end;

const
DOT_SIZE = 4;

var
drawForm: TdrawForm;

implementation

{$R *.dfm}
uses ScreenCanvas, main;

procedure TdrawForm.GrabScreenImage;
begin
with FDesktopBits do
begin
width := clientwidth;
height := clientheight;
end;

with TScreenCanvas.Create do
try
BitBlt(FDesktopBits.Canvas.Handle, 0, 0, clientwidth,
clientheight, Handle, 0, 0, SRCCOPY);

drawimage.Picture.Bitmap.Assign(FDesktopBits);
finally
Free;
end;
end;
procedure TdrawForm.FormActivate(Sender: TObject);
begin
GrabScreenImage;
end;
procedure TdrawForm.WMKillFocus(var message: TWMSetFocus);
begin
ShowCursor(true);
end;
procedure TdrawForm.WMSetFocus(var message: TWMSetFocus);
begin
ShowCursor(false);
end;
procedure TdrawForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FCursorBits.Free;
end;

procedure TdrawForm.FormCreate(Sender: TObject);
begin
// self.width:=screen.width;
// self.height:=screen.height;
FDrawing := false;
FCursorBits := TBitmap.Create;
FCursorBits.loadfromfile('hammer.bmp');
FCursorBits.Transparent := true;
FCursorBits.TransparentMode := tmAuto;
FDesktopBits := TBitmap.Create;
with mainform.grdColor do
begin
ForegroundIndex := ColorToIndex(clRed);
mainform.grdColorChange(mainform.grdColor);
end;
end;
procedure TdrawForm.drawImageMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FDrawing := true;
end;
procedure TdrawForm.drawImageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDrawing := false;
end;
procedure TdrawForm.drawImageMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
Pt: TPoint;
R : TRect;
begin
GetCursorPos(Pt);
if (Pt.X <> FCursorPos.X) or (Pt.Y <> FCursorPos.Y) then
begin
R := Rect(0, 0, FCursorBits.width, FCursorBits.height);
OffsetRect(R, FCursorPos.X, FCursorPos.Y);
drawimage.Canvas.CopyRect(R, FDesktopBits.Canvas, R);
if FDrawing then
begin
R := Rect(Pt.X, Pt.Y, Pt.X + DOT_SIZE, Pt.Y + DOT_SIZE);
with FDesktopBits.Canvas do
Ellipse(Pt.X, Pt.Y, Pt.X + DOT_SIZE, Pt.Y + DOT_SIZE);
with drawimage.Canvas do
CopyRect(R, FDesktopBits.Canvas, R);
end;
drawimage.Canvas.draw(Pt.X, Pt.Y, FCursorBits);
FCursorPos := Pt;
end;
end;
procedure TdrawForm.FormShow(Sender: TObject);
begin
drawform.Refresh;
end;
procedure TdrawForm.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then mainform.Show;
end;
end.

大家帮我看看,如何解决。谢谢。
 
如果不把捕捉窗口设置成最大化,则能正确进行捕捉,如果设置成最大化,则捕捉的是灰色的窗口。
 
不要设置Form.WindowState为wsMaximized,而用代码控制窗体大小:
self.width:=screen.width;
self.height:=screen.height;
应该就可以了
 
在上面的formcreate我已经试用了这种方法,结果是一样的,
 
应该是窗口最大化,与捕捉屏幕的前后顺序的问题,我没有办法了,大家帮帮我啊。
 
先在mainform的button1click中进行抓图,
然后再显示drawform并显示抓下来的图
 
这里有个屏幕大小的问题,如果先抓的化,大小如何确定啊。
 
问题我解决了,谢谢两位,每人给了10分,平均分配。
 
后退
顶部