PDA

View Full Version : Move در فرم های سفارشی؟



MSK
جمعه 27 شهریور 1383, 19:53 عصر
چطور میشه در فرمهای فاقد CaptionBar رخداد Move را پیاده سازی کرد؟ :oops:

یعنی وقتی کاربر فرم را دراگ میکند فرم همراه موس حرکت کند؟ :lol:(مثل مدیا پلیر)

شنبه 28 شهریور 1383, 00:16 صبح
سلام
در سری کامپوننت های mediapack یک کامپوننت با نام epmoveform هست که میتونی از اون استفاده کنی


موفق باشی

Farshad Paydar
شنبه 28 شهریور 1383, 10:01 صبح
با سلام .
من برای جابجا کردن اشیای فرم از کد زیر که ابتکار خودمه استفاده می کنم . نیازی به کامپوننتی نیست :
متغیر های گلوبال زیر را تعریف کن:

var
IsMoving : Boolean;
BeginPt, EndPt : TPoint;
بعد در oncreate فرم :

IsMoving := False;
بعد در OnMouseDown فرم :

IsMoving := True;
BeginPt := Point(X,Y);
بعد در OnMouseMove فرم :

if IsMoving then
begin
EndPt := Point(X,Y);
Form1.Left := Form1.Left + EndPt.X - BeginPt.X;
Form1.Top := Form1.Top + EndPt.Y - BeginPt.Y;
end;
بعد در OnMouseUp فرم :

IsMoving := False;
این کد رو برای اشیایی که دارای event های فوق باشند میشه اجرا کرد . من در اینجا برای Form1 نوشتم .من با همین کد Image و Button رو جابجا می کنم .

امیدوارم به دردت بخوره .

MFCGalaxy2
شنبه 28 شهریور 1383, 17:08 عصر
با تشکر از فرشاد پایدار ... یک راه اصولی تر هم هست که جسارتا عرض میکنم. این راه را یک روزگاری توی وبلاگم برای MFC نوشته بودم . حالا دیگه حتی پسورد اون وبلاگ را هم یادم نیست.....
------------------------------------------------------------------------------------------------------------------------------
توضیح
پیغامهایی را که ماوس میفرستد از این نظر که ماوس را در کجا کلیک کنیم به دو دسته ی Client Messages و Non Client Messages تقسیم بندی میکنند . ناحیه Caption و Scroll Bar ها جزو قسمتهای Non Client محسوب میشوند. اکنون برای اینکه کنترل اینگونه پیغامها را به دست بگیریم بایستی که پیغام WM_NCHITTEST را به مجموعه پیغامهایی که فرم مان پردازش میکند اضافه و آنرا مدیریت کنیم .
منظورم از مدیریت چیست ؟ منظورم در اینجا این است که بایستی ویندوز را در اینجا فریب داد. به این صورت که بهش بگیم هر وقت پیغام ناحیه Client رسید با آن همان رفتاری را بکن که با پیغام کلیک کردن بر روی Caption انجام میدادی . البته امکان دارد این سوال را بپرسید که خب اگر روی یک دکمه کلیک کرد و دکمه هم در ناحیه Client است پس با OnClick دکمه چه کنم ؟؟!! پاسخ:: با آن در حالت Default رفتار کنید ....


Procedure TForm1.WMNCHiTTest(Var Msg:TWMNCHitTest);
begin
DefaultHandler (Msg);
if Msg.Result = HTCLIENT then
Msg.Result := HTCAPTION ;
end;

Pichidehtarin
شنبه 28 شهریور 1383, 17:14 عصر
این رو ببینی بد نیست :

http://www.barnamenevis.org/forum/viewtopic.php?t=14867

Move رو با OnMouseDown و OnMouseUp انجام دادم .

_alish_
یک شنبه 29 شهریور 1383, 14:20 عصر
procedure TMediaFrm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture();
MediaFrm.Perform(WM_SYSCOMMAND,$F012,0);
end;
حتی FormMouseDown

MSK
یک شنبه 05 مهر 1383, 19:24 عصر
alish عزیز میشه کمی درباره عملکرد کد فوق بیشتر توضیح بدید؟

معنی این دستورها چیه؟