PDA

View Full Version : سوال: تغییر سایز آبجکت ها بصورت هوشمند



MehdiElexal
یک شنبه 29 شهریور 1394, 18:57 عصر
با سلام خدمت دوستان گلم
یه برنامه میخوام که یک عدد از ورودی میگیره و بصورت تصویر میخوام مربع هایی با اندازه های ماکسیمم تحویل بده
بطور مثال ما یک پیکچر باکس مربعی داریم و میخواییم داخل این اشیا رو ایجاد کنیم اما اگر از ورودی عدد 1 رو گرفت باید یک مربع بزرگ توش بکشه یکم کوچیک تر از ماکسیمم ( برای زیبایی لبه ها) اگر عدد مثلا 4 رو گرفت 4 تا مربع بکشه بصورت مساوی مثلا 2 تا بالا 2 تا پایین مثل عکسی ک ضمیمه کردم اگر مثلا عدد 80 رو گرفت 80 تا مربع بکشه مثلا تو 8 سطر و 10 ردیف ، به این صورت میخوام این کار رو انجام بدم ، کد نویسیش یکم پیچیده میشه واسه همین گفتم از دوستانی ک تو این ضمینه فعالیت داشتن کمک بگیرم ببینم چطور این کار رو انجام بدم ،
با تشکر

Mahmoud Zaad
یک شنبه 29 شهریور 1394, 20:02 عصر
سلام
ساده است فقط شما به جای اینکه تعداد کل مربع (ظاهراً بالایی ها مستطیل هستند!) ها رو بگیرید باید تعداد مربع ها در سطر و ستون رو از کاربر بگیرید. خب الان شما ارتفاع (Height) پیکچرباکس رو دارید تعداد سطرها رو هم دارید یه تقسیم انجام میدید Height مربع ها کوچیک بدست میاد. برای عرض Width هم همین کار رو انجام می دید. چند پیکسل هم برای فاصله بین مربع ها قرار می دید و در نهایت با متد DrawLine نقاط رو به هم متصل می کنید.

*************
اگه تعداد سطر و ستون رو هم نرم افزار باید محاسبه کنه که مساله پیچیده میشه، اینو دقیقتر توضیح بدید.

rahnema1
دوشنبه 30 شهریور 1394, 00:40 صبح
سلام
بفرمایید اینم کد. فقط یه picturebox و یه textbox و یه دونه button را به فرم اضافه کنید البته یه نکته اینه که ممکنه تعداد مربعها با عدد وارد شده در تکست باکس یکی نشه مثلا فرض کنید شما در تکست باکس عدد 31 را وارد کنید. خب 31 عدد اوله که به هیچ عددی بخش پذیر نیست. به جای اینکه یه ردیف مربع به صورت 1 در 31 بکشه میاد به صورتی عمل می کنه که تعداد سطر ها و ستونها تقریبا برابر بشن. مثلا در این مورد 5 سطر و 6 ستون ایجاد می کنه که جمعا 30 تا مربع ایجاد بشه

void drawWindow(Graphics g, Color background, Pen pen,int number_of_squares, int separation)
{
RectangleF bound = g.VisibleClipBounds;
int rows = (int)Math.Sqrt(number_of_squares);
int cols = (int)Math.Round(number_of_squares / (double)rows);
float height = (bound.Height - pen.Width*2-separation) / rows ;
float width = (bound.Width - pen.Width*2-separation) / cols;

RectangleF[] rects = new RectangleF[rows * cols + 1];
rects[0] = new RectangleF(bound.Left + pen.Width/2, bound.Top + pen.Width/2,
bound.Width-pen.Width, bound.Height-pen.Width);
int r = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
rects[r++] = new RectangleF(j*width+separation + pen.Width * 1.5f,
i*height +separation + pen.Width *1.5f,
width-separation-pen.Width,
height-separation-pen.Width);
}
}
g.Clear(background);
g.DrawRectangles(pen, rects);
}
void Button1Click(object sender, EventArgs e)
{
drawWindow(pictureBox1.CreateGraphics(), Color.White, new Pen(Color.Black, 2), int.Parse(textBox1.Text), 2);
}

MehdiElexal
شنبه 04 مهر 1394, 16:09 عصر
سلام
بفرمایید اینم کد. فقط یه picturebox و یه textbox و یه دونه button را به فرم اضافه کنید البته یه نکته اینه که ممکنه تعداد مربعها با عدد وارد شده در تکست باکس یکی نشه مثلا فرض کنید شما در تکست باکس عدد 31 را وارد کنید. خب 31 عدد اوله که به هیچ عددی بخش پذیر نیست. به جای اینکه یه ردیف مربع به صورت 1 در 31 بکشه میاد به صورتی عمل می کنه که تعداد سطر ها و ستونها تقریبا برابر بشن. مثلا در این مورد 5 سطر و 6 ستون ایجاد می کنه که جمعا 30 تا مربع ایجاد بشه

void drawWindow(Graphics g, Color background, Pen pen,int number_of_squares, int separation)
{
RectangleF bound = g.VisibleClipBounds;
int rows = (int)Math.Sqrt(number_of_squares);
int cols = (int)Math.Round(number_of_squares / (double)rows);
float height = (bound.Height - pen.Width*2-separation) / rows ;
float width = (bound.Width - pen.Width*2-separation) / cols;

RectangleF[] rects = new RectangleF[rows * cols + 1];
rects[0] = new RectangleF(bound.Left + pen.Width/2, bound.Top + pen.Width/2,
bound.Width-pen.Width, bound.Height-pen.Width);
int r = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
rects[r++] = new RectangleF(j*width+separation + pen.Width * 1.5f,
i*height +separation + pen.Width *1.5f,
width-separation-pen.Width,
height-separation-pen.Width);
}
}
g.Clear(background);
g.DrawRectangles(pen, rects);
}
void Button1Click(object sender, EventArgs e)
{
drawWindow(pictureBox1.CreateGraphics(), Color.White, new Pen(Color.Black, 2), int.Parse(textBox1.Text), 2);
}

دوست عزیز واقعا ممنون کارمو راه انداختی ولی یک کار دیگم میخوام انجام بدم که نتونستم با کد شما انجام بدم ، میخوام اونجایی که برای بک گراند رنگ میدی که چه رنگی باشه ، جاش عکس بدم به مربع ها که یه عکس بیوفته بک گراند هر مربعی که تشکیل میشه این یکی ، مورد دیگم میخوام داخلش بتونم تکتس داشته باشم که مثلا داخلش عدد بنویسم مثل 1 2 3 هرچی .... , و اینکه چطور متوجه شم کاربر رو کدوم مربع کلیک کرده ؟
پس شد سه مورد یکی عکس بک گراند هر مربع
مورد دوم داشتن یک تکتسی که بتونم داخل هر مربعی عدد بنویسم
مورد سوم اگر رو مربعی کلیک شد چطور متوجه شم کدوم کلیک شده
واقعا ممنون میشم این مورد نهایی رو هم کمک کنید
با تشکر فرآوان

rahnema1
شنبه 04 مهر 1394, 20:42 عصر
روش راحت اینه که واسه هر مربع شما مثلا یه label یا مثلا button ایجاد کنید که هم قابلیت متن داره و هم قابلیت کلیک
حالا شما انجام بدید هر جا به مشکل خوردید کد را بذارید تا ما هم با شما همراهی کنیم

MehdiElexal
شنبه 04 مهر 1394, 22:30 عصر
روش راحت اینه که واسه هر مربع شما مثلا یه label یا مثلا button ایجاد کنید که هم قابلیت متن داره و هم قابلیت کلیک
حالا شما انجام بدید هر جا به مشکل خوردید کد را بذارید تا ما هم با شما همراهی کنیم
ممنون که پیگیری کردید تایپیک رو
برای عکس بک گراند تو قسمتی که آبجکت ایجاد میشه شما رنگ تعیین کردید ، من اصلا نمیدونم چجوری تغییرش بدم و تبدیلش کنم به ورودی تصویر ، سعیمم کردم ولی جور در نیومد حقیقت ، کلا بنده با مفهوم شی گرایی متاسفانه هنوز مشکل دارم
و اینکه دکمه نمیخوام باشه میخوام داخل محیط مربع مورد نظر که کلیک شد رویدادی صدا زده شه
واقعا هم نمیدونم اون وسط چجوری یه لیبل ایجاد کنم وگرنه مطمئناا مذاحم شما نمیشدم و دست به کار میشدم
اما ممنون بابت کمکی که به بنده کردید . :لبخندساده:
مشکل اینجاست که بنده با مفهوم ایجاد اشیا مشکل دارم و عموما بصورا ویزارد کار کردم برا همین اینجا گیر کردم
بلکه این پروژه کمکی کنه تا با این مفهوم بیشتر آشنا شم
با تشکر

rahnema1
یک شنبه 05 مهر 1394, 07:42 صبح
من شخصا سعی می کنم جواب سوالاتی که واسم پیش میاد حتی از زیر سنگ هم باشه بیرون بکشم
بعضی از سوالات خودش نیاز داره که بعضی از مقدمات و لوازم اون را بدونیم مثلا در اینجا شما لازمه گرافیک و کار با کنترلها و چند تا چیز دیگه بلد باشید که منابع در کتاب و اینترنت زیاده
هر جا شما مثلا در مورد یه چیزی اشکال داشتید می تونید توی این تالار بپرسید. خوشبختانه اینجا هم مدیران کاربلد و هم کاربران خوبی هستند که می تونند به تک تک سوالات پاسخ بدهند مثلا شیء گرایی یا چیزهای دیگه
منظورم اینه که شما مفاهیم را خوب بلد باشید و با توجه به اون مسائل را حل کنید که لذت این کار بیشتره
اما مثلا بگید یکی این را انجام بده که از روی اون یاد بگیرم مثل این می مونه که بخواهید واسه یه تمرین به کتاب حل المسائل مراجعه کنید فکر کنم واسه یادگیری خیلی مناسب نباشه
در هر صورت کد را یه کم تغییر دادم به صورت زیر:

void drawWindow(Control control, Color background, Pen pen, int number_of_squares, int separation)
{
control.Controls.Clear();
Bitmap bm = new Bitmap(control.Width, control.Height);
Graphics g = Graphics.FromImage(bm);
RectangleF bound = g.VisibleClipBounds;
int rows = (int)Math.Sqrt(number_of_squares);
int cols = (int)Math.Round(number_of_squares / (double)rows);
float height = (bound.Height - pen.Width*2-separation) / rows ;
float width = (bound.Width - pen.Width*2-separation) / cols;

RectangleF[] rects = new RectangleF[rows * cols + 1];
Control[] labels = new Label[rows * cols];
rects[0] = new RectangleF(bound.Left + pen.Width/2, bound.Top + pen.Width/2,
bound.Width -pen.Width, bound.Height-pen.Width);
int r = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int L = (int)Math.Round(j*width +separation + 2*pen.Width);
int T = (int)Math.Round(i*height +separation + 2*pen.Width);
int W = (int)Math.Round(width -separation- 2 *pen.Width);
int H = (int)Math.Round(height -separation- 2 *pen.Width);
labels[r-1] = new Label{
Text = i+","+j,
Left = L,
Top = T,
Width = W,
Height = H,
};
labels[r-1].Click += new EventHandler(labelClick);
rects[r++] = new RectangleF(L -0.5f *pen.Width,
T -0.5f * pen.Width,
W+pen.Width,
H+pen.Width);
}
}

g.Clear(background);
g.DrawRectangles(pen, rects);
control.BackgroundImage = bm;
control.Controls.AddRange(labels);
}
void Button1Click(object sender, EventArgs e)
{

drawWindow(pictureBox1, Color.Pink, new Pen(Color.Black, 4), int.Parse(textBox1.Text), 6);
}
void labelClick(object sender, EventArgs e)
{
MessageBox.Show (((Label)sender).Text);
}

MehdiElexal
سه شنبه 07 مهر 1394, 10:54 صبح
واقعا ممنون مهندس
بنده به دید حل المسائل به این کد ها نگاه نمیکنم
حتما سورس ها رو نگاه میکنم ببینم چطور این کار انجام شده ، چون در گرافیک خیلی ضعیف هستم نمیتونم خودم دست به کار شم ، باید چند نمونه ببینم بعد دست به کار شم مثل یه آموزشی مثل این سورس
در هر صورت ممنون

MehdiElexal
جمعه 17 مهر 1394, 18:20 عصر
من شخصا سعی می کنم جواب سوالاتی که واسم پیش میاد حتی از زیر سنگ هم باشه بیرون بکشم
بعضی از سوالات خودش نیاز داره که بعضی از مقدمات و لوازم اون را بدونیم مثلا در اینجا شما لازمه گرافیک و کار با کنترلها و چند تا چیز دیگه بلد باشید که منابع در کتاب و اینترنت زیاده
هر جا شما مثلا در مورد یه چیزی اشکال داشتید می تونید توی این تالار بپرسید. خوشبختانه اینجا هم مدیران کاربلد و هم کاربران خوبی هستند که می تونند به تک تک سوالات پاسخ بدهند مثلا شیء گرایی یا چیزهای دیگه
منظورم اینه که شما مفاهیم را خوب بلد باشید و با توجه به اون مسائل را حل کنید که لذت این کار بیشتره
اما مثلا بگید یکی این را انجام بده که از روی اون یاد بگیرم مثل این می مونه که بخواهید واسه یه تمرین به کتاب حل المسائل مراجعه کنید فکر کنم واسه یادگیری خیلی مناسب نباشه
در هر صورت کد را یه کم تغییر دادم به صورت زیر:

void drawWindow(Control control, Color background, Pen pen, int number_of_squares, int separation)
{
control.Controls.Clear();
Bitmap bm = new Bitmap(control.Width, control.Height);
Graphics g = Graphics.FromImage(bm);
RectangleF bound = g.VisibleClipBounds;
int rows = (int)Math.Sqrt(number_of_squares);
int cols = (int)Math.Round(number_of_squares / (double)rows);
float height = (bound.Height - pen.Width*2-separation) / rows ;
float width = (bound.Width - pen.Width*2-separation) / cols;

RectangleF[] rects = new RectangleF[rows * cols + 1];
Control[] labels = new Label[rows * cols];
rects[0] = new RectangleF(bound.Left + pen.Width/2, bound.Top + pen.Width/2,
bound.Width -pen.Width, bound.Height-pen.Width);
int r = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
int L = (int)Math.Round(j*width +separation + 2*pen.Width);
int T = (int)Math.Round(i*height +separation + 2*pen.Width);
int W = (int)Math.Round(width -separation- 2 *pen.Width);
int H = (int)Math.Round(height -separation- 2 *pen.Width);
labels[r-1] = new Label{
Text = i+","+j,
Left = L,
Top = T,
Width = W,
Height = H,
};
labels[r-1].Click += new EventHandler(labelClick);
rects[r++] = new RectangleF(L -0.5f *pen.Width,
T -0.5f * pen.Width,
W+pen.Width,
H+pen.Width);
}
}

g.Clear(background);
g.DrawRectangles(pen, rects);
control.BackgroundImage = bm;
control.Controls.AddRange(labels);
}
void Button1Click(object sender, EventArgs e)
{

drawWindow(pictureBox1, Color.Pink, new Pen(Color.Black, 4), int.Parse(textBox1.Text), 6);
}
void labelClick(object sender, EventArgs e)
{
MessageBox.Show (((Label)sender).Text);
}

با تشکر فرآوان خدمت راهنما 1
چطور باید برای هر مربع عکس بک گراند تعیین کرد ؟
بنده هر چی تلاش میکنم موفق به انجامش نمیشم ، باتشکر فرآوان

rahnema1
جمعه 17 مهر 1394, 18:34 عصر
خب شما چه کدی استفاده می کنید؟

MehdiElexal
جمعه 17 مهر 1394, 19:08 عصر
خیلی راه هارو تست کردم منتها نمیدونم کجا باید تشکیل بدم بک گراند رو
میدونم که میتونم به اینصورت عکس بک گراند رو روی لیبل انداخت
//Label label1 = new Label(); //Image image1 = Image.FromFile("c:\\u.jpg");
//label1.Size = new Size(W, H);
//label1.Image = image1;

بعد چاپ عدد روی لیبل اینکارو میکنم ولی درست نمیشه
حتما جاش اشتباهه
خارج حلقه هم اینکارو کردم اما نشد

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

rahnema1
جمعه 17 مهر 1394, 20:06 عصر
یه راهنمایی:
همون جا که خصوصیاتی مثل Text و Left و Top برای هر لیبل تعیین کردم همون جا را تغییر بدید ببینیم چی کار می کنید

MehdiElexal
جمعه 17 مهر 1394, 20:32 عصر
ممنون مهندس درست شد
int L = (int)Math.Round(j * width + separation + 2 * pen.Width); int T = (int)Math.Round(i * height + separation + 2 * pen.Width);
int W = (int)Math.Round(width - separation - 2 * pen.Width);
int H = (int)Math.Round(height - separation - 2 * pen.Width);
Image image1 = Image.FromFile("c:\\u.jpg");
labels[r - 1] = new Label
{
Text = i + "," + j,
Left = L,
Top = T,
Width = W,
Height = H,
Image=image1


};

MehdiElexal
جمعه 13 آذر 1394, 18:48 عصر
با سلام مجدد ، خواستم تایپیک بزنم گفتم همین تایپیک رو ادامه بدم بهتره
چطور میشه این پیکچر باکس رو خالی کرد بعد از کشیدن آبجکت ها ؟
p.image=null;
p.Invalidate();
هم میزنم اما عکس های کشیده شده پاک نمیشه و ثابت میمونه ، چیکارش باید کرد ؟
ممنون

rahnema1
جمعه 13 آذر 1394, 19:12 عصر
سلام

void clearWindow(Control control)
{
control.Controls.Clear();
control.BackgroundImage = null;
}