PDA

View Full Version : سوال: چگونگی جابجایی فرم برنامه ( با شی عکس)



nsco_nsco
یک شنبه 12 تیر 1390, 21:01 عصر
سلام دوستان
من اومدم فرمی ساختم که دور حاشیه ندارد و منوی بالا ندارد حالا می خوام عکسی اون بالا قرار بدم که هر زمانی کار بر اون رو گرفت بتونه برنامه رو جابه جا کنه در صفحه (( یعنی به جای منوی بالا )) ممنون می شوم اگر کمکی برای کد این موضوع بکنید البته سریع عجله ای هست ممنون :قلب:

SAASTN
یک شنبه 12 تیر 1390, 21:34 عصر
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest;
{ Private declarations }
public
{ Public declarations }
end;

...

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;
end;

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
inherited;
if Msg.Result = htClient then Msg.Result := htCaption;
end;
توضیحات بیشتر:
http://barnamenevis.org/showthread.php?227694-%D8%B3%D8%A7%D8%AF%D9%87-%D8%AA%D8%B1%DB%8C%D9%86-%DA%A9%D8%AF-%DA%A9%D9%87-%D9%85%DB%8C-%D8%AA%D9%88%D8%A7%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%DB%8C%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%D8%B4%D8%AA-%DA%86%DB%8C%D8%B3%D8%AA%D8%9F&p=1017489&viewfull=1#post1017489

nsco_nsco
یک شنبه 12 تیر 1390, 22:39 عصر
سلام
ممنون از پاسختون اما دنبال کد ساده تری هستم یکی پیدا کردم ولی می خوام که در یک رویداد بنویسم مثلا کلیک دون ممنون می شوم اگر کدی دارید بگذارید باز ممنون از شما دوست عزیز و دیگر دوستان خوبم:قلب:

nsco_nsco
یک شنبه 12 تیر 1390, 22:49 عصر
ممنون از پاسختون همین رو گذاشتم جواب داد :


ReleaseCapture;
SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;



باز ممنون :قلب:

nsco_nsco
یک شنبه 12 تیر 1390, 22:50 عصر
باز ببخشید اگر ممکنه یه توضیحی در مورد این کد بدید ممنون :


ReleaseCapture;
SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;

مرسی
:قلب:

یوسف زالی
یک شنبه 12 تیر 1390, 22:53 عصر
سلام.
این رو تست کنید:



unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
XX, YY: integer;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Image1.Tag := 1;
XX := X;
YY := Y;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if Image1.Tag = 0 then
exit;
Form1.Left := Form1.Left + X - XX;
Form1.Top := Form1.Top + Y - YY;
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Image1.Tag := 0;
end;
end.

mohsen24000
یک شنبه 12 تیر 1390, 22:54 عصر
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbLeft then begin
ReleaseCapture;
SendMessage(Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
end;
end;

nsco_nsco
یک شنبه 12 تیر 1390, 23:11 عصر
سلام ممنون ولی این کده مگه موردی داره :


ReleaseCapture;
SendMessage(Form1.Handle, WM_SYSCOMMAND, 61458, 0) ;

فقط ممنون می شم بگید این دستور یعنی چی ممنون :قلب:

SAASTN
دوشنبه 13 تیر 1390, 01:43 صبح
اجازه بدین قبل از توضیح در مورد اون کد یه چندتا از اشتباهاتم رو اصلاح کنم.

ممنون از پاسختون همین رو گذاشتم جواب داد :
درسته، بازنویسی WMNCHitTest برای این بود که عمل جابجا کردن فرم با درگ کردن روی هر نقطه ای از فرم انجام بشه، نه فقط روی عکس مدنظر. که این مورد منظور شما نبوده و نیازی بهش نیست.
دوم اینکه تعریف همون WMNCHitTest در interface رو کامل ننوشتم و باید بصورت زیر نوشته می شد تا درست عمل کنه:
procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest ;

اما توضیح در مورد کد:
به سبک برادر تارانتینو، قسمت اول: خط دوم!
ببینید ما می خوایم عمل MouseDown و Drag روی TitleBar فرم رو شبیه سازی کنیم. پس در لحظه فشرده شدن موس روی عکس، درست مثل وقتی که موس روی TitleBar فشرده میشه، برای نشون دادن شروع جابجایی یک WM_SYSCOMMAND برای فرم ارسال می کنیم. و اما پارامتر عجیب 61458! گویا مستندات درستی در مورد این مقدار منتشر نشده:
http://keyj.emphy.de/a-strange-windows-message/
اما همونطور که آقای mohsen24000 هم اشاره کردن، این مقدار خیلی نزدیک به SC_MOVE هست که برای جابجایی فرمه. تنها مسئله اینه که اگر از خود SC_MOVE استفاده بشه کرسر به وسط TitleBar منتقل میشه و بعد عمل جابجایی صورت می گیره، درست مثل زمانی که روی Icon گوشه فرم کلیک کنیم و گزینه Move رو انتخاب کنیم. اما SC_MOVE+1 و SC_MOVE+2 محل کرسر رو ثابت نگه می دارن. اگه یکم جستجو کنید می بینید که از SC_MOVE+2 یا همون 61458 بیشتر استفاده شده که من علتش رو نمی دونم.
قسمت دوم: خط اول.
خوب تا اینجا فرم متوجه شد که قراره با درگ شدن موس جابجا بشه. اما مشکل اینجاست که الان موس روی عکس قرار داره و روی اون فشرده شده، پس تمام پیام های مربوط به درگ و جابجایی موس برای عکس ارسال میشه. ReleaseCapture باعث میشه که پنجره ای که موس رو در اختیار گرفته (در اینجا عکس) اون رو رها کنه، بنا بر این حالا پیام های درگ به خود فرم ارسال میشه.
این روند چیزیه که تو ذهن ماست، یعنی اول فشردن موس و بعد جابجا کردن اون، اما برای اینکه این کارا درست انجام بشه، اول باید عکس بیخیال موس بشه بعد پیام جابجایی برای فرم ارسال بشه.

امیدوارم گویا بوده باشه

یوسف زالی
دوشنبه 13 تیر 1390, 10:14 صبح
جناب SAASTN آیا مورد مشابهی برای OnPaint فرم هم وجود داره؟
مثل رویدادی که بعد از تمام رویدادهای موس اتفاق می افته؟
و اینکه در حالت کلی این رویداد ها رو از کجا می شه پبدا کرد؟ البته جز تجربه!
آیا مستندات خاصی برای رویدادهایی که پس یا پیش از تمام رویدادهای یک جنس اتفاق می افتند وجود داره؟

SAASTN
دوشنبه 13 تیر 1390, 19:04 عصر
آیا مورد مشابهی برای OnPaint فرم هم وجود داره؟
بله، پیام WM_PAINT.

مثل رویدادی که بعد از تمام رویدادهای موس اتفاق می افته؟
ببینید وقتی می خواید یک مجموعه از پیام ها رو بصورت گروهی هندل کنید دیگه نمیشه یک هندلر واحد برای اونها نوشت. تمام پیامها قبل از رسیدن به متد هندلر از متد WndProc عبور می کنند که اونجا میشه مثلا به این ترتیب عمل کرد:
TForm1 = class(TForm)
private
protected
procedure WndProc(var Message: TMessage); override;
{ Private declarations }
public
{ Public declarations }

end;
...
procedure TForm1.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_MOUSEFIRST .. WM_MOUSELAST:
begin
// Do something
end;
end;
end;


و اینکه در حالت کلی این رویداد ها رو از کجا می شه پبدا کرد؟ البته جز تجربه!
آیا مستندات خاصی برای رویدادهایی که پس یا پیش از تمام رویدادهای یک جنس اتفاق می افتند وجود داره؟
من جایی همچین مستندی ندیدم که تمام پیامهایی که برای یک کنترل خاص ارسال میشه رو لیست کرده باشه، البته شاید تو MSDN همچین چیزی بشه پیدا کرد، و شاید دوستان برخورد کرده باشن.
اما این پیامها در یونیت های Messages و Controls لیست شدن. من بیشتر از طریق کد خونی با اینا آشنا شدم شما از TControl که بگیری بیای پائین تمام Message-Handler رو می بینی و با پر کاربرد هاش هم به مرور آشنا میشی. برای توضیحات در مورد هرکدوم از پیامها هم تو راهنمای دلفی میشه جستجو کرد، ممکنه ایندکس نشده باشن ولی جستجو در مورد همشون جواب میده.

amirshadow3
پنج شنبه 05 آبان 1390, 09:47 صبح
سلام
كسي اينجا هست ؟من يه سوال حياتي درباره برنامه نويسي و پايگاه داده دارم لطفا اگه كسي هست اعلام كنه. خواهش ميكنم

nsco_nsco
دوشنبه 09 آبان 1390, 03:32 صبح
:متفکر: سوالتون رو بفرمایید