PDA

View Full Version : حرفه ای: ارسال پارامتر به یک رویدادی که در زمان اجرا ساخته میشه



رامین مرادی
سه شنبه 22 اسفند 1396, 12:33 عصر
سلام وقت بخیر. من در حین اجرا یه کنترل پیکجر باکس میسازم و براش یه منو هم میسازم. حالا چطوری میتونم تصویر اون پیکجر باکس رو به رویداد کلیک اون منو ارسال کنم؟

کد های کامل شده که به خوبی هم کار میکنه فقط مونده پاس دادن تصویر اون پیکجر باکس به رویداد کلیک منو



ContextMenu cm = new System.Windows.Forms.ContextMenu();
MenuItem mi = new MenuItem("Print");
public void set()
{
TabPage addedTabPage = new TabPage("صفحه اول");
tabControl_webBrowsers.TabPages.Add(addedTabPage);
addedTabPage.AutoScroll = true;
PictureBox _P = new PictureBox();
_P.Height = 842;
_P.Width = 595;
_P.SizeMode = PictureBoxSizeMode.StretchImage;
_P.Image =Image.FromFile(path);
_P.MouseDown += _P_MouseDown;
cm.MenuItems.Add(mi);
mi.Click +=new EventHandler(mi_Click);
addedTabPage.Controls.Add(_P);
}
void _P_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button==System.Windows.Forms.MouseButtons.Rig ht)
{
cm.Show((Control)sender,e.Location);
}
}
private void mi_Click(object sender, EventArgs e)
{
//تصویر اون پیکجر باکس رو چجوری اینجا دریافت کنم؟
}

Mahmoud.Afrad
سه شنبه 22 اسفند 1396, 12:56 عصر
نیازی به MouseDown نیست. contextmenustrip پیکچرباکس را برابر با منویی که ایجاد کردید بگذارید. در رویداد کلیک منو، SourceControl کنترل فراخواننده منواستریپ خواهد بود.
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip.sourcecontro l.aspx

رامین مرادی
سه شنبه 22 اسفند 1396, 13:32 عصر
نیازی به MouseDown نیست. contextmenustrip پیکچرباکس را برابر با منویی که ایجاد کردید بگذارید. در رویداد کلیک منو، SourceControl کنترل فراخواننده منواستریپ خواهد بود.
https://msdn.microsoft.com/en-us/library/system.windows.forms.contextmenustrip.sourcecontro l.aspx

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

Mahmoud.Afrad
سه شنبه 22 اسفند 1396, 15:04 عصر
خب صحیح برای زیر منو ها چجوری رویدادشو ست کنم؟

فرقی نمیکند.

رامین مرادی
سه شنبه 22 اسفند 1396, 15:20 عصر
فرقی نمیکند.
شرمنده متوجه نشدم. حتی برا زیر منو ها رویداد کلیک ایجاد کردم اما نتونستم مقداری ازشون بخونم.در صورت امکان تکه کد قرار بدین

Mahmoud.Afrad
سه شنبه 22 اسفند 1396, 22:04 عصر
ContextMenu cm = new System.Windows.Forms.ContextMenu();
MenuItem mi = new MenuItem("Print");
public void set()
{
TabPage addedTabPage = new TabPage("صفحه اول");
tabControl_webBrowsers.TabPages.Add(addedTabPage);
addedTabPage.AutoScroll = true;
PictureBox _P = new PictureBox
{
Height = 842,
Width = 595,
SizeMode = PictureBoxSizeMode.StretchImage,
ContextMenu = cm,
Image = Image.FromFile(@"...")
};

cm.MenuItems.Add(mi);
mi.Click += new EventHandler(mi_Click);
addedTabPage.Controls.Add(_P);
}

private void mi_Click(object sender, EventArgs e)
{
PictureBox pb = cm.SourceControl as PictureBox;
//...
}

رامین مرادی
چهارشنبه 23 اسفند 1396, 10:18 صبح
دستتون درد نکنه. فقط یه مسئله وقتی تب ها چندتا باشه رویداد که اتفاق می افته به تعداد تب ها تکرار میشه.

کد های کاملمه. که میخوام از اون تصویر پرینت بگیرم. با پرینت مشکلی نداره اما اگه تب دوتا یا بیشتر از یکی باشه دیالوگ پرینت به تعداد صفحات باز میشه



public void Set(){
TabPage addedTabPage1 = new TabPage("صفحه دوم");
tabControl_webBrowsers.TabPages.Add(addedTabPage1) ;
addedTabPage1.AutoScroll = true;
PictureBox _P1 = new PictureBox();
_P1.Height = 842;
_P1.Width = 595;
_P1.SizeMode = PictureBoxSizeMode.StretchImage;
_P1.Image = Image.FromFile(path);
_P1.MouseDown += _P_MouseDown;
cm.MenuItems.AddRange(new MenuItem[]{ mi1,mi2});
mi1.Click += new EventHandler(mi1_Click);
addedTabPage1.Controls.Add(_P1);


TabPage addedTabPage2 = new TabPage("صفحه دوم");
tabControl_webBrowsers.TabPages.Add(addedTabPage2) ;
addedTabPage2.AutoScroll = true;
PictureBox _P2 = new PictureBox();
_P2.Height = 842;
_P2.Width = 595;
_P2.SizeMode = PictureBoxSizeMode.StretchImage;
_P2.Image = Image.FromFile(path);
_P2.MouseDown += _P_MouseDown;
cm.MenuItems.AddRange(new MenuItem[]{ mi1,mi2});
mi1.Click += new EventHandler(mi1_Click);
addedTabPage2.Controls.Add(_P2);
}


void _P_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
cm.Show((Control)sender, e.Location);
}
}
void mi1_Click(object sender, EventArgs e)
{

PictureBox p = cm.SourceControl as PictureBox;
MessageBox.Show(p.Name);
pictureBox1.Image = p.Image;


System.Drawing.Printing.PrintDocument myPrintDocument1 = new System.Drawing.Printing.PrintDocument();
PrintDialog myPrinDialog1 = new PrintDialog();
PaperSize ps = new PaperSize("A4", 827, 1170);
myPrintDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(prin tDocument1_PrintPage);
myPrintDocument1.DefaultPageSettings.PaperSize = ps;
myPrinDialog1.Document = myPrintDocument1;
if (myPrinDialog1.ShowDialog() == DialogResult.OK)
{
myPrintDocument1.Print();
}
}
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
Image i = pictureBox1.Image;


float newWidth = i.Width * 100 / i.HorizontalResolution;
float newHeight = i.Height * 100 / i.VerticalResolution;


float widthFactor = newWidth / e.PageBounds.Width;
float heightFactor = newHeight / e.PageBounds.Height;


if (widthFactor > 1 | heightFactor > 1)
{
if (widthFactor > heightFactor)
{
newWidth = newWidth / widthFactor;
newHeight = newHeight / widthFactor;
}
else
{
newWidth = newWidth / heightFactor;
newHeight = newHeight / heightFactor;
}
}
e.Graphics.DrawImage(i, 0, 0, (int)newWidth, (int)newHeight);
}

Mahmoud.Afrad
چهارشنبه 23 اسفند 1396, 10:47 صبح
متد Click را دو بار به رویداد نسبت دادید خط 11و12 در 25و26 تکرار شده که نیاز به تکرار نیست.

رامین مرادی
چهارشنبه 23 اسفند 1396, 10:53 صبح
متد Click را دو بار به رویداد نسبت دادید خط 11و12 در 25و26 تکرار شده که نیاز به تکرار نیست.
ممنون اصلا توجهی نکرده بودم به اون خخخخ:لبخند: