PDA

View Full Version : Resource & آرایه ای از PictureBox



HosseinProgrammer
دوشنبه 12 شهریور 1386, 12:16 عصر
سلام.

1- من یک سری عکس دارم توی Resource که مثلا اسم های اونها از 1.gif تا 20.gif هستش.
حالا میخوام تمام اونها رو توی یک حلقه به ترتیب توی یه PictureBox نشون بدم. ولی چون آدرسشون رو به صورت رشته ای ندارم نمیتونم این کارو بکنم. چه راه حلی رو پیشنهاد میکنید؟

2- من حدود 40 عکس دارم که بصورت یک آرایه ذخیرشون کردم. یعنی هر خونه ی آرایه یک PictureBox هست که عکس توی اون قرار میگیره. حالا میخوام رویداد کلیک هم برای این هر PictureBox تعریف کنم. تعریف رویداد برای تک تک اعضای آرایه اصلا منطقی نیست! من اینطور تعریف کردم:



PB_Calender = newPictureBox[37];
// Show PictureBoxes
for (int i = 0, x = 263, y = 71; i < PB_Calender.Length; i++)
{
PB_Calender[i] = newPictureBox();
PB_Calender[i].Location = new System.Drawing.Point(x, y);
PB_Calender[i].Size = new System.Drawing.Size(34, 34);
PB_Calender[i].SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
PB_Calender[i].TabIndex = i;
PB_Calender[i].TabStop = false;

PB_Calender[i].MouseMove += newMouseEventHandler(Calender_MouseMove);

Calender_Panel.Controls.Add(PB_Calender[i]);
if ((i + 1) % 7 == 0)
{
y += 40;
x = 263;
}
else
{
x -= 40;
}
}


حالا اگه کاربر روی یکی از این PictureBox ها کلیک کنه، از کجا باید بفهمم که روی کدوم یک از اونها بوده؟

3- موقعیت موس (X,Y) رو نسبت به گوشه بالای چپ فرم جاری چطور میشه به دست آورد؟ نسبت به یک Panel چطور؟

ممنون.

MH2538
دوشنبه 12 شهریور 1386, 13:29 عصر
سلام
میتونی برای PictureBox هات تگ بگذاری بعد از آرگومان Sender‌که در رویداد کلیک وجود دارد با دستور ((PictureBox)sender).Tag تگ رو بدیت بیاری و بفهمی کدوم کلیک شده.
اگر خواستی من یک نمونه برنامه براتون بفرستم

HosseinProgrammer
دوشنبه 12 شهریور 1386, 14:08 عصر
ممنون میشم اگه یه نمونه برنامه بهم بدید.

MH2538
دوشنبه 12 شهریور 1386, 14:21 عصر
public partial class Form1 : Form
{
PictureBox[] PBArray = new PictureBox[4];
public Form1()
{
InitializeComponent();
for (int i = 0; i < 4; i++)
{
PBArray[i] = new PictureBox();
PBArray[i].Left = i * 50 + 5;
PBArray[i].Width = 45;
PBArray[i].Top = 5;
this.Controls.Add(PBArray[i]);
PBArray[i].Tag = i;
PBArray[i].BackColor = Color.Black;
PBArray[i].Click += new EventHandler(PBArray_Click);
}
}

void PBArray_Click(object sender, EventArgs e)
{
switch (Convert.ToInt16(((PictureBox)sender).Tag))
{
case 0 : MessageBox.Show("You clicked on First PicturBox"); break;
case 1: MessageBox.Show("You clicked on Second PicturBox"); break;
case 2: MessageBox.Show("You clicked on Thirth PicturBox"); break;
case 3: MessageBox.Show("You clicked on Fourth PicturBox"); break;
}
}

private void Form1_Load(object sender, EventArgs e)
{

}
}

HosseinProgrammer
دوشنبه 12 شهریور 1386, 14:33 عصر
ممنون از جوابتون.

دوستان اگر کسی پاسخ سوال اول و سوم رو میدونه ، ممنون میشم جواب بده.

سوال 1 : من یک سری عکس دارم توی Resource که مثلا اسم های اونها از 1.gif تا 20.gif هستش.
حالا میخوام تمام اونها رو توی یک حلقه به ترتیب توی یه PictureBox نشون بدم. ولی چون آدرسشون رو به صورت رشته ای ندارم نمیتونم این کارو بکنم. چه راه حلی رو پیشنهاد میکنید؟


سوال 3 : موقعیت موس (X,Y) رو نسبت به گوشه بالای چپ فرم جاری چطور میشه به دست آورد؟ نسبت به یک Panel چطور؟

سار
دوشنبه 12 شهریور 1386, 14:51 عصر
privatevoid Form1_MouseDown(object sender, MouseEventArgs e)
{
int x = e.X;
int y = e.Y;
}

در مورد اولی ه باید با استفاده از


System.Resources.ResourceReader r = new System.Resources.ResourceReader();
r.GetResourceData(Name,outtypeof,outDateBoldEventA rgs);

جواب بگیری، من تست نکردم اگر نشد خبر بده.

HosseinProgrammer
دوشنبه 12 شهریور 1386, 15:07 عصر
privatevoid Form1_MouseDown(object sender, MouseEventArgs e)
{
int x = e.X;
int y = e.Y;
}


این نسبت به گوشه ی سمت چپ کنترلی که توش هستیم بر میگردونه. بهتر بود بیشتر توضیح میدادم. فرض که یک PictureBox توی یک پنل دارم. وقتی روی PictureBox باشم، مختصات نسبت به PictureBox هستش و نه Panel. اگه من بخوام نسبت به Panel باشه چی؟


در مورد کد دومی (سوال یک) هم تست کردم نتیجه نگرفتم! به فرض اینکه برنامه بدون خطا کار کرد (البته با تغییراتی)، چطور باید توی یک PictureBox نمایش داده بشه ؟!

MH2538
دوشنبه 12 شهریور 1386, 16:14 عصر
privatevoid Form1_MouseDown(object sender, MouseEventArgs e)
{
int x = e.X + ((PictureBox)sender).Parent.Left;
int y = e.Y + ((PictureBox)sender).Parent.Top;
}

Amir Oveisi
سه شنبه 13 شهریور 1386, 01:36 صبح
واسه استفاده از resource ها:

YourNameSpace.Properties.Resources.YourResourceFil eName

که YourNameSpace همون namespace ای هست که کلاس Form اونحا قرار داره.

HosseinProgrammer
چهارشنبه 14 شهریور 1386, 11:35 صبح
ممنون. ولی این جواب سوال من نبود. سوال من اینه:


1- من یک سری عکس دارم توی Resource که مثلا اسم های اونها از 1.gif تا 20.gif هستش.
حالا میخوام تمام اونها رو توی یک حلقه به ترتیب توی یه PictureBox نشون بدم. ولی چون آدرسشون رو به صورت رشته ای ندارم نمیتونم این کارو بکنم. چه راه حلی رو پیشنهاد میکنید؟


اگه این عکسها توی Resource نبود، جواب به این شکل بود:


Bitmap Pic;
for(int i=1 ; i<=3 ; i++){
Pic = new Bitmap("Calender_" + i.ToString() + ".gif");

pictureBox1.Image = (Image) Pic;
pictureBox1.Refresh();
System.Threading.Thread.Sleep(1000);
}


ولی حالا میخوام کدی شبیه این داشته باشم وقتی که عکسها توی Resource باشه. یعنی آدرس فایل ها به صورت رشته ای...

؟؟؟

MH2538
چهارشنبه 14 شهریور 1386, 13:15 عصر
سلام


for (int i =0;i<40;i++);
pb.Image = Properties.Resources.ResourceManager.GetObject("Calendar_" + i.ToString());