PDA

View Full Version : سوال: چسباندن یک فرم به لبه فرم دیگر



daniyaltjm
یک شنبه 03 مرداد 1395, 17:42 عصر
سلام توی برنامه ای مثل Team viewerیک پنجره کوچیک به پنجره اصلی برنامه چسبیده شده و با حرکت پنجره اصلی اون هم باهاش حرکت میکنه، حالا توی سی شارپ چطوری همچین فرمی رو باید ساخت، و مهمتر اینکه با یک دکمه بشه مخفیش کرد و با یک دکمه نمایش داد و هر دفه که نمایش داده میشه به قسمت راست پنجره اصلی بچسبه؟!

kamiloted
چهارشنبه 06 مرداد 1395, 22:07 عصر
public partial class Form1 : Form
{
Timer timer;
bool resetting = false;
Form2 frm2;
public Form1()
{
InitializeComponent();
frm2 = new Form2();
frm2.Show();
timer = new Timer();
timer.Interval = 50;
timer.Tick += new EventHandler(timer1_Tick);
}


private Form mMainForm;

private List<Form> mConnectedForms = new List<Form>();

private Point mMainLocation;

public Form1(Form mainForm)
{
this.mMainForm = mainForm;
this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);
this.mMainForm.LocationChanged += new EventHandler(Form1_LocationChanged);
}
public void ConnectForm(Form form)
{
if (!this.mConnectedForms.Contains(form))
{
this.mConnectedForms.Add(form);
}
}
private void button1_Click(object sender, EventArgs e)
{

}

private void Form1_Load(object sender, EventArgs e)
{

}

private void Form1_Activated(object sender, EventArgs e)
{
if (!resetting)
{
timer.Start();
frm2.Focus();
this.Focus();
resetting = true;
}
}

private void timer1_Tick(object sender, EventArgs e)
{
timer.Stop();
resetting = false;
}

private void Form1_DragDrop(object sender, DragEventArgs e)
{

}

private void Form1_LocationChanged(object sender, EventArgs e)
{
Point relativeChange = new Point(this.mMainForm.Location.X - this.mMainLocation.X, this.mMainForm.Location.Y - this.mMainLocation.Y);
foreach (Form form in this.mConnectedForms)
{
form.Location = new Point(form.Location.X + relativeChange.X, form.Location.Y + relativeChange.Y);
}

this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);
}

}



اینم فرم 2


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

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{

}
}
}

kamiloted
چهارشنبه 06 مرداد 1395, 22:10 عصر
برا جلوگیری از شلوغ کاری اینو تویه کلاس بنویس


using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{

class Class1
{
private Form mMainForm;

private List<Form> mConnectedForms = new List<Form>();

private Point mMainLocation;

public Class1(Form mainForm)
{
this.mMainForm = mainForm;
this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);
this.mMainForm.LocationChanged += new EventHandler(MainForm_LocationChanged);
}

public void ConnectForm(Form form)
{
if (!this.mConnectedForms.Contains(form))
{
this.mConnectedForms.Add(form);
}
}

void MainForm_LocationChanged(object sender, EventArgs e)
{
Point relativeChange = new Point(this.mMainForm.Location.X - this.mMainLocation.X, this.mMainForm.Location.Y - this.mMainLocation.Y);
foreach (Form form in this.mConnectedForms)
{
form.Location = new Point(form.Location.X + relativeChange.X, form.Location.Y + relativeChange.Y);
}

this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);
}
}
}

daniyaltjm
پنج شنبه 07 مرداد 1395, 11:12 صبح
public partial class Form1 : Form
{
Timer timer;
bool resetting = false;
Form2 frm2;
public Form1()
{
InitializeComponent();
frm2 = new Form2();
frm2.Show();
timer = new Timer();
timer.Interval = 50;
timer.Tick += new EventHandler(timer1_Tick);
}


private Form mMainForm;

private List<Form> mConnectedForms = new List<Form>();

private Point mMainLocation;

public Form1(Form mainForm)
{
this.mMainForm = mainForm;
this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);
this.mMainForm.LocationChanged += new EventHandler(Form1_LocationChanged);
}
public void ConnectForm(Form form)
{
if (!this.mConnectedForms.Contains(form))
{
this.mConnectedForms.Add(form);
}
}
private void button1_Click(object sender, EventArgs e)
{

}

private void Form1_Load(object sender, EventArgs e)
{

}

private void Form1_Activated(object sender, EventArgs e)
{
if (!resetting)
{
timer.Start();
frm2.Focus();
this.Focus();
resetting = true;
}
}

private void timer1_Tick(object sender, EventArgs e)
{
timer.Stop();
resetting = false;
}

private void Form1_DragDrop(object sender, DragEventArgs e)
{

}

private void Form1_LocationChanged(object sender, EventArgs e)
{
Point relativeChange = new Point(this.mMainForm.Location.X - this.mMainLocation.X, this.mMainForm.Location.Y - this.mMainLocation.Y);
foreach (Form form in this.mConnectedForms)
{
form.Location = new Point(form.Location.X + relativeChange.X, form.Location.Y + relativeChange.Y);
}

this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);
}

}



اینم فرم 2


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

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{

}
}
}


کار نکرد لطفا برنامشو پیوست کنید و کداشو هم یه توضیح بدین.

kamiloted
پنج شنبه 07 مرداد 1395, 21:58 عصر
کار نکرد لطفا برنامشو پیوست کنید و کداشو هم یه توضیح بدین.

چون عکس پرو فایلتو عوض کردی تا 10 دیقه دیگه با 2 خط کارتو راه می ندازم.

kamiloted
پنج شنبه 07 مرداد 1395, 22:17 عصر
اینم نمونه.لذت ببر.دکمه تشکر فراموش نشه

فرم (http://s2.picofile.com/file/8261566650/Move_2_Form_together.zip.html)

moradian
پنج شنبه 07 مرداد 1395, 22:43 عصر
سلام


Form2 frm2;
public Form1()
{
InitializeComponent();
frm2 = new Form2();
frm2.Show();
this.LocationChanged += new EventHandler(Form1_LocationChanged);
}
private void Form1_LocationChanged(object sender, EventArgs e)
{
int x = this.Width + this.Location.X;
int y = this.Location.Y;
frm2.Location = new Point(x, y);
}

daniyaltjm
پنج شنبه 07 مرداد 1395, 23:13 عصر
اینم نمونه.لذت ببر.دکمه تشکر فراموش نشه

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

و یک مورد فاحش دیگه اینکه وقتی پنجره ها Resize میشوند باید هر دو با هم Resize بشوند نه اینکه اون یکی برود زیر اون یکی و به قول معروف شیر تو شیر بشود .:لبخندساده:

daniyaltjm
پنج شنبه 07 مرداد 1395, 23:29 عصر
سلام


Form2 frm2;
public Form1()
{
InitializeComponent();
frm2 = new Form2();
frm2.Show();
this.LocationChanged += new EventHandler(Form1_LocationChanged);
}
private void Form1_LocationChanged(object sender, EventArgs e)
{
int x = this.Width + this.Location.X;
int y = this.Location.Y;
frm2.Location = new Point(x, y);
}


کد خوبی نوشتید اگه قابلیت Dock شدن و تغییر سایز هر دو با هم رو هم بهش اضافه کنید کامل میشه.

kamiloted
پنج شنبه 07 مرداد 1395, 23:50 عصر
ممنون ولی کامل لذت نبردم! چون توی تیم ویوور وقتی پنچره دوم رو ازش جدا میکردی و بعد پنجره اول رو جابجا میکردی پنجره دوم سرجای خودش می موند ولی برنامه شما وقتی که جداش میکنم و بعد پنجره اول رو جابجا میکنم پنجره دوم خودبخود میاد میچسبه!!

و یک مورد فاحش دیگه اینکه وقتی پنجره ها Resize میشوند باید هر دو با هم Resize بشوند نه اینکه اون یکی برود زیر اون یکی و به قول معروف شیر تو شیر بشود .:لبخندساده:

اگه توجه کنید توی تیم ویور فرم اصلی Resize نمیشه. فقط فرم کوچیک Resize میشه.بعد کد اول من بود.فرم، محیط اتچ داشت که از اون جدا میکردی دیگه جابه جا نمیشد.و به محض اینکه وارد محیط اتچ میشد همزمان جابه جا میشد.مثل تیم ویور.

من یه حرفه ای تر نوشتم نیازی به فرم نیست.تازه فرم برنامتون سنگین نمیشه.از 2 تا هم استفاده نمیکنید. دقیقا مثل
141727

این خیلی بهتر عمل میکنه اگه روشن باشه فرم ریسایز بشه هردو ریسایز میشن.
هردو جمع میشن.

daniyaltjm
جمعه 08 مرداد 1395, 00:08 صبح
گه توجه کنید توی تیم ویور فرم اصلی Resize نمیشه. فقط فرم کوچیک Resize میشه.بعد کد اول من بود.فرم، محیط اتچ داشت که از اون جدا میکردی دیگه جابه جا نمیشد.و به محض اینکه وارد محیط اتچ میشد همزمان جابه جا میشد.مثل تیم ویور.

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


من یه حرفه ای تر نوشتم نیازی به فرم نیست.تازه فرم برنامتون سنگین نمیشه.از 2 تا هم استفاده نمیکنید. دقیقا مثل

اونم بزارید ببینیم!

kamiloted
جمعه 08 مرداد 1395, 00:25 صبح
خوب الان تیم ویور به کنار در کل نمیشه کاری کرد؟ بعدش هم توی برنامتون من وقتی فرم کوچیک رو جدا میکنم و بعد فرم یک رو تکون میدم خودکار میچسبند به هم!!! من می خوام حالت Dock داشته باشه که وقتی سمت چپ فرم کوچیک به سمت راست فرم بزرگ مثلا یک سانت نزدیک شد بچسبند به هم؟! مال شما اصلا اینطور نبود.



اونم بزارید ببینیم!



Point relativeChange = new Point(this.mMainForm.Location.X - this.mMainLocation.X, this.mMainForm.Location.Y - this.mMainLocation.Y); foreach (Form form in this.mConnectedForms)
{
form.Location = new Point(form.Location.X + relativeChange.X, form.Location.Y + relativeChange.Y);
}

this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);




برای : وقتی سمت چپ فرم کوچیک به سمت راست فرم بزرگ مثلا یک سانت نزدیک شد بچسبند

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

daniyaltjm
جمعه 08 مرداد 1395, 01:03 صبح
Point relativeChange = new Point(this.mMainForm.Location.X - this.mMainLocation.X, this.mMainForm.Location.Y - this.mMainLocation.Y); foreach (Form form in this.mConnectedForms)
{
form.Location = new Point(form.Location.X + relativeChange.X, form.Location.Y + relativeChange.Y);
}

this.mMainLocation = new Point(this.mMainForm.Location.X, this.mMainForm.Location.Y);




برای : وقتی سمت چپ فرم کوچیک به سمت راست فرم بزرگ مثلا یک سانت نزدیک شد بچسبند

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

بسیار خوب این کد رو توی رویداد Move فرم کوچیک بذارم؟

moradian
شنبه 09 مرداد 1395, 14:01 عصر
کد خوبی نوشتید اگه قابلیت Dock شدن و تغییر سایز هر دو با هم رو هم بهش اضافه کنید کامل میشه.


Form2 frm2;
public Form1()
{
InitializeComponent();
frm2 = new Form2();
frm2.Show();
this.LocationChanged += new EventHandler(Form1_LocationChanged);
this.Resize += new EventHandler(Form1_Resize);
}
private void Form1_LocationChanged(object sender, EventArgs e)
{
int x = this.Width + this.Location.X;
int y = this.Location.Y;
frm2.Location = new Point(x, y);
frm2.Height = this.Height;
}
private void Form1_Resize(object sender, EventArgs e)
{
Form1_LocationChanged(sender, e);
}


یه کمی هم از خودت مایه بگذار، عزیز دل برادر :لبخندساده: