PDA

View Full Version : باز کردن یک فرم در فرم دیگر (MdiParent)



sajjadzare
دوشنبه 12 تیر 1391, 23:50 عصر
برای باز کردن یک فرم در فرم دیگر mdiParent فرم اصلی را برابر true قرار می دهم و بعد Mdi ان را برابر فرم اصلی قرار می دهم.

1.نمی توان به فرم مکان داد یعنی اینکه به فرم بگوییم در مکان 100 و 100 فرم اصلی نمایش داده شود آیا راهی برای این کار وجود دارد؟

2.رنگ فرم اصلی به صورت خاکستری تیره می شود که نمی توان آنرا تغییر داد راهی وجود دارد؟

3.آبا می توان یک فرم را به عنوان کنترل به کنترلی مثل panel اضافه کرد؟

the king
سه شنبه 13 تیر 1391, 01:13 صبح
برای باز کردن یک فرم در فرم دیگر mdiParent فرم اصلی را برابر true قرار می دهم و بعد Mdi ان را برابر فرم اصلی قرار می دهم.

1.نمی توان به فرم مکان داد یعنی اینکه به فرم بگوییم در مکان 100 و 100 فرم اصلی نمایش داده شود آیا راهی برای این کار وجود دارد؟


private void Form1_Load(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.MdiParent = this;
f2.StartPosition = FormStartPosition.Manual;
f2.Location = new Point(100, 100);
f2.Show();
}





2.رنگ فرم اصلی به صورت خاکستری تیره می شود که نمی توان آنرا تغییر داد راهی وجود دارد؟

اصولا همان کنترل اندیس 0 ئه، اما به هر حال کلی بنویسیم بهتره :

foreach (Control ctl in this.Controls)
{
if (ctl.GetType() == typeof(MdiClient))
{
ctl.BackColor = Color.Red;
break;
}
}





3.آبا می توان یک فرم را به عنوان کنترل به کنترلی مثل panel اضافه کرد؟

بجای اینکه فرم بسازید، یک UserControl بسازید، فکر کنید که فرمه، کنترل ها رو داخلش قرار دهید و
هر کدی که لازمه برای کنترل هایش بنویسید. وقتی ساختن اش تموم شد یکبار پروژه را کامپایل کنید.
حالا می توانید نمونه ای از UserControl رو هم داخل فرم قرار بدهید تا پنجره قابل جابجا کردن داشته باشه
و هم داخل یک Panel یا GroupBox و ... قرار اش دهید.

sajjadzare
سه شنبه 13 تیر 1391, 06:00 صبح
الان borderStyle فرم اصلی بصورت Fixed3D است آیا برای این موضوع هم راه حلی وجود داره؟

the king
سه شنبه 13 تیر 1391, 22:34 عصر
الان borderStyle فرم اصلی بصورت Fixed3D است آیا برای این موضوع هم راه حلی وجود داره؟
صد البته، اول باید نوع کادر دور MdiClient رو مشخص کنیم، در مشخصه های کلاس اش چنین چیزی نداره، پس از SetWindowLong
استفاده می کنیم که یک تابع API ویندوز ئه. در داخل کلاس فرم تان این کد ها رو اضافه کنید تا به این تابع دسترسی داشته باشیم :

private const int GWL_EXSTYLE = -20;

[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowLongA")]
private static extern int SetWindowLong(int hWnd, int nIndex, int dwNewLong);


حالا اون حلقه ای که نوشته بودیم رو تغییر دهید :

private void Form1_Load(object sender, EventArgs e)
{
foreach (Control ctl in this.Controls)
{
if (ctl.GetType() == typeof(MdiClient))
{
MdiClient mdi = (MdiClient)ctl;
SetWindowLong(mdi.Handle.ToInt32(), GWL_EXSTYLE, 0);
mdi.Size = new Size(1, 1);
mdi.BackColor = Color.Red;
break;
}
}
}