PDA

View Full Version : سوال: ایجاد سایه برای فرمی با مقدار None در خصوصیت FormBorderStyle



rasol_afkham
چهارشنبه 25 تیر 1393, 00:43 صبح
با سلام خدمت دوستان عزیز:
چطور می توان برای فرمی که خصوصیت FormBorderStyle اون با مقدار None مقدار دهی شده سایه ایجاد نمود. همانند سایه ای که فرمهای معمولی ویندوز دارن؟ :متفکر:

abbas.oveissi
چهارشنبه 25 تیر 1393, 04:30 صبح
این کد رو بذارید توی کدهای داخل فرمتون :
private const int CS_DROPSHADOW = 0x00020000; protected override CreateParams CreateParams
{
get
{
// add the drop shadow flag for automatically drawing
// a drop shadow around the form
CreateParams cp = base.CreateParams;
cp.ClassStyle |= CS_DROPSHADOW;
return cp;
}
}با این کد فرمتون از شکل زیر :
121154
به این شکل تبدیل میشه :
121155

rasol_afkham
چهارشنبه 25 تیر 1393, 16:09 عصر
این کدها رو قبلا پیدا کرده بودم. میشه یه کمی درباره شون توضیح بدی :متفکر:

abbas.oveissi
چهارشنبه 25 تیر 1393, 18:36 عصر
این کدها رو قبلا پیدا کرده بودم. میشه یه کمی درباره شون توضیح بدی :متفکر:
توی CreateParams اطلاعات ساخت کنترل هست.بعد اینجا با این کد اونو override کردن. با استفاده از bitwise اومدم flag سایه انداختن رو 1 کرده تا کنترل سایه دار بشه.

rasol_afkham
چهارشنبه 25 تیر 1393, 22:20 عصر
آیا می شه سایه رو ویرایش کرد. اندازش رو بزرگ یا کوچیک کرد و یا رنگش رو تغییر داد. و یا می شه سایه ای مانند فرمهای ویندوز ایجاد نمود. فرمهای ویندوز 7 دور تا دورشون سایه دارن؟ :متفکر:

abbas.oveissi
چهارشنبه 25 تیر 1393, 22:31 عصر
آیا می شه سایه رو ویرایش کرد. اندازش رو بزرگ یا کوچیک کرد و یا رنگش رو تغییر داد. و یا می شه سایه ای مانند فرمهای ویندوز ایجاد نمود. فرمهای ویندوز 7 دور تا دورشون سایه دارن؟ :متفکر:

من گشتم دیدم بقیه هم میخواستند شبیه ویندوز 7 سایه بندازن اما کسی جوابشون رو نداده بود.اما یکی یه روش جدید دیگه نوشته بود،یعنی اومده 2 تا فرم درست کرده،یکیش به عنوان سایه زیر دیگری باز میشه.دور تا دور هم سایه دار میشه.اینم کد اون نفر :
public partial class Form2 : Form {
DropShadow ds = new DropShadow();
public Form2()
{
InitializeComponent();
this.Shown += new EventHandler(Form1_Shown);
this.Resize += new EventHandler(Form1_Resize);
this.LocationChanged += new EventHandler(Form1_Resize);
}


void Form1_Shown(object sender, EventArgs e)
{
Rectangle rc = this.Bounds;
rc.Inflate(10, 10);
ds.Bounds = rc;
ds.Show();
this.BringToFront();
}
void Form1_Resize(object sender, EventArgs e)
{
ds.Visible = (this.WindowState == FormWindowState.Normal);
if (ds.Visible)
{
Rectangle rc = this.Bounds;
rc.Inflate(10, 10);
ds.Bounds = rc;
}
this.BringToFront();
}


}
public class DropShadow : Form
{
public DropShadow()
{
this.Opacity = 0.5;
this.BackColor = Color.Gray;
this.ShowInTaskbar = false;
this.FormBorderStyle = FormBorderStyle.None;
this.StartPosition = FormStartPosition.Manual;
}
private const int WS_EX_TRANSPARENT = 0x20;
private const int WS_EX_NOACTIVATE = 0x8000000;
protected override System.Windows.Forms.CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE;
return cp;
}
}
}

abbas.oveissi
چهارشنبه 25 تیر 1393, 22:38 عصر
ببخشید مثل اینکه باگ داره،سری اول موقع تست کردن نفهمیدم.هر کار هم میکنم درست نمیشه:متفکر:

آپدیت : اگر توی رخداد Activated این کد هارو بذارید اون باگ حل میشه :
ds.Visible = (this.WindowState == FormWindowState.Normal);
if (ds.Visible)
{
Rectangle rc = this.Bounds;
rc.Inflate(10, 10);
ds.Bounds = rc;
ds.BringToFront();
}


this.BringToFront();