PDA

View Full Version : تغییر در کد افکت فرم



bahar_engineer
چهارشنبه 06 آبان 1388, 12:41 عصر
سلام

من با استفاده از این برنامه (http://www.codeproject.com/KB/cs/FormAnimation.aspx?display=Print) به فرم هام افکت دادم اما این فقط موقع لود افکت داره ... می خوام موقع بسته شدن فرم هم افکت داشته باشه اما هر کاری کردم نشد ... توی رویداد close هم نمی تونم کدشو بنویسم ...


کسی می تونه راهنمایی کنه ؟

behzad1986
چهارشنبه 06 آبان 1388, 13:56 عصر
سلام کدی که تو کلید close توضیح شده را از توضیح حارج کنید

bahar_engineer
چهارشنبه 06 آبان 1388, 14:43 عصر
سلام کدی که تو کلید close توضیح شده را از توضیح حارج کنید

این کارو انجام دادم اما باز هم هیچ عکس العملی نداره یعنی معمولی بسته می شه

mahdi_7610
چهارشنبه 06 آبان 1388, 17:07 عصر
واسه close شدن به صورت نمونه ای که گذاشتم عمل کنید .

bahar_engineer
پنج شنبه 07 آبان 1388, 09:49 صبح
واسه close شدن به صورت نمونه ای که گذاشتم عمل کنید .

ممنونم اما من اون نمونه ها رو می خواستم . fade رو که خودم داشتم و تو اینترنت هم هست...

می خواستم با اون کلاس winAPI بتونم موقع close افکت بدم ...

bahar_engineer
پنج شنبه 14 آبان 1388, 12:17 عصر
کسی می دونه اینو چطور می شه به c# تبدیل کرد؟ البته یه قسمتیشو دارم : فقط تابع هاشو نمی دونم چطور توی WINAPI که در زیر نوشتم و به زبان سی شارپه اضافه کنم!

VB.NET


Module Module1

Public Enum AnimateWindowFlags
AW_HOR_POSITIVE = &H1
AW_HOR_NEGATIVE = &H2
AW_VER_POSITIVE = &H4
AW_VER_NEGATIVE = &H8
AW_CENTER = &H10
AW_HIDE = &H10000
AW_ACTIVATE = &H20000
AW_SLIDE = &H40000
AW_BLEND = &H80000
End Enum

Dim f1 As Form1

Public Declare Auto Function AnimateWindow Lib "user32" (ByVal hwnd As IntPtr, ByVal time As Integer, ByVal flags As AnimateWindowFlags) As Boolean

Sub Main()
f1 = New Form1
Dim xx As Integer = Screen.PrimaryScreen.Bounds.Width - f1.Size.Width
Dim yy As Integer = Screen.PrimaryScreen.Bounds.Height / 2 - (f1.Size.Height / 2)
f1.Location = New Point(xx, yy)
Application.Run(f1)
End Sub

Sub animateWin(ByVal frmToAnimate As Form, ByVal showForm As Boolean)
If showForm Then
AnimateWindow(frmToAnimate.Handle, 1000, AnimateWindowFlags.AW_HOR_NEGATIVE Or AnimateWindowFlags.AW_SLIDE)
Else
AnimateWindow(frmToAnimate.Handle, 1000, AnimateWindowFlags.AW_HOR_POSITIVE Or AnimateWindowFlags.AW_HIDE)
End If

End Sub


End Module



قسمتی از ماژول در سی شارپ


using System;
using System.Runtime.InteropServices;

namespace effectonform
{
/// <summary>
/// Win32 implementation to show / hide a window with animation.
/// </summary>

public class WinAPI
{
/// <summary>
/// Animates the window from left to right. This flag can be used with roll or slide animation.
/// </summary>
public const int AW_HOR_POSITIVE = 0X1;
/// <summary>
/// Animates the window from right to left. This flag can be used with roll or slide animation.
/// </summary>
public const int AW_HOR_NEGATIVE = 0X2;
/// <summary>
/// Animates the window from top to bottom. This flag can be used with roll or slide animation.
/// </summary>
public const int AW_VER_POSITIVE = 0X4;
/// <summary>
/// Animates the window from bottom to top. This flag can be used with roll or slide animation.
/// </summary>
public const int AW_VER_NEGATIVE = 0X8;
/// <summary>
/// Makes the window appear to collapse inward if AW_HIDE is used or expand outward if the AW_HIDE is not used.
/// </summary>
public const int AW_CENTER = 0X10;
/// <summary>
/// Hides the window. By default, the window is shown.
/// </summary>
public const int AW_HIDE = 0X10000;
/// <summary>
/// Activates the window.
/// </summary>
public const int AW_ACTIVATE = 0X20000;
/// <summary>
/// Uses slide animation. By default, roll animation is used.
/// </summary>
public const int AW_SLIDE = 0X40000;
/// <summary>
/// Uses a fade effect. This flag can be used only if hwnd is a top-level window.
/// </summary>
public const int AW_BLEND = 0X80000;

/// <summary>
/// Animates a window.
/// </summary>
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int AnimateWindow (IntPtr hwand , int dwTime , int dwFlags) ;

}
}



در واقع این همون کارو توی سی شارپ می کنه اما توی اون ماژول به زبان وی بی دو تا تابع تعریف شده که من نمی تونم اونها رو توی این WINAPI که به زبان C# هست اضافه کنم

اگه ممکنه یه نگاهی بندازین

ممنون

alireza_s_84
پنج شنبه 14 آبان 1388, 12:39 عصر
سلام:
شما نگاه کن این تابع کارش اعمال افکت های متفاوتی به کنترلهاست. شما وقتی میخوای به یک کنترل یک افکت بدی میتونید ازش استفاده کنید:


AnimateWindow(ControlName.Handel, 1000,Flags);

به جای ControlName اسم کنترلی که میخواید افکت ها بهش اعمال بشه رو قرار میدین و به جای Flags هم یکی از مقادیری که در بالا تعریف کردین دیگه نیازی به هیچ متدی نیست که وارد کلاس خودتون بکنید.
کلاسی که میذارم همین کارها رو براتون انجام میده اما با منطقی بهتر:


namespace Softcam
{
/// <summary>
/// جلوه های نمایش و مخفی کردن اشیا
/// </summary>
internal enum Animation
{

/// <summary>
/// راست به چپ
/// </summary>
RightToLeft = 0X1,
/// <summary>
/// چپ به راست
/// </summary>
LeftToRight = 0X2,
/// <summary>
/// بالا به پایین
/// </summary>
UpToDown = 0X4,
/// <summary>
/// پایین به بالا
/// </summary>
DownToUp = 0X8,
/// <summary>
/// به سمت مرکز
/// </summary>
Centeral = 0X10,
/// <summary>
/// مخفی کردن
/// </summary>
HIDE = 0X10000,
/// <summary>
/// نمایش
/// </summary>
Show = 0X20000,
/// <summary>
/// بصورت اسلاید
/// </summary>
SLIDE = 0X40000,
/// <summary>
/// بصورت محو
/// </summary>
BLEND = 0X80000,
}

class ManagerAPI
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int AnimateWindow(IntPtr hwand, int dwTime, Animation dwFlags);
}
}

این هم یک نمونه که فرم مورد نظرمون رو در عرض یک ثانیه در جهت شمال شرقی(بالا چپ) مخفی میکنه.

ManagerAPI.AnimateWindow(this.Handle,1000,(Animati on(Animation.DownToUp^Animation.LeftToRight^Animat ion.HIDE));
موفق باشید

bahar_engineer
پنج شنبه 14 آبان 1388, 12:40 عصر
سلام کدی که تو کلید close توضیح شده را از توضیح حارج کنید

آقا فهمیدم ! من صفحاتم 1024 هست که اینو نمی دیدیم که افکت داره موقع بسته شدن!

اما حالا 2 تا فرم کوچک گذاشتم ، موقع بسته شدن افکت رو اجرا می کنه اما فقط در قسمتی از فرم که زیرش خالیه

یعنی اگه فرم 2 الان که باز شده روی فرم 1 قرار گرفته افکت رو نشون نمی ده

اما اگه مثلا 5 سانتیمتر از پایینش از فرم 1 زده باشه بیرون (یعنی زیرش فرم دیگه ای نباشه) تو اون 5 سانت افکت رو اجرا می کنه اما بقیه فرم نه:متعجب:

این یعنی چی؟؟

bahar_engineer
پنج شنبه 14 آبان 1388, 12:48 عصر
اینم همون مشکل و داره

اگه فرمی زیر فرم مورد نظر باشه اون قسمت افکت رو اجرا نمی کنه

دلیلش چیه؟

alireza_s_84
پنج شنبه 14 آبان 1388, 13:05 عصر
اینم همون مشکل و داره

اگه فرمی زیر فرم مورد نظر باشه اون قسمت افکت رو اجرا نمی کنه

دلیلش چیه؟
دوست عزیز افکت اجرا میشه اما طبق معمول تا زمانیکه یک کد در حال اجرا شدن بقیه برنامه اجرا نمیشه(مسائل همزمانی) پس وقتی افکت در حال اجراست متد OnPaint فرم دیگه اجرا نمیشه تا فرم رو به روز کنه شما باید این تابع رو در یک Thraed فراخونی کنید.
موفق باشید

bahar_engineer
شنبه 16 آبان 1388, 09:53 صبح
من به این شکل توی ترد فراخوانی کردم اما خطا می ده :

من خیلی راجع به تردها نمی دونم ... مطالعه هم کردم اما چیز زیادی دستگیرم نشد...



private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(myt);
t.Start();
}

protected void myt(object sender)
{
ManagerAPI.AnimateWindow(this.Handle, 1000, (Animation.DownToUp ^ Animation.LeftToRight ^ Animation.HIDE));
}


این خطاشه :



Cross-thread operation not valid: Control 'Form2' accessed from a thread other than the thread it was created on.


من نمی دونم اصلا پارامتری که باید از نوع object بهش بدم چی بذارم... نمی شه بدون پارامتر؟

alireza_s_84
شنبه 16 آبان 1388, 10:39 صبح
من به این شکل توی ترد فراخوانی کردم اما خطا می ده :

من خیلی راجع به تردها نمی دونم ... مطالعه هم کردم اما چیز زیادی دستگیرم نشد...



private void button1_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(myt);
t.Start();
}

protected void myt(object sender)
{
ManagerAPI.AnimateWindow(this.Handle, 1000, (Animation.DownToUp ^ Animation.LeftToRight ^ Animation.HIDE));
}
این خطاشه :



Cross-thread operation not valid: Control 'Form2' accessed from a thread other than the thread it was created on.
من نمی دونم اصلا پارامتری که باید از نوع object بهش بدم چی بذارم... نمی شه بدون پارامتر؟
سلام این به علت اینه که شما در thread جداگانه ای از thread اصلی اینکار رو میکنید ابتدا یک delegate تعریف کنید و بعد با نمونه سازی از اون delegate این ترد رو اجرا کنید.

موفق باشید

bahar_engineer
یک شنبه 17 آبان 1388, 10:33 صبح
در این حالت اون ترد یک آرگومان گرفته که یه متد هست از نوع void

اما من نتونستم به delegate آرگومانی از نوع void بدم ...

اینطوری تعریفش کردم



protected delegate void mydel(Thread thr);
و متدهایی که ساختم :



protected void myfunc(Thread thre)
{
thre = new System.Threading.Thread(myt);
thre.Start();
}

protected void myt(object sender)
{
ManagerAPI.AnimateWindow(this.Handle, 1000, (Animation.DownToUp ^ Animation.LeftToRight ^ Animation.HIDE));
}
و در رویداد کلیک دکمه ، از delegate استفاده کردم:


private void button1_Click(object sender, EventArgs e)
{

mydel myd = new mydel(myfunc);

}
خوب این کد ها مشکلشون چیه ؟ من تازه دارم روی delegate و ترد کار می کنم... لطفا راهنمایی کنید

اینم باز اجرا نمی کنه افکت رو .. یعنی اصلا اجرا نمی کنه چه فرمی زیر فرم جاری باشه چه نباشه

alireza_s_84
یک شنبه 17 آبان 1388, 17:21 عصر
سلام:


private delegate void CallAnimation(long hwnd, int time, Animation dwFlags);
Thread ThreadRunner;

protected void Runner()
{
CallAnimation del = new CallAnimation(AnimateWindow);
object[] Params = { this.Handle, 1000, (Animation.DownToUp ^ Animation.LeftToRight ^ Animation.HIDE) };
this.Invoke(del, Params);
}

public Form1()
{
InitializeComponent();

ThreadRunner = new Thread(new ThreadStart(Runner));
ThreadRunner.Start();
}

موفق باشید

bahar_engineer
دوشنبه 18 آبان 1388, 11:22 صبح
AnimateWindow توی کلاس بصورت داخلی تعریف شده

callanimation نمی شناسدش.



class ManagerAPI
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
internal static extern int AnimateWindow(IntPtr hwand, int dwTime, Animation dwFlags);
}




CallAnimation del = new CallAnimation(AnimateWindow);




the name 'AnimateWindow' Dosn't exist in the current context

Amir Oveisi
دوشنبه 18 آبان 1388, 12:06 عصر
برای رفع مشکل کار با Thread این لینک رو ببینید:
http://barnamenevis.org/forum/showpost.php?p=474172

موفق باشید

alireza_s_84
دوشنبه 18 آبان 1388, 17:26 عصر
خوب دوست عزیز من که براتون سورس رو فرستادم شما فضای نام پروژه تون رو برای فضای نام این کلاس بذارید یا اینکه متد AnimateWindow رو بیارید تو همین کلاس.
موفق باشید