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

Graphices In C# سؤال متقدم

بدأه النجمه الحره في 23 مارس 2009 · 5 رد · 776 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

<BR>في مشروعي احتجت لرسم عدة خطوط Line in Picturebox<BR>في الرسم اتبعت طريقه معينة (عند الضغط على مكان معين في Picturebox<BR>يبدأ رسم الخط مع الماؤس وعند الضغط مره اخرى على الpicturebox <BR>يتوقف عن الرسم) بهذه الطريقة رسمنا عدة خطوط واستخدمنا الاحداث الاتية<BR>MouseDown / MouseUp / MouseMove / Paint<BR>بالنسبة لل Picturebox<BR>عن طريق الكائن Graphices <BR>وسؤالي هو كيف اميز كل خط عن غيره بحيث عند الضغط على زر الحذف ثم الضغط على الخط المراد حذفه<BR>يتم الحذف لهذا الخط <BR>من لديه فكره معينه فليوافيني بها ولكم جزيل الشكر 

#2

هل هذا القصد

طيب ليه ما تسخدم كمبوبوكس و تضعي فيها انواع الخطوط خط (عريض رفيع الخ) .

او انك بعد الرسم تريد تحديد الخط المراد ازالته

تم تعديل هذه المشاركة بواسطة fota.live في 23 مارس 2009 في 06:16

FOTA KHader FAR

سوف اتجة الى عالم الويب

thumb_kujviv1t1.jpg

#3

الأخت الفاضلة

سؤالك بالفعل سؤال متقدم ومن المؤكد أنه يحتاج الي دراية جيدة جدا بالتعامل مع +GDI وخصوصا انه لا توجد استراتيجية محدده في الدوت نت يمكن من خلالها تحديد مكان الماوس علي خط معين قمنا برسمه إما داحل PictureBox أو داخل كونترول أو حتي داخل الفورم

لكن الأمر ليس مستحيلا حيث هنا عليك إتباع استراتيجية محتلفة قليلا عند رسم الخطوط ونفس الشئ أو نفس الفكرة تنطبق علي باق الأشكال الهندسية الأخري مثل المستطيل أو الدائرة او اي GraphicsPath

عموما ولكي لا أطيل عليكي الأمر أنت في حاجة الي بناء كلاسان في الكلاس الأول سنقوم بتعريف الخط ومن ثم إعطاؤه بعد الصفات والتي من خلالها نستطيع تحديد صفات الخط ومنها أيضا يمكننا استرجاع اي بيانات نريد والكلاس الثاني ستستخدمين فيه CollectionBase

والمثال التالي سيعطيك فكرة بسيطة عن كيفية تحديد اي خط من الخطوط يقف عليه الماوس وبالطبع يمكنك تطوير الفكرة عن طريق إضافة صفات أخري الي الكلاسان

ولتنفيذ المثال: افتح مشروع جديد ثم أضف الي الفورم PictureBox والشكل النهائي للمثال سيكون كالتالي

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


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.Collections;

namespace HitLinesTest
{
public partial class Form1 : Form
{
private myline line;
private bool isLineAdd;
private lineCollection lines = new lineCollection();
private Point position;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
pictureBox1.BackColor = Color.White;

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
if (!isLineAdd)
{
foreach (myline l in lines)
{
if (l.isMouseInLine(new Point(e.X, e.Y)))
l.Draw(g, Color.Red);
else
l.Draw(g, Color.Blue);
}
position = new Point(e.X, e.Y);
}

}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
line = new myline();
line.sp = new Point(e.X, e.Y);
isLineAdd = true;
}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
line.ep = new Point(e.X, e.Y);
lines.add(line);
isLineAdd = false;
pictureBox1.Refresh();


}
}

public class myline
{
public Point sp;
public Point ep;
public int lineWidth = 3;

public bool isMouseInLine(Point pt)
{
Pen pn = new Pen(Color.Blue, lineWidth);
GraphicsPath path = new GraphicsPath();
path.AddLine(sp, ep);
path.Widen(pn);
pn.Dispose();
if (path.IsVisible(pt))
return true;
return false;
}

public void Draw(Graphics g, Color clr)
{
Pen pn = new Pen(clr, lineWidth);
g.DrawLine(pn, sp, ep);
pn.Dispose();

}


}

public class lineCollection : CollectionBase
{
public void add(myline mline)
{
List.Add(mline);
}

public void remove(myline mline)
{
List.Remove(mline);
}

public myline this[int index]
{
get
{
return (myline)List[index];
}
set
{
List[index] = value;
}
}

}

}

هذه مجرد فكرة سريعة أتمني أن تعطيك فكرة بسيطة ليس إلا

بالتوفيق

أخوك عمر

تم تعديل هذه المشاركة بواسطة a_pess في 23 مارس 2009 في 09:30

#4

مرحباً أخـ(ـتـ)ـي الكريمـ(ـة),

حسبما فهمت من المذكور أعلاه أنك تريد عمل شيء شبيه بأشكال قابلة للتعديل ( تحريك, تغيّر الحجم, لون, الخ...) لن تحتاج إلا إلى خوارزمية بسيطة تعتمد بعض الحسابات بمبدء هندسي, وماأقصده بهذا المبدء هو حساب أبعاد ذلك الشكل كـ( Left, Top, Right, Bottom ) وتحصيل الحجم الأساسي له أي الـ( Width ) والـ( Height ), بعد ذلك عليك اعتماد بعض الأحداث كالتي قمت بذكرها وهي ( MouseDown, MouseMove, MouseUp ) وطبعاً عليك إما إستخدام ( آداة أومتغيّر ) من نوع منطقي لكي تحدد مالذي تريد عمله ( أي : إضافة شكل جديد أو إختيار شكل من الأشكال المضافة سابقاً ) أو الإستغناء عن الأحداث السابقة واستخدام حدث أخر كـ( MouseDoubleClick ) للإضافة, صنعت مثال بسيط عن هذه الفكرة لكنه وللأسف ليس بلغة الـ C#, أمل أن يفيدك .

بالتوفيق

DrawingFocusedLines.zip

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 24 مارس 2009 في 20:20

The important thing is not so much

that every child should be taught,

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

#5

عذراً لاحظت أنني نسيت أن أغطي جانب من جوانب شروط تواجد نقطتي البداية والنهاية ( بالنسبة للتركيز ), الرجاء استبدال العملية ( CheckSelectedLine ) بالتالي :

 

[color= #000000; font-weight: bold;]private bool CheckSelectedLine[color= #009900;](Line L[color= #339933;], Point EL[color= #009900;])

[color= #009900;]{

    [color= #009900;]{

        double Diff [color= #339933;]= [color= #cc66cc;]0[color= #339933;];

        int HObj [color= #339933;]= [color= #cc66cc;]0[color= #339933;];

        bool XNega [color= #339933;]= [color= #000000; font-weight: bold;]false[color= #339933;];

        [color= #b1b100;]if [color= #009900;](L[color= #339933;].Width [color= #339933;]>= L[color= #339933;].Height[color= #009900;]) [color= #009900;]{

            Diff [color= #339933;]= [color= #009900;](double[color= #009900;])L[color= #339933;].Height [color= #339933;]/ L[color= #339933;].Width[color= #339933;];

            XNega [color= #339933;]= [color= #009900;]([color= #009900;]([color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].Y [color= #339933;]> L[color= #339933;].SecondPoint[color= #339933;].Y[color= #009900;]) [color= #339933;]& [color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].X [color= #339933;]< L[color= #339933;].SecondPoint[color= #339933;].X[color= #009900;])[color= #009900;]) 
[color= #339933;]| [color= #009900;]([color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].X [color= #339933;]> L[color= #339933;].SecondPoint[color= #339933;].X[color= #009900;]) [color= #339933;]& [color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].Y [color= #339933;]< L[color= #339933;].SecondPoint[color= #339933;].Y[color= #009900;])[color= #009900;])[color= #009900;])[color= #339933;];

            [color= #b1b100;]for [color= #009900;](int X [color= #339933;]= [color= #cc66cc;]0[color= #339933;]; X [color= #339933;]<= L[color= #339933;].Width[color= #339933;]; X[color= #339933;]++[color= #009900;]) [color= #009900;]{

                [color= #b1b100;]if [color= #009900;](XNega[color= #009900;]) HObj [color= #339933;]= Math[color= #339933;].[color= #990000;]Min[color= #009900;](L[color= #339933;].Height [color= #339933;]- [color= #009900;](int[color= #009900;])Diff [color= #339933;]* X[color= #339933;], L[color= #339933;].Height[color= #009900;])[color= #339933;];                
 [color= #b1b100;]else HObj [color= #339933;]= Math[color= #339933;].[color= #990000;]Min[color= #009900;]([color= #009900;](int[color= #009900;])Diff [color= #339933;]* X[color= #339933;], L[color= #339933;].Height[color= #009900;])[color= #339933;];

                [color= #b1b100;]if [color= #009900;]([color= #009900;](EL[color= #339933;].X [color= #339933;]== [color= #009900;](L[color= #339933;].Left [color= #339933;]+ X[color= #009900;])[color= #009900;]) [color= #339933;]& [color= #009900;]([color= #009900;](EL[color= #339933;].Y [color= #339933;]>= [color= #009900;]([color= #009900;](L[color= #339933;].Top [color= #339933;]+ HObj[color= #009900;]) [color= #339933;]- [color= #009900;](L[color= #339933;].PenWidth [color= #339933;]/ [color= #cc66cc;]2[color= #009900;])[color= #009900;])[color= #009900;]) [color= #339933;]& [color= #009900;](
EL[color= #339933;].Y [color= #339933;]<= [color= #009900;]([color= #009900;](L[color= #339933;].Top [color= #339933;]+ HObj[color= #009900;]) [color= #339933;]+ [color= #009900;](L[color= #339933;].PenWidth [color= #339933;]/ [color= #cc66cc;]2[color= #009900;])[color= #009900;])[color= #009900;])[color= #009900;])[color= #009900;]) [color= #b1b100;]return [color= #000000; font-weight: bold;]true[color= #339933;];

            [color= #009900;]}

        [color= #009900;]}

        [color= #b1b100;]else [color= #009900;]{

            Diff [color= #339933;]= [color= #009900;](double[color= #009900;])L[color= #339933;].Width [color= #339933;]/ L[color= #339933;].Height[color= #339933;];

            XNega [color= #339933;]= [color= #009900;]([color= #009900;]([color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].X [color= #339933;]> L[color= #339933;].SecondPoint[color= #339933;].X[color= #009900;]) [color= #339933;]& [color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].Y [color= #339933;]< L[color= #339933;].SecondPoint[color= #339933;].Y[color= #009900;])[color= #009900;]) 
[color= #339933;]| [color= #009900;]([color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].Y [color= #339933;]> L[color= #339933;].SecondPoint[color= #339933;].Y[color= #009900;]) [color= #339933;]& [color= #009900;](L[color= #339933;].FirstPoint[color= #339933;].X [color= #339933;]< L[color= #339933;].SecondPoint[color= #339933;].X[color= #009900;])[color= #009900;])[color= #009900;])[color= #339933;];

            [color= #b1b100;]for [color= #009900;](int Y [color= #339933;]= [color= #cc66cc;]0[color= #339933;]; Y [color= #339933;]<= L[color= #339933;].Height[color= #339933;]; Y[color= #339933;]++[color= #009900;]) [color= #009900;]{

                [color= #b1b100;]if [color= #009900;](XNega[color= #009900;]) HObj [color= #339933;]= Math[color= #339933;].[color= #990000;]Min[color= #009900;](L[color= #339933;].Width [color= #339933;]- [color= #009900;](int[color= #009900;])Diff [color= #339933;]* Y[color= #339933;], L[color= #339933;].Width[color= #009900;])[color= #339933;];                 e
lse HObj [color= #339933;]= Math[color= #339933;].[color= #990000;]Min[color= #009900;]([color= #009900;](int[color= #009900;])Diff [color= #339933;]* Y[color= #339933;], L[color= #339933;].Width[color= #009900;])[color= #339933;];

                [color= #b1b100;]if [color= #009900;]([color= #009900;]([color= #009900;](EL[color= #339933;].X [color= #339933;]>= [color= #009900;]([color= #009900;](L[color= #339933;].Left [color= #339933;]+ HObj[color= #009900;]) [color= #339933;]- [color= #009900;](L[color= #339933;].PenWidth [color= #339933;]/ [color= #cc66cc;]2[color= #009900;])[color= #009900;])[color= #009900;]) [color= #339933;]& [color= #009900;](EL[color= #339933;].X [color= #339933;]<= [color= #009900;]([color= #009900;](L[color= #339933;].Left [color= #339933;]+ HObj[color= #009900;])
 [color= #339933;]+ [color= #009900;](L[color= #339933;].PenWidth [color= #339933;]/ [color= #cc66cc;]2[color= #009900;])[color= #009900;])[color= #009900;])[color= #009900;]) [color= #339933;]& [color= #009900;](EL[color= #339933;].Y [color= #339933;]== [color= #009900;](L[color= #339933;].Top [color= #339933;]+ Y[color= #009900;])[color= #009900;])[color= #009900;]) [color= #b1b100;]return [color= #000000; font-weight: bold;]true[color= #339933;];

            [color= #009900;]}

        [color= #009900;]}

    [color= #009900;]}

    [color= #b1b100;]return [color= #000000; font-weight: bold;]false[color= #339933;];

[color= #009900;]}

أيضاً استبدال بداية ونهاية ومقدار زيادة الحلقة التكرارية الحاوية ( اي التي تقوم بإستخدام العملية ( CheckSelectedLine ) وهي موجودة في الحدث ( Protected Overrides Sub OnMouseDown ) ), والذي عليك تعديل كما ذكر ( البداية والنهاية ) وذلك بعكس القيم أي جعل قيمة البداية تساوي قيمة النهاية والنهاية تساوي قيمة البداية, ومن ثم جعل مقدار الزيادة -1 ليتم اختيار الخط الأعلى بالنسبة للخطوط المضافة .

بالتوفيق

تم تعديل هذه المشاركة بواسطة Bashar Rabat في 24 مارس 2009 في 20:41

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

جزاكم الله خيرا

الاخ a_pass لقد نفذت الكود الذي ارسلته وجربت استخدم

دالة ال remove لحذف الخط الذي ضغطت عليه لكنه لم ينحذف

ولم ادري اين الخلل وايضا كيف اعيد الindex للخط الذي ضغطت عليه

مع العلم أني بدأت مع اللغه عن قريب ولم استخدم الكلاس colectionbase

من قبل

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

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