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

دالة تحريك الكائنات

بدأه مي جمال في 12 أبريل 2011 · 16 رد · 1,127 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

ارجو المساعدة ممن يستطيع مساعدتي......انا حاليا اعمل برنامج لترتيب صور واستخدمت هذة الدالة

هذه الدالة تسمح لنا بتحريك الكائنات على الفورم

Private start As New Point()

'حدث التحريك

Private Sub movement(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

Dim p As PictureBox = sender

If e.Button = MouseButtons.Left Then

Dim mousePos As Point = Me.PointToClient(Control.MousePosition)

If start.IsEmpty Then start = New Point(mousePos.X - p.Left, mousePos.Y - p.Top)

p.Location = New Point(mousePos.X - start.X, mousePos.Y - start.Y)

ElseIf Not start.IsEmpty Then

start = New Point()

End If

End Sub

ما اريده الان هو....انه عند الانتهاء من ترتيب الصور وظهور النتيجة

ان لا اسمح للمستخدم بإمكانية التحريك

ولكم جزيل الشكر

#2

أهلا اختي الكريمة،

إذا لم يكن تطبيقكِ يستخدم خوارزمية ليتحقق من صحة ترتيب الصور فإن المستخدم عالأغلب هو مصحح الترتيب، على أي حال، المفروض أن نعتمد على الخاصية (Enabled) لجعل الـ(PictureBoxes) قابلين أوغير قابلين للاستجابة:

Private Sub Done()
For Each PicBox As PictureBox In Panel1.Controls
PicBox.Enabled = False
Next PicBox
End Sub

مشكلة هذه الخاصية، هي تغير نظام ألوان عرض الصورة إلى التدرج الرمادي عند اسناد القيمة (False) إليها.

الحل الأخر هو القيام بتصريح متغير منطقي على مستوى خاص بالنسبة للصف الحاوي لمعامل حركة الـ(PictureBoxes) وهكذا يمكن تعديل المعامل ليلائم احتياجتك:

لنفرض أن اسم المتغير (Accessible) ، نقوم بالتصريح عنه في الصف الحاوي وليكن (Form1) :

Public Class Form1
Private start As New Point()
Private Accessible As Boolean = True

'حدث التحريك
Private Sub movement(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Accessible Then
Dim p As PictureBox = sender
If e.Button = MouseButtons.Left Then
Dim mousePos As Point = Me.PointToClient(Control.MousePosition)
If start.IsEmpty Then start = New Point(mousePos.X - p.Left, mousePos.Y - p.Top)
p.Location = New Point(mousePos.X - start.X, mousePos.Y - start.Y)
ElseIf Not start.IsEmpty Then
start = New Point()
End If
End If
End Sub


End Class

ومنه، عندما تكون قيمة المتغير محققة فإن المستخدم قادر على تحريك الـ(PictureBoxes) عدا ذلك، اي عندما تكون قيمة المتغير غير محققة (False) فإن شرط التحريك الأول غير محقق وبالتالي لن تستجيب الـ(PictureBoxes) لطلبات المستخدم.

ماعليك الآن الا التحكم بقيمة المتغير (Accessible) من خلال الخوارزمية المعتمدة أو الزر المسؤول.

بالتوفيق

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#3

السلام عليكم

اخي الكريم Bashar Rabat بصراحة الحل الاول ما فهمتو

بس الحل التاني اقتنعت فيه ونفذ

وظهر فيه مشكلة.....انو عند ظهور النتيجة للمستخدم

لو قام المستخدم بالضغط على الصورة الموجودة في الموقع الجديد

بهدف تحريكها......فإنها تعود الى موقعها الاصلي(الموقع القديم)

ولو قام المستخدم مرة اخرى بالنقر على الصورة بالموقع القديم (هنا لا يتم تحريك الصورة)

المطلوب هو ان الصورة عندما تصبح بالموقع الجديد( ان لا يتم تحريك الصورة)

ارجو ان تكون فهمت قصدي

شكرا

#4

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

الحل الأول هو الاسهل .. معناته لكل مربع صوره موجوده في ال Panel1 قم بتعطليها لئلا يتمكن المستخدم من تحريكها

بس السؤال ليش اختار الداه Panel .. يعني اذا كان صورك في الفورم يرجى استبدال الكود إلى


p.Enabled = False
Next
For Each p As PictureBox In Me.Controls

.:: Wish to become better and better ::.

#5

على مابيدو أنك تريد إيقاف وتشغيل قابلية الاستجابة للـ(PictureBoxes) بشكل فردي وليس الكل معا، عليك إذا ان تعتمد على الخاصية (Tag) لكل منهم وذلك بإسناد قيمة من قيمتين تابعين لنوع ما (نص، رقم، منطق) وتعديل الشرط الأولي للتحريك أي:

Public Class Form1

Private start As New Point()

Private Accessible As Boolean = True

'حدث التحريك

Private Sub movement(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

Dim p As PictureBox = sender

If p.Tag = SomeValue Then

If e.Button = MouseButtons.Left Then

Dim mousePos As Point = Me.PointToClient(Control.MousePosition)

If start.IsEmpty Then start = New Point(mousePos.X - p.Left, mousePos.Y - p.Top)

p.Location = New Point(mousePos.X - start.X, mousePos.Y - start.Y)

ElseIf Not start.IsEmpty Then

start = New Point()

End If

End If

End Sub

End Class

حيث SomeValue هي القيمة التي تقرر ماإذا كان المرسل (صندوق الصورة الحالي) قابل للاستجابة أو لا.

بالنسبة للمشكلة الأخرى،عذراً لايمكنني أن اكون اجابة لسؤال كهذا بدون شرح عن طريقة التحقق من الأماكن الصحيحة للـ(PictureBoxes).

بالتوفيق.

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#6

السلام عليكم

شكرا لكم جميعا

الاخ الكريم vb helper بصراحة جربت الطريقة الي حكيت عنها بس ما زبط ما بعرف ليش

اما الاخ الكريم Bashar Rabat شكرا لك جزيل الشكر..... عرفت وين كان الغلط عندي

كان في حدث الماوس اب الخاص بأرجاع الصورة الى مكانها الاصلي....وزبطت الغلط(أن جعلت قيمةالمتغير accicble=false...ومشى الحال

شكرا لكم

واسمحو لي بسؤال اخر......كيف لي ان امنع وضع اكثر من صورة فوق بعض عند التنفيذ

يعني برضو باستخدام نفس دالة التحريك(بديش ان يتم اسقاط اكثر من صورة على نفس الاحداثيات)

وشكرا

#7
مي جمال كتب:

السلام عليكم

شكرا لكم جميعا

الاخ الكريم vb helper بصراحة جربت الطريقة الي حكيت عنها بس ما زبط ما بعرف ليش

اما الاخ الكريم Bashar Rabat شكرا لك جزيل الشكر..... عرفت وين كان الغلط عندي

كان في حدث الماوس اب الخاص بأرجاع الصورة الى مكانها الاصلي....وزبطت الغلط(أن جعلت قيمةالمتغير accicble=false...ومشى الحال

شكرا لكم

واسمحو لي بسؤال اخر......كيف لي ان امنع وضع اكثر من صورة فوق بعض عند التنفيذ

يعني برضو باستخدام نفس دالة التحريك(بديش ان يتم اسقاط اكثر من صورة على نفس الاحداثيات)

وشكرا

مرحباً،

كيف تتم عملية إضافة الـ(PictureBoxes)؟ هل بالإمكان عرض مقطع الـ(Code) الذي يقوم بعملية إضافة وتنسيق الـ(PictureBoxes)؟

بكافة الأحوال يجب الاعتماد على احداثيات الـ(PictureBoxes) لمراعاة عدم وضع PictureBox فوق أخر (اي باستخدام حلقة تكرارية تمر عليهم للتأكد من عدم تتطابق الاحداثيات الحالية مع احداثيات واحد من الـ(PictureBoxes) المضافة) وإذا كان توليد الاحداثيات عشوائي ولا نريد ان تقع مساحة معينة (أياً كانت) من احد الـ(PictureBoxes) فوق مكان عرض PictureBox أخر فيجب الاعتماد على خاصية التقاطع (التداخل) للمستطيلات (الخاصية تدعى IsIntersected).

بالتوفيق

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#8

السلام عليكم

ما فهمت قصدك بعبارة(اضافة وتنسيق البكتشر بوكس)

بس انا الي عاملتو....انو مرفقة بالمشروع اربع صور

ووضع اربع بكشترات اسفل الفورم(بحيث يتم وضع كل صورة في بكتشر بوكس ويكونو مخربشات)

واربع بكتشرات اعلى الفورم(فاضيات)

وعند النتفيذ....المستخدم يعمل على ترتيب الصور بالشكل الصحيح في البكتشرات البوكس العلوية

بحيث اسمح للمستخدم بوضع الصور فقط في البكتشرات العلوية...واذا تم وضعها على اي مكان على الفورم غير البكتشرات الاربعة

تعود الصورة لمكانها الاصلي

والكود الخاص بذلك بالمرفقات

mai_jamal.txt

#9

أهلاً اختي الكريمة،

كما أرى أن التطبيق يتبع شكل واحد لعمل Puzzle وتنسيقها ضمن أربع قطع آفقية، وعند التحريك يتم التأكد ماإذا كانت منطقة (مكان وحجم) الـPictureBox المتحرك تطابق إحدى مناطق الـPictureBoxes الأربع (PictureBox1, PictureBox2, PictureBox3, PictureBox4) وفي حال تم التطابق مع احد هذه المناطق، تنتقل صورة الـPictureBox المتحرك إلى الـPictureBox الذي يطابق بمنطقته منطقة الـPictureBox المتحرك ثم يعود الـPictureBox المتحرك إلى مكانه الأصلي، وعند عدم التطابق يعود الـPictureBox المتحرك إلى مكانه الأصلي مع الصورة.

من المذكور نجد أنه أولاً يجب أن نستخدم نقطة متغير تمثل الاحداثيات الاصلية للـPictureBox المتحرك ومنه نجد أيضاً أن على هذه نقطةان تحدث قبل بدء عملية التحريك أي عند النقر على الـMouse للذلك (يمكن أن نستخدم الحدث MouseDown لنحدث هذه نقطة):

Public Class Form1
Private Start As New Point()
Private OriginalLocation As Point


Private Sub OnMove(Byval Sender As Object, Byval E As MouseEventArgs)
If E.Button = MouseButtons.Left Then OriginalLocation = DirectCast(Sender, PictureBox).Location
End If

End Sub

Private Sub Moving(ByVal Sender As Object, ByVal E As MouseEventArgs)
Dim P As PictureBox = DirectCast(Sender, PictureBox)
If Not P.Tag Is Nothing Then
If E.Button = MouseButtons.Left Then
Dim MousePos As Point = Me.PointToClient(Control.MousePosition)
Start = New Point(MousePos.X - P.Left, MousePos.Y - P.Top)
P.Location = New Point(mousePos.X - Start.X, mousePos.Y - Start.Y)
End If
End Sub

Private Sub Check(Byval Sender As Object, Byval E MouseEventArgs)
If E.Button = MouseButtons.Left Then
Dim P As PictureBox = DirectCast(Sender, PictureBox)
Dim IsctWith As PictureBox = IntersectsWith(P.Location)
If Not IsctWith Is Nothing Then
IsctWith.Image = P.Image
End If
P.Location = OriginalLocation
End If



Private Function IntersectsWith(Byval _Location As Point) As PictureBox
Dim IntersectedPicBox As PictureBox = Nothing
For Each Con As Control In Me.Controls
If TypeOf Con Is PictureBox Then
If Integer.Parse(Con.Name.Replace("PictureBox", "")) > 4 Then
With Con.ClientRectangle
If (_Location.X > .Left) And (_Location.X < .Right) And (_Location.Y > .Top) And (_Location.Y < .Bottom) THen
IntersectedPicBox = Con
Exit For
End If
End If
End If
Next Con
Return IntersectedPicBox 
End Function

End Class

عذراً لدي أمر طارىء سأعود لأشرح لك (لست متأكد إذا كان الـCode مكتمل من حيث الجمل الشرطية، بمعنى أخر: نهايات الجمل الشرطية) سأعود لأدقق، حاولي أن تفهمي النص المذكور في الأعلى وطبقي على أساسه.

بالتوفيق.

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#10

مرحباً،

تم إنشاء المشروع من البداية (الرجاء عدم اعتماد الـCode السابق لأن به نقص وبعض الأخطاء)، في المرفقات مثال شبيه بمشروعك لكن يستخدم تقنية أخرى لإنشاء Puzzle من أربعة أجزاء تابعة لصورة معينة.

الشرح:

1 - المتغيّرات المستخدمة:

Private Start As Point
Private OriginalLocation As Point
Private HandlersCreated As Boolean = False

Start: لتخزين موقع الـ(Mouse) على الـPictureBox عند النقر عليها (قبل التحريك تماماً).

OriginalLocation: لتخزين المكان الأصلي للـPictureBox المتحرك.

HandlerCreated: قيمة منطقية استخدمتها نظراً لإضافة خيار إعادة الفرز العشوائي الذي يستخدم عند اقلاع النموذج Form1.

2 - إجراء الفرز العشوائي لقطع الـPuzzleـ:

Private Sub CreatePuzzle()
        Dim PuzzleImage As Bitmap = My.Resources.P2
        Dim PartWidth As Integer = (Math.Floor(PuzzleImage.Width / 4))
        Dim PuzzleParts(3) As Bitmap
        For I As Integer = 0 To UBound(PuzzleParts)
            PuzzleParts(I) = PuzzleImage.Clone(New Rectangle(PartWidth * I, 0, _
            PartWidth, PuzzleImage.Height), PuzzleImage.PixelFormat)
        Next
        Dim LstOfRands As New List(Of Byte)
        For Each Con As Control In Me.Controls
            If TypeOf Con Is PictureBox Then
                If CType(Con, PictureBox).SizeMode <> 1 Then CType(Con, PictureBox).SizeMode = 1
                If Integer.Parse(Con.Name.Replace("PictureBox", "")) < 5 Then
                    If Not HandlersCreated Then
                        AddHandler Con.MouseDown, AddressOf PicOnMove
                        AddHandler Con.MouseMove, AddressOf PicMoving
                        AddHandler Con.MouseUp, AddressOf PicOnStop
                    End If
                    Dim NewRand As Byte = GetUniRand(LstOfRands, UBound(PuzzleParts))
                    LstOfRands.Add(NewRand)
                    Con.Tag = (NewRand + 1)
                    CType(Con, PictureBox).Image = PuzzleParts(NewRand)
                Else
                    CType(Con, PictureBox).Image = Nothing
                    Con.Tag = Nothing
                End If
            End If
        Next
    End Sub

يتم بهذا الإجراء:

1 - تحديد الصورة المستخدمة لإنشاء الـPuzzle (استخدمت صورة قد أضفتها إلى Resources التطبيق، اسمها P2 ـ).

2 - حساب عرض كل جزء من الأجزاء الأربعة بالاعتماد على الدالة Floor (تقوم بحساب أقرب قيمة صغرى للعدد، كمثال لدينا 1.99 عند استخدام هذه الدالة تصبح تلك القيمة 1)، الطول غير محدد لأنه غير مقسم نتيجة استخدام شكل آفقي فقط، ممايعني أن طول الجزء الواحد يساوي طول الصورة المستخدمة.

3 - تصريح مصفوفة احادية البعد للإشارة إلى أجزاء الصورة، ومن جهة أخرى لتسهيل عملية الفرز العشوائي).

4 - حلقة تكرارية لتوليد قطع الـPuzzle (أجزاء الصورة).

5 - تصريح قائمة لعناصر من Byte (السبب أننا نريد أن نخزن القيم العشوائية التي سنستخدمها للإشارة إلى رقم الجزء في المصفوفة، والسبب كي لايتم إعادة تكرار رقم ما) وسبب استخدان الـByte كوحدة لأن الرقم الأعظم هنا هو 4 أ نحن بغنى عن استخدام Integer أو Short وذلك لتوفير بعض الذاكرة.

6 - حلقة تكرارية مصدرية (For Each) تمر على جميع الـ(Controls) الموجودة في Form1 وإذا كان نوع الـControl هو PictureBox أي (If TypeOf Con Is PictureBox) إذا قم بالتالي:

6_1 اجعل خاصية عرض الصورة للـPictureBox التمدد إذا لم تكن كذلك.

6_2 - إذا كان العدد المحصل اسم الـPictureBox (بعد استبدال (PictureBox) بلاشيء) أصغر من 5 أي أن هذا الصندوق يعد من الصناديق المتحركة إذاً:

6_2_1 إذا لم تكن هناك معامِلات مضافة، قم بإضافة المعامِلات للأحداث المطلوبة (MouseDown, MouseMove, MouseUp).

3_6 تحصيل قيمة عدد عشوائي (يتم ارسال القائمة المذكورة سابقاً للتأكد من عدم تكرار العدد، ويتم ارسال القيمة العظمة عبر المُعاملات أيضاً لتحديد مدى العدد العشوائي).

6_4 إضافة العدد إلى القائمة ليتم تجاهله لاحقاً (عند طلب عدد عشوائي جديد).

6_5 استخدام الخاصية Tag لإسناد قيمة العدد العشوائي مضاف لها 1 (يمكن تجاهل الإضافة)، تستخدم هذه الخاصية لاحقاً لتصحيح الترتيب.

6_6 وضع جزء الصورة المقابل للعدد العشوائي المقابل في مصفوفة أجزاء الصورة المصرحة سابقاً (PuzzleParts) ـ.

6_2_2_1 عند عدم تحقق الشرط المذكور في الفقرة (6_2_1) يتم اسناد القيمة Nothing لخاصية الصورة للـPictureBox (عند عدم تحقق الشرط كماذكرنا، يكون الـPictureBox هو أحد الـPictureBoxes الثابتين أي يجب أن لايعرض صورة فيه عند بدء الحل).

6_2_2_2 اسناد القيمة Nothing لخاصية الـTag للـPictureBox الثابت لسبب سيشرح لاحقاً.

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

    Private Function GetUniRand(ByVal LstOfRands As List(Of Byte), _
    ByVal Max As Byte) As Byte
        Dim Rand As Byte = 0
        Do
            Rand = Math.Round(Max * Rnd())
        Loop Until Not LstOfRands.Contains(Rand)
        Return Rand
    End Function

أخيراً يتم استدعاء الإجراء CreatePuzzle بالحدث Load:

    Private Sub Form1_Load(ByVal Sender As Object, _
    ByVal E As EventArgs) Handles MyBase.Load
        CreatePuzzle()
        HandlersCreated = True
    End Sub

والحدث Click لزر إعادة التشغيل:

    Private Sub BtnRestart_Click(ByVal sender As Object, _
    ByVal E As EventArgs) Handles BtnRestart.Click
        CreatePuzzle()
    End Sub

هذه عمليات الفرز، لستِ بحاجة لها إذا كانت جاهزة لديك.

3 - عمليات التحريك:

عند البدء (كما رأينا يتم استخدام الحدث MouseDown)ـ

    Private Sub PicOnMove(ByVal Sender As Object, ByVal E As MouseEventArgs)
        If E.Button = Windows.Forms.MouseButtons.Left Then
            Start = E.Location
            OriginalLocation = DirectCast(Sender, PictureBox).Location
        End If
    End Sub

- تعين النقطة Start.

- تعين المكان الأصلي للـPictureBox قبل التحريك.

عند التحريك (الحدث المستخدم هو MouseMove)ـ

    Private Sub PicMoving(ByVal Sender As Object, ByVal E As MouseEventArgs)
        Dim P As PictureBox = DirectCast(Sender, PictureBox)
        If E.Button = Windows.Forms.MouseButtons.Left Then
            With P
                .Left = (.Left + (E.Location.X - Start.X))
                .Top = (.Top + (E.Location.Y - Start.Y))
            End With
        End If
    End Sub

عند الانتهاء (الحدث المستخدم MouseUp)ـ

    Private Sub PicOnStop(ByVal Sender As Object, ByVal E As MouseEventArgs)
        If E.Button = Windows.Forms.MouseButtons.Left Then
            Dim P As PictureBox = DirectCast(Sender, PictureBox)
            Dim IsctWith As PictureBox = IntersectsWith(P.Bounds)
            If IsctWith IsNot Nothing Then
                If IsctWith.Image Is Nothing Then
                    IsctWith.Image = P.Image
                    IsctWith.Tag = P.Tag
                    P.Image = Nothing
                End If
            End If
            P.Location = OriginalLocation
        End If
    End Sub

يتم التأكد ماإذا كانت منطقة الـPictureBox تقاطع إحدى مناطق الـPictureBoxesـ 5، 6، 7 و 8، عند تحقق الشرط يتم التأكد (إذا كان الـPicutreBox الثابت لايملك صورة، يتم نقل صورة الـPictureBox) ثم يتم إعادة الـPictureBox المتحرك إلى مكانه الأصلي.

العملية المستخدمة للحصول على الـPictureBox المقاطع بمنطقته لمنطقة الـPictureBox المتحرك:

    Private Function IntersectsWith(ByVal _Rect As Rectangle) As PictureBox
        Dim IntersectedPicBox As PictureBox = Nothing
        For Each Con As Control In Me.Controls
            If TypeOf Con Is PictureBox Then
                If Integer.Parse(Con.Name.Replace("PictureBox", "")) > 4 Then
                    If Con.Bounds.IntersectsWith(_Rect) Then
                        IntersectedPicBox = Con
                        Exit For
                    End If
                End If
            End If
        Next Con
        Return IntersectedPicBox

End Function

العملية تستخدم نفس التقنية للإيجاد المطلوب بواسطة (For Each) والمرور على الـControls في الـForm1 مع التأكد من شروط تم ذكر استخدامها، بالإضافة إلى شرط تقاطع المستطيلات، سبب استخدامنا PictureBox كنوع لمعطيات هذه العملية هو أننا بحاجة لإعداد خاصتي الصورة والـTag.

4 - عملية التدقيق أو التصحيح:

    Private Sub BtnCheck_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles BtnCheck.Click
        Dim Correct As Boolean = True
        Dim CurrentPicIndex As Byte = 5
        For Each Con As Control In Me.Controls
            If TypeOf Con Is PictureBox Then
                Dim PicNumber As Byte = Integer.Parse(Con.Name.Replace("PictureBox", ""))
                If PicNumber > 4 Then
                    Correct = Correct And (CByte(Con.Tag) < CurrentPicIndex)
                    CurrentPicIndex = CByte(Con.Tag)
                End If
            End If
        Next Con
        If Correct Then MsgBox("Congartulation!") Else MsgBox("Oops!, you were not lucky :[")
    End Sub

معقدة؟ (كلا) راجعي ماسبق وافهميه لتتمكني من فهم هذه أيضاً.

بالتوفيق.

OneDPuzzle.rar

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 15 أبريل 2011 في 00:49

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#11

السلام عليكم

شكرا لك اخي الكريم على الحل المطول

واضح انو الحل فوق مستواي....

بس بدي اسالك ليش عملت تمدد للصور؟؟

رح احاول افهم منيح واطبق....

شكرا لك على الشرح الوافي

#12

السلام عليكم

انا قرات الحل عدة مرات....مش كل اشي فهمتو

بس حاسة انو انتا بعدت عن السؤال الي انا سالتو

عدم السماح بإسقاط صورة فوق صورة على نفس البكتشر بوكس

مشان هيك رح ارقفلك المشروع وتشوف شو انا كاتبة

قسم تركيب الكلمات.rar

#13
مي جمال كتب:

السلام عليكم

شكرا لك اخي الكريم على الحل المطول

واضح انو الحل فوق مستواي....

بس بدي اسالك ليش عملت تمدد للصور؟؟

رح احاول افهم منيح واطبق....

شكرا لك على الشرح الوافي

العفو أختي الكريمة،

تم استخدام التمدد كوضع لعرض الصورة لجعل أجزاء الصورة تظهر وكأنها مصممة بالحجم المناسب (ظاهر وقابل للمقارنة) ففي حال استخدام صورة ذات (عرض > أو < من أربعة أضعاف عرض الجزء الواحد، أو طول > أو < من طول الجزء الواحد) سيظهر الجزء بشكل غير مناسب ضمن الـPictureBox بدون تحديد تلك الخاصية.

بالنسبة لسؤالك المذكور في الرد رقم 12، الطريقة مُتبعة في المثال الذي شرحته:

If IsctWith.Image Is Nothing Then
IsctWith.Image = P.Image
IsctWith.Tag = P.Tag
P.Image = Nothing
End If

أي إذا لم يكن للـPictureBox الثابت صورة، قم بنقل صورة الـPictureBox المتحرك إليه واجعل خاصيته تساوي خاصية الـPictureBox المتحرك (أي القيمة العشوائية لجزء الصورة).

سوف أقوم بدراسة مشروعكـ تدقيقه (التعديل عليه إذا لزم الأمر) ومن ثم سأرفقه لك مع شرح للخطوات المتبعة خلاا التنفيذ.

بالتوفيق.

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 15 أبريل 2011 في 21:00

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#14
مي جمال كتب:

السلام عليكم

انا قرات الحل عدة مرات....مش كل اشي فهمتو

بس حاسة انو انتا بعدت عن السؤال الي انا سالتو

عدم السماح بإسقاط صورة فوق صورة على نفس البكتشر بوكس

مشان هيك رح ارقفلك المشروع وتشوف شو انا كاتبة

حسناً، إليكِ ماتم تعديله والسبب والشرح:

Public Class Form1
    Dim Start As Point
    Dim OriginalLocation As Point
    Dim Accessible As Boolean = False

    Private Sub TrackBar1_Scroll(ByVal Sender As System.Object, _
    ByVal E As EventArgs) Handles TrackBar1.Scroll
        Select Case TrackBar1.Value
            Case 0
                PictureBox5.Load("..\..\Resources\مركب.jpg")
                PictureBox6.Load("..\..\Resources\كَ.jpg")
                PictureBox7.Load("..\..\Resources\رْ.jpg")
                PictureBox8.Load("..\..\Resources\بْ.jpg")
                PictureBox9.Load("..\..\Resources\مَ.jpg")
            Case 1
                PictureBox5.Load("..\..\Resources\أرنب.jpg")
                PictureBox6.Load("..\..\Resources\نَ.jpg")
                PictureBox9.Load("..\..\Resources\أَ.jpg")
            Case 2
                PictureBox5.Load("..\..\Resources\رمان.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox7.Load("..\..\Resources\مّ.jpg")
                PictureBox9.Load("..\..\Resources\رُ.jpg")
                PictureBox8.Load("..\..\Resources\نْ.jpg")
            Case 3
                PictureBox5.Load("..\..\Resources\حصان.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox9.Load("..\..\Resources\حِ.jpg")
                PictureBox7.Load("..\..\Resources\صَ.jpg")
                PictureBox8.Load("..\..\Resources\نْ.jpg")
            Case 4
                PictureBox5.Load("..\..\Resources\تفاح.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox8.Load("..\..\Resources\حْ.jpg")
                PictureBox7.Load("..\..\Resources\فّ.jpg")
                PictureBox9.Load("..\..\Resources\تُ.jpg")
            Case 5
                PictureBox5.Load("..\..\Resources\تفاح.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox7.Load("..\..\Resources\حْ.jpg")
                PictureBox8.Load("..\..\Resources\فّ.jpg")
                PictureBox9.Load("..\..\Resources\تُ.jpg")
            Case 6
                PictureBox5.Load("..\..\Resources\تفاح.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox7.Load("..\..\Resources\حْ.jpg")
                PictureBox8.Load("..\..\Resources\فّ.jpg")
                PictureBox9.Load("..\..\Resources\تُ.jpg")
            Case 7
                PictureBox5.Load("..\..\Resources\تفاح.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox7.Load("..\..\Resources\حْ.jpg")
                PictureBox8.Load("..\..\Resources\فّ.jpg")
                PictureBox9.Load("..\..\Resources\تُ.jpg")
            Case 8
                PictureBox5.Load("..\..\Resources\تفاح.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox7.Load("..\..\Resources\حْ.jpg")
                PictureBox8.Load("..\..\Resources\فّ.jpg")
                PictureBox9.Load("..\..\Resources\تُ.jpg")
            Case 9
                PictureBox5.Load("..\..\Resources\تفاح.jpg")
                PictureBox6.Load("..\..\Resources\ا.jpg")
                PictureBox7.Load("..\..\Resources\حْ.jpg")
                PictureBox8.Load("..\..\Resources\فّ.jpg")
                PictureBox9.Load("..\..\Resources\تُ.jpg")
        End Select
    End Sub

    Private Sub PictureBoxes_MouseDown(ByVal Sender As Object, _
    ByVal E As MouseEventArgs) Handles PictureBox6.MouseDown, _
    PictureBox7.MouseDown, PictureBox8.MouseDown, PictureBox9.MouseDown
        If E.Button = Windows.Forms.MouseButtons.Left Then
            Dim P As PictureBox = DirectCast(Sender, PictureBox)
            Start = E.Location
            OriginalLocation = P.Location
            Accessible = (Not CBool(P.Tag))
        End If
    End Sub

    Private Sub PictureBoxes_MouseMove(ByVal Sender As Object, _
    ByVal E As MouseEventArgs) Handles PictureBox6.MouseMove, _
    PictureBox7.MouseMove, PictureBox8.MouseMove, PictureBox9.MouseMove
        If Accessible Then
            If E.Button = Windows.Forms.MouseButtons.Left Then
                Dim p As PictureBox = DirectCast(Sender, PictureBox)
                With p
                    .Left = (.Left + (E.Location.X - Start.X))
                    .Top = (.Top + (E.Location.Y - Start.Y))
                End With
            End If
        End If
    End Sub

    Private Sub PictureBoxes_MouseUp(ByVal Sender As Object, _
    ByVal E As MouseEventArgs) Handles PictureBox6.MouseUp, _
    PictureBox7.MouseUp, PictureBox8.MouseUp, PictureBox9.MouseUp
        If E.Button = Windows.Forms.MouseButtons.Left Then
            If Accessible Then
                Dim p As PictureBox = DirectCast(Sender, PictureBox)
                If p.Left > PictureBox3.Left And p.Left < PictureBox3.Right And _
                p.Top > PictureBox3.Top And p.Top < PictureBox3.Bottom Then
                    p.Location = New Point(PictureBox3.Left, PictureBox3.Top)
                    p.Tag = True
                ElseIf p.Left > PictureBox2.Left And p.Left < PictureBox2.Right And _
                p.Top > PictureBox2.Top And p.Top < PictureBox2.Bottom Then
                    p.Location = New Point(PictureBox2.Left, PictureBox2.Top)
                    p.Tag = True
                ElseIf p.Left > PictureBox1.Left And p.Left < PictureBox1.Right And _
                p.Top > PictureBox1.Top And p.Top < PictureBox1.Bottom Then
                    p.Location = New Point(PictureBox1.Left, PictureBox1.Top)
                    p.Tag = True
                ElseIf p.Left > PictureBox4.Left And p.Left < PictureBox4.Right _
                And p.Top > PictureBox4.Top And p.Top < PictureBox4.Bottom Then
                    p.Location = New Point(PictureBox4.Left, PictureBox4.Top)
                    p.Tag = True
                Else
                    p.Location = OriginalLocation
                    p.Tag = False
                End If
                Ch()
            End If
        End If
    End Sub

    Private Sub Form1_Load(ByVal Sender As Object, _
    ByVal E As EventArgs) Handles Me.Load
        Reset()
    End Sub

    Private Sub Button3_Click(ByVal Sender As Object, _
    ByVal E As EventArgs) Handles Button3.Click
        ' يستخدم للسماح للمستخدم بإعادة المحاولة لتركيب الكلمة
        Reset()
    End Sub

    Private Sub Reset()
        TrackBar1_Scroll(TrackBar1, New EventArgs)
        PictureBox6.Location = New Point(418, 364)
        PictureBox7.Location = New Point(296, 364)
        PictureBox8.Location = New Point(176, 364)
        PictureBox9.Location = New Point(53, 364)
        PictureBox6.Tag = False
        PictureBox7.Tag = False
        PictureBox8.Tag = False
        PictureBox9.Tag = False
        Label1.Text = ""
    End Sub

    Public Sub Ch()
        Dim a, b, c, d As Boolean
        a = CBool(PictureBox6.Tag) : b = CBool(PictureBox7.Tag)
        c = CBool(PictureBox8.Tag) : d = CBool(PictureBox8.Tag)
        If a = True And b = True And c = True And d = True Then
        Dim Correct As Boolean = True
            Correct = Correct And (PictureBox6.Location.X > PictureBox8.Location.X And _
            PictureBox6.Location.X < PictureBox7.Location.X And PictureBox6.Location.X < PictureBox9.Location.X)
            Correct = Correct And (PictureBox7.Location.X > PictureBox6.Location.X And _
            PictureBox7.Location.X > PictureBox8.Location.X And PictureBox7.Location.X < PictureBox9.Location.X)
            Correct = Correct And (PictureBox8.Location.X < PictureBox6.Location.X And _
            PictureBox8.Location.X < PictureBox7.Location.X And PictureBox8.Location.X < PictureBox9.Location.X)
            Correct = Correct And (PictureBox9.Location.X > PictureBox6.Location.X And _
            PictureBox9.Location.X > PictureBox7.Location.X And PictureBox9.Location.X > PictureBox8.Location.X)
            If Correct Then
                Label1.Text = "أحسنت"
            Else
                Label1.Text = "حاول مرة اخرى"
            End If
        End If
    End Sub

End Class

بالنسبة للمتغيرات تم التخلي عن (Pic1, Pic2, Pic3, Pic4) لأن عملية المقارنة التي تقوم بالتصحيح لا تحتاج إلى متغيرات ضمن صفها، بل فقط ضمن إجراءها، أيضاً بالنسبة للـ(a, b, c, d) تم التخلي عنهم وذلك لأننا لسنا بحاجة لهم بعد استخدام الخاصية Tag للـPictureBoxes المتحركة والتي يتم اسناد قيمة منطيقة لها (False عند بدء التشغيل وعند الإعادة) و (True عند تحقق شرط وجود تقاطع مع الـPictureBoxes الثابتة، الشرط مصرح في الحدث MouseUp).

المتغيّران Accessible وStart مازالا موجودان لحاجتنا لقيمهم خلال عملية التحريك.

المتغيّر (OriginalLocation) يقوم بتخزين مكان بداية التحريك ( المكان الأصلي) للـPictureBox وعند انتهاء عملية التحريك (MouseUp) يتم إرجاع الـPictureBox المتحرك إلى مكانه الأصلي (OriginalLocation) في حال لم يتقاطع مع PictureBox ثابت لايحوي صورة.

الحدث Scroll للـTrackBar1 بما أن المقارنة تقوم على عدة شروط تقارن عنصر محدد مع قيم محددة فمن الأفصل استخدام Select Case في هذه الحالة، ولذلك تم تعديل هذه الفقرة.

استخدام الحدث MouseDown للـPictureBoxes المتحركين، لتحديث قيم المتغيّرات الثلاث (Start, OriginalLocation, Accessible).

حدث التحريك (MouseMove في السابق Movement)، تم تعديل اسم الحدث وإلحاقه بالعناصر (PictureBoxes المتحركة) التي ستقوم بتشيّده عند التحريك، شروط التحريك مازالت نفسها لكن Code تحديد الإحداثيات عُدل ليكون أبسط وأفضل أداءاً.

حدث التصحيح (MouseUp)، تم إلاحقه أيضاً بالعناصر (PictureBoxes المتحركة)، والتعديل على تعبير تحقق أحد الشروط وعدم تحققها (التعديل بسيط جداً،تم استبدال سطر إسناد القيمة True أو False إلى a, b, c, d بسطر إسناد القيمة True أو False إلى الخاصية Tag للـPictureBox المتحرك).

الحدث Load لـForm1 والحدث Click لـButton1 يستدعيان الإجراء التالي لضبط (صور أحرف الكلمة بتشيّد الحدث TrackBar1_Scroll، الاحداثيات الافتراضية للـPictureBoxes المتحركة، قيمة الخاصية Tag لكل منهم، نص الـLabel1).

عملية التدقيق (Ch)، تصريح a, b, c, d (هنا ممكن) لقراءة خاصية الـTag للـPictureBoxes المتحركة ضمنهم وتأكد من أن جميع القيم تساوي True (أي أن عملية التركيب مكتملة) فإذا كانت مكتملة يقوم التطبيق بتصريح متغيّر منطقي جديد (Correct) للتأكد من صحة الترتيب، لقد قمت باستبدال الجمل الشرطية بتعبير شرطي لتسهيل قراءة Code التصحيح كجملة واحدة. بعد الانتهاء من تدقيق الاحداثيات يتم تمرير قيمة التصحيح على جملة شرطية تعرض عبارة (أحسنت) ضمن Label1 في حال كان الترتيب صحيح وعبارة (حاول مرة أخرى) بالمقابل.

بالتوفيق.

شيء أخر، بماأن قراءة الصور تتم من قرص تخزين إلى الذاكرة فليس هناك حاجة لإضافة الصورة إلى Resources التطبيق.

بالتوفيق.

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#15

السلام عليكم

شكرا لك كثيرا على التعديلات....وعلى الطرق المستخدمة لجعل الكود يعمل بكفاءة اكتر...

بس لحد الان ما وصلت لحل...

لو حاولت توضع صورة فوق صورة اثناء النتفيذ رح تلاحظ انو بقبل....

#16
مي جمال كتب:

السلام عليكم

شكرا لك كثيرا على التعديلات....وعلى الطرق المستخدمة لجعل الكود يعمل بكفاءة اكتر...

بس لحد الان ما وصلت لحل...

لو حاولت توضع صورة فوق صورة اثناء النتفيذ رح تلاحظ انو بقبل....

لا ادري كيف نسيت ذلك :]

استبدلي حدث الـMouseUp بالتالي واضيفي العملية التي تليه إلى Code الـForm1 ـ:

    Private Sub PictureBoxes_MouseUp(ByVal Sender As Object, _
    ByVal E As MouseEventArgs) Handles PictureBox6.MouseUp, _
    PictureBox7.MouseUp, PictureBox8.MouseUp, PictureBox9.MouseUp
        If E.Button = Windows.Forms.MouseButtons.Left Then
            If Accessible Then
                Dim p As PictureBox = DirectCast(Sender, PictureBox)
                If p.Left > PictureBox3.Left And p.Left < PictureBox3.Right And _
                p.Top > PictureBox3.Top And p.Top < PictureBox3.Bottom Then
                    p.Tag = Not IsUsed(p.Location, PictureBox3.Location)
                ElseIf p.Left > PictureBox2.Left And p.Left < PictureBox2.Right And _
                p.Top > PictureBox2.Top And p.Top < PictureBox2.Bottom Then
                    p.Tag = Not IsUsed(p.Location, PictureBox2.Location)
                ElseIf p.Left > PictureBox1.Left And p.Left < PictureBox1.Right And _
                p.Top > PictureBox1.Top And p.Top < PictureBox1.Bottom Then
                    p.Tag = Not IsUsed(p.Location, PictureBox1.Location)
                ElseIf p.Left > PictureBox4.Left And p.Left < PictureBox4.Right _
                And p.Top > PictureBox4.Top And p.Top < PictureBox4.Bottom Then
                    p.Tag = Not IsUsed(p.Location, PictureBox4.Location)
                Else
                    p.Location = OriginalLocation
                    p.Tag = False
                End If
                Ch()
            End If
        End If
    End Sub

    Private Function IsUsed(ByRef _Location As Point, ByVal NewLocation As Point) As Boolean
        Dim Used As Boolean = False
        For Each Con As Control In Controls
            If TypeOf Con Is PictureBox Then
                If Integer.Parse(Con.Name.Replace("PictureBox", "")) > 5 Then
                    If (Con.Left = NewLocation.X) And (Con.Top = NewLocation.Y) Then Used = True : Exit For
                End If
            End If
        Next Con
        If Used Then _Location = OriginalLocation Else _Location = NewLocation
        Return Used
    End Function

بالتوفيق.

The important thing is not so much

that every child should be taught,

as that every child should be given the wish to learn.

#17

هادا الي بدي اياه....زبط :) :)

يسلمو

الله يرضى عليك

تحيتي

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…