PDA

View Full Version : مشکل در کار با BitBlt



Arash-For-Life
دوشنبه 09 مهر 1386, 07:22 صبح
چجوری میشه x,y اول جایی که موس فشرده میشه باشه و x,y دوم جایی که کلید موس رها میشه باشه به همین ترتیب مربعی که بدست میاد به عنوان عکس سیو بشه؟

farhad110
دوشنبه 09 مهر 1386, 08:17 صبح
چجوری میشه x,y اول جایی که موس فشرده میشه باشه و x,y دوم جایی که کلید موس رها میشه باشه به همین ترتیب مربعی که بدست میاد به عنوان عکس سیو بشه؟

منظور شما رو برای "مربعی که بدست میاد به عنوان عکس سیو بشه" دقیقا متوجه نشدم. واضحتر توضیح بده.
برای بدست آوردن مختصات، کد زیر رو در OnMouseDown و OnMouseUp قرار بده.



procedure TForm1.BitBtn1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
position:TPoint;
begin
GetCursorPos(position);
Edit1.Text:=inttostr(position.x);
Edit2.Text:=inttostr(position.y);
end;

مصطفی ساتکی
سه شنبه 10 مهر 1386, 00:59 صبح
اینم یه برنامه با Hook براتون نوشتم که این کارو انجام بده



unit Unit1;
{Create By DelphiCAT - Marham Rayane}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
ScrollBox1: TScrollBox;
Image1: TImage;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FHookStarted : Boolean;
public
procedure StartHook;
procedure StopHook;
procedure SetImage(ARect : TRect);
function GetNormalRect(ARect : TRect): TRect;
end;
var
Form1: TForm1;
implementation
uses Types;
{$R *.dfm}
var JrHook : THandle;
FDownFlag : Boolean;
FDownPos : TPoint;
{ TForm1 }
function JournalProc(Code,wParam : integer;var EventMsg :TEventMsg):Longint;stdcall;
begin
Result := CallNextHookEx(JrHook,Code,wParam,longint(@EventMs g));
if (Code<0) or (Code=HC_SYSMODALON) then Exit;
if Code = HC_ACTION then
begin
case EventMsg.message of
WM_LBUTTONDOWN : begin
FDownFlag := True;
FDownPos := Point(EventMsg.paramL,EventMsg.paramH);
end;
WM_LBUTTONUP : begin
FDownFlag := False;
Form1.SetImage(rect(FDownPos.X,FDownPos.Y,EventMsg .paramL,EventMsg.paramH));
FDownFlag := False;
end;
end;
end;
end;
function TForm1.GetNormalRect(ARect : TRect): TRect;
begin
Result := ARect;
if Result.Left > Result.Right then begin
Result.Right:=ARect.Left;
Result.Left:=ARect.Right;
end ;
if Result.Top > Result.Bottom then begin
Result.Bottom:=Result.Top;
Result.Top:=ARect.Bottom;
end;
end;
procedure TForm1.SetImage(ARect: TRect);
var GoalRect : TRect;
begin
GoalRect := GetNormalRect(ARect);
if (GoalRect.Left<>GoalRect.Right) and (GoalRect.Top<>GoalRect.Bottom) then
begin
with Image1 do
begin
Width := GoalRect.Right - GoalRect.Left;
Height := GoalRect.Bottom - GoalRect.Top;
Picture.Bitmap.Width := Width;
Picture.Bitmap.Height := Height;
BitBlt(Canvas.Handle,0,0,Width,Height,GetDC(0),Goa lRect.Left,GoalRect.Top,SRCCOPY);
end;
end;
end;
procedure TForm1.StartHook;
begin
if FHookStarted then
begin
ShowMessage('Hook is Run');
Exit;
end;
JrHook := SetWindowsHookEx(WH_JOURNALRECORD,@JournalProc,HIn stance,0);
if JrHook>0 then
FHookStarted := True;
end;
procedure TForm1.StopHook;
begin
FHookStarted := False;
UnhookWindowsHookEx(JrHook);
JrHook := 0;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
StartHook;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
StopHook;
end;
end.

Arash-For-Life
سه شنبه 10 مهر 1386, 06:37 صبح
دقت کنید...
در ناحیه ای از فرم کلید موس رو فشار میدیم و با درگ کردن یعنی کلید موس رو رها نمیکنیم و در ناحیه ای دیگه کلید موس رو رها می کنیم به این ترتیب مربعی فرضی بدست میاد حالا میخوایم کاری کنیم که هر چی در بین این مربع بود به عنوان عکس سیو بشه دقیقا مثل عمل برنامه SnagIt

مصطفی ساتکی
سه شنبه 10 مهر 1386, 09:53 صبح
دقت کنید...
در ناحیه ای از فرم کلید موس رو فشار میدیم و با درگ کردن یعنی کلید موس رو رها نمیکنیم و در ناحیه ای دیگه کلید موس رو رها می کنیم به این ترتیب مربعی فرضی بدست میاد حالا میخوایم کاری کنیم که هر چی در بین این مربع بود به عنوان عکس سیو بشه دقیقا مثل عمل برنامه SnagIt
جناب Arash-For-Life (http://barnamenevis.org/forum/member.php?u=47352) یه ScrollBox تو صفحه قرار بدین و Image هم داخل این ScrollBox قرار بدین دقیقاً همون که گفتین انجام میده Onshow و Onclose فرم را همنطوری که ذکر کردم تنظیم کنید

Arman_1367
سه شنبه 10 مهر 1386, 12:00 عصر
چجوری میشه x,y اول جایی که موس فشرده میشه باشه و x,y دوم جایی که کلید موس رها میشه باشه به همین ترتیب مربعی که بدست میاد به عنوان عکس سیو بشه؟

قبل از پرسیدن سوال جست و جو کنید.