الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Nudge

مغلق
بدأه Ayoub JAMAL EL IDRISSI في 5 يوليو 2005 · 17 رد · 2,570 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

هل فكر أحدكم أن يصمم كود ليجعل في نافذة برنامجه خاصية Nudge متل تلك الموجودة في المسنجر ولو للمتعة ؟

اليكم اذا الطريقة الجد جد بسيطة

دعوني أولا أشرح الفكرة العامة للعملية ثم نخوض في الكود

هذه الفكرة تقوم على تحريك الفورم فوق و أعلى و يسار و يمين لكن مع التوقف لمدة معينة بين كل تحريك يعني عند تحريك الفورم لليمين نعمل Sleep لل Sub لمدة معينة ثم نقوم بتحريكها مرة اخرى يسارا و هكذا ... سهلة العملية أليس كذلك. اذا دعونا نبدأ في الكود لأني أملا كثيرا من الكلام النظري :D

أولا نقوم باستدعاء فضاء الأسماء (namespace) الذي سنحتاجه في كودنا

Imports System.Threading

و نستدعي أيضا API لتقوم بتشغيل صوت وقت تنفيذ ال Nudge حتى يبدو الأمر حقيقيا :lol:

Private Declare Function sndPlaySoundA& Lib "winmm.dll" (ByVal lpszName As String, ByVal hModule As Int32)
Private Const SND_ASYNC As Int32 = &H1

و اذا كنت قد عملت بالفيجوال 6 فلن تخفى عليك هذه الدالة التي تشغل ملف صوتي دون تشغيل أي برنامج ...

ثم بطبيعة الحال سنقوم بانشاء Sub جديد نسميه Nudge و هذا ال Sub هو الذي سنقوم بكتابة الكود فيه

الكود سيكون كالتالي :

   Private Sub Nudge()
        
        sndPlaySoundA("C:\Program Files\MSN Messenger\nudge.wav", SND_ASYNC)
        For i = 0 To 4

            Me.Top = Me.DesktopLocation.Y - 6
            Thread.Sleep(30)
            Me.Top = Me.DesktopLocation.Y + 6
            Thread.Sleep(30)

            Me.Left = Me.DesktopLocation.X + 6
            Thread.Sleep(30)
            Me.Left = Me.DesktopLocation.X - 6
            Thread.Sleep(30)
       Next

لنرى الآن ماذا يحدث في هذا الكود أولا نستدعي الدالة sndPlaySoundA و نمرر لها اسم الملف الصوتي الذي يجب عليها تشغيله و كما تلاحظون فهو الملف الخاص بالمسنجر نفسه يعني الصوت الذي يحدثه عند تنفيذ Nudge ;)

بعد ذلك ندخل في حلقة تكرارية من 0 الى 4 ... ماذا يحدث في هذه الحلقة يا ترى ؟؟؟؟ :o

نلاحظ في السطر الأول أنه يتم تغيير Top النافذة استناذا الى موقع النافذة على الشاشة الذي نحصل عليه عن طريق الدالة DesktopLocation ثم بعد ذلك نقوم بجعل ال Thread أو نقوم بعمل Freeze لل Sub لمدة 30 Milliseconds ثم نواصل العملية التي هي نفس العملية السابقة فنقوم بارجاع النافذة لمكانها و بعد ذلك نغير موضعها افقيا و هكذا

و من أجل الحصول على نتائج جيدة يستحسن اعادة العملية مرتين ليكون الكود النهائي لل Sub Nudge هو التالي

Private Sub Nudge()
        
        sndPlaySoundA("C:\Program Files\MSN Messenger\nudge.wav", SND_ASYNC)
        For i = 0 To 4

            Me.Top = Me.DesktopLocation.Y - 6
            Thread.Sleep(30)
            Me.Top = Me.DesktopLocation.Y + 6
            Thread.Sleep(30)

            Me.Left = Me.DesktopLocation.X + 6
            Thread.Sleep(30)
           Me.Left = Me.DesktopLocation.X - 6
           Thread.Sleep(30)

            Me.Top = Me.DesktopLocation.Y - 6
            Thread.Sleep(30)
            Me.Top = Me.DesktopLocation.Y + 6
            Thread.Sleep(30)

            Me.Left = Me.DesktopLocation.X + 6
            Thread.Sleep(30)
            Me.Left = Me.DesktopLocation.X - 6
            Thread.Sleep(30
       Next

الآن سنكتب كود ال Button التي ستنفذ الأمر

و سيكون الكود هو : :)

Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim new_Thread As New Thread(AddressOf Nudge)
        new_Thread.Priority = ThreadPriority.Lowest
        new_Thread.Start()
    End Sub

تلاحظون أننا نفذنا ال Sub ك Thread جديد و منفصل حتى لا يحدث مشكل ساعة التنفيذ بعد ذلك حددنا ال Priority لل Thread على Lowest و اخيرا عملنا Start لل Thread

و هذا كل ما في الأمر

اتمنى أن يكون شرحي واضحا و أنا لن أضع الكود جاهز لأني أتمنى أن تفهمو الطريقة و تعملوها بأنفسكم دون اللجوء للمقص :D

و السلام عليكم و رحمة الله و بركاته

تم تعديل هذه المشاركة بواسطة crazy-man في 5 يوليو 2005 في 20:56

#2

اخويا crazy-man

انا مش عارف اشكرك ازاي

بارك الله فيك استفدت جدا جدا من فكرتك

الف شكر

#4

غير الأمر nudge إلى:

public Sub Nudge(control as System.Windows.Forms.Control)

وبهذا ستسطيع عمل Nudge لأي Control سواء كان Button أو TextFeild أو أي شيء آخر على الشاشة!!!

بالتوفيق!!

#7

رائع جدا

ممكن نعملها على الأدوات كمان

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#8

السلام عليكم ورحمة الله و بركاته

المشكلة أنها لا تعمل في حالة Maximized

أخوك عمرو عيسي

#9

ايه الحلاوه ده يا

crazy-man

سبحان الله وبحمده سبحان الله العظيم

لا اله الا الله محمدا رسول الله

اللهم اغفر للمسلمين والمسلمات والمؤمنين والمؤمنات الاحياء منهم والاموات

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

حمل كريستال ريبورت 10 اربعه اصدارات

ww12kz.jpg

hashad.jpg

#10

شكرا لك كتير

كود حلو

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#11

جزاك الله خير عمو crazy-man

أخي أبو مازن ممكت توضح التعديل بتاعك بمثال جزاك الله خير

فلسطين الزاهية بألوان الحب والسلام

ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها

تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين

#12

بصراحة لم أعمل ولا برنامج بـ VB.Net،، أرجو إصلاح هذه الشفرة ممن لديه العلم. فلم أجرب الشفرة:

كل ما في الأمر أن أتحكم بأي Control أو أداة تحكم بهذه الطريقة. هذه الطريقة تأخذ أي أداة تحكم وتهزه هزا طفيفا سواء كان زرا أو حقل كلمات أو أي شيء آخر يظهر على الشاشة!

public Shared Sub Nudge(cont as control as System.Windows.Forms.Control)
       
       
       For i = 0 To 4

           cont.Top = cont.DesktopLocation.Y - 6
           Thread.Sleep(30)
           cont.Top = cont.DesktopLocation.Y + 6
           Thread.Sleep(30)

           cont.Left = cont.DesktopLocation.X + 6
           Thread.Sleep(30)
          cont.Left = cont.DesktopLocation.X - 6
          Thread.Sleep(30)

           cont.Top = cont.DesktopLocation.Y - 6
           Thread.Sleep(30)
           cont.Top = cont.DesktopLocation.Y + 6
           Thread.Sleep(30)

           cont.Left = cont.DesktopLocation.X + 6
           Thread.Sleep(30)
           cont.Left = cont.DesktopLocation.X - 6
           Thread.Sleep(30
      Next
end sub

وأستخدم هذه الطريقة هكذا مثلا:

Dim Button1 as new Button
Dim TextField1 as new TextField
nudge(Button1)
nudge(TextField1)

أرجو أن يكون هذا مفيدا... وأرجو ممن يستطيع التجربة والتعديل أن يفعل ويرشد الأعضاء إلى الطريقة الصحيحة!

عموما، هذا مثال تطبيقي وعملي عن الوراثة. فالأزرار وحقول الكلمات والقوائم والنوافذ كلها ترث من أداة التحكم أو Control. وهذه العملية تأخذ أي Control وتهزه هزا طفيفا،،

بالتوفيق!!

تم تعديل هذه المشاركة بواسطة أبومازن في 9 أغسطس 2005 في 12:45

#13

لا تنس وضعه في Thread أو سلك مختلف عن الأساسي كما أشار Crazy-Man ، لأداء أفضل!!

#14

السلام عليكم و رحمة الله و بركاته

أعتقد أني و جدت حل مشكلة ال Maximized و عندما أقوم بتطبيقها سوف أرفق الحل أن شاء الله

أخوكم عمرو عيسي

#15

الكود شغال زى الفل بس فى حاله الماكسميز مش بيشتغل ليه؟؟؟؟؟؟؟

ايه الحل ؟

Amr Elsayed

meshmesh40@hotmail.com

http://groups.yahoo.com/group/Developers_For_Ever

#16

الحل في Maximiz size

#17

إليكم عملية الـ

  Public  Sub NudgeMe(ByVal tmpFrm As Form)
 	 Dim xCoord As Integer =  tmpFrm.Left 
 	 Dim yCoord As Integer =  tmpFrm.Top 
 	 Dim rnd As Integer =  0 

 	 Dim RandomClass As Random =  New Random() 

 	 Dim i As Integer
 	 For  i = 0 To  300 Step  i + 1
    rnd = RandomClass.Next(xCoord + 1, xCoord + 15)
    tmpFrm.Left = rnd
    rnd = RandomClass.Next(yCoord + 1, yCoord + 15)
    Me.tmpFrm.Top = rnd
 	 Next

 	 tmpFrm.Left = xCoord
 	 tmpFrm.Top = yCoord
  End Sub

لا تفعل إلا ما تستطيع أن تقوله ولا تقول إلا ما تسطيع أن تفعله

اللهم علمنا ما ينفعنا ونفعنا بما علمتنا وهب لنا من لدنك ولياً مرشدا

كلما أدبني الدهر أراني نقص عقلي ... وإذا ما زدت علماً زادني علماً بجهلي

أخوكم في الله أبو المجد

هيا نتعلم بعض المبادء لنطرق باب الإحتراف ************** جديد الدروس ( Application Domains and Assemblies)

التوقيت في دمشق:

<embed src="http://www.clocklink.com/clocks/0006-Gray.swf?TimeZone=R1T" width="200" height="240" wmode="transparent" type="application/x-shockwave-flash">

هذا الموضوع مغلق.