www.pudn.com > Pwd_Control_src.zip > Popup.cs, change:2007-08-01,size:23534b
using System;
using System.ComponentModel;//ekli geliyor
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace SifreKontrol
{
public partial class Popup : Component
{
#region Private Member
Control mUserControl;//sadece tanımlı,boyutlandırması yapılmadı
Control mParent;//property
ePlacement mPlacement = ePlacement.BottomRight;//varsayılan değeri
Color mBorderColor = Color.DarkGray;
int mAnimationSpeed = 150;//popup formun açılma efekti süresi
bool mShowShadow = false;//varsayılan olarak gölge efekti gösterilcek
PopupForm mForm;
byte opacity_deger = 100;//%100 deger yani opak
AnimationType animasyon_Tip = AnimationType.PopupMenu;
#endregion
#region Delegate
public delegate void bir(object sender, EventArgs e);
public delegate void iki(object sender, EventArgs e);
#endregion
#region Constructors
public Popup(Control UserControl, Control parent)//Constructor
{
mParent = parent;//private değişkene eşitlenecek
mUserControl = UserControl;
InitializeComponent();//control yaratılacak designer.cs
}
public Popup(IContainer container)
{
container.Add(this);
InitializeComponent();
}
#endregion
public void Show()
{
PopupForm.mShowShadow = this.mShowShadow;
if (mForm != null)
mForm.DoClose();
mForm = new PopupForm(this);
OnDropDown(mParent, new EventArgs());
}
public interface IPopupUserControl//interface oluşturuldu
{
bool AcceptPopupClosing();
}
public enum ePlacement
{
Left = 1,
Right = 2,
Top = 4,
Bottom = 8,
TopLeft = Top | Left,
TopRight = Top | Right,
BottomLeft = Bottom | Left,
BottomRight = Bottom | Right
};
public enum AnimationType
{
Fading = 0,
PopupMenu = 1
};
private class PopupForm : Form//form class'ından miras almakta (Form inheritance)
{
const int BORDER_MARGIN = 1;
const int CS_DROPSHADOW = 0x20000;//gölge sabiti
Timer mTimer;
bool mClosing;
public static bool mShowShadow;//shadow değişkeni
Size mControlSize;
Size mWindowSize;
Point mNormalPos;
Rectangle mCurrentBounds;
Popup mPopup;//component değişkeni
ePlacement mPlacement;
AnimationType animasyon_Tip;
DateTime mTimerStarted;
double mProgress;
public PopupForm(Popup popup)//içteki class'ın constructoru,Form constructoru
{
mPopup = popup;
SetStyle(ControlStyles.ResizeRedraw, true);
FormBorderStyle = FormBorderStyle.None;
StartPosition = FormStartPosition.Manual;
this.ShowInTaskbar = false;//task barda gözükmesin
this.DockPadding.All = BORDER_MARGIN;//sağdan soldan 1 boşluk
mControlSize = mPopup.mUserControl.Size;
mPopup.mUserControl.Dock = DockStyle.Fill;
Controls.Add(mPopup.mUserControl);//usercontrol ekleniyor
mWindowSize.Width = mControlSize.Width + 2 * BORDER_MARGIN;
mWindowSize.Height = mControlSize.Height + 2 * BORDER_MARGIN;
Form parentForm = mPopup.mParent.FindForm();
if (parentForm != null)
{
parentForm.AddOwnedForm(this);
}
mPlacement = mPopup.mPlacement;
ReLocate();
//eğer form ekranın dışına taşacak olursa
Rectangle workingArea = Screen.FromControl(mPopup.mParent).WorkingArea;
if (mNormalPos.X + this.Width > workingArea.Right)//ekranın sağına çalış
{
switch (mPlacement)//sola doğru oynama yap
{
case ePlacement.BottomRight:
mPlacement = ePlacement.BottomLeft;
break;
case ePlacement.TopRight:
mPlacement = ePlacement.TopLeft;
break;
case ePlacement.Bottom:
mPlacement = ePlacement.BottomLeft;
break;
case ePlacement.Top:
mPlacement = ePlacement.TopLeft;
break;
case ePlacement.Right:
mPlacement = ePlacement.Left;
break;
}
}
else if (mNormalPos.X < workingArea.Left)//ekranın soluna çalış
{
switch (mPlacement)//sağa doğru oynama yap
{
case ePlacement.BottomLeft:
mPlacement = ePlacement.BottomRight;
break;
case ePlacement.TopLeft:
mPlacement = ePlacement.TopRight;
break;
case ePlacement.Bottom:
mPlacement = ePlacement.BottomRight;
break;
case ePlacement.Top:
mPlacement = ePlacement.TopRight;
break;
case ePlacement.Left:
mPlacement = ePlacement.Right;
break;
}
}
if (mNormalPos.Y + this.Height > workingArea.Bottom)//ekranın alt kısmı
{
switch (mPlacement)//üste doğru oynama yap
{
case ePlacement.BottomLeft:
mPlacement = ePlacement.TopLeft;
break;
case ePlacement.BottomRight:
mPlacement = ePlacement.TopRight;
break;
case ePlacement.Bottom:
mPlacement = ePlacement.Top;
break;
case ePlacement.Left:
mPlacement = ePlacement.TopLeft;
break;
case ePlacement.Right:
mPlacement = ePlacement.TopRight;
break;
}
}
else if (mNormalPos.Y < workingArea.Top)//ekranın üst kısmı
{
switch (mPlacement)//alta doğru oynama yap
{
case ePlacement.TopLeft:
mPlacement = ePlacement.BottomLeft;
break;
case ePlacement.TopRight:
mPlacement = ePlacement.BottomRight;
break;
case ePlacement.Top:
mPlacement = ePlacement.Bottom;
break;
case ePlacement.Left:
mPlacement = ePlacement.BottomLeft;
break;
case ePlacement.Right:
mPlacement = ePlacement.BottomRight;
break;
}
}
if (mPlacement != mPopup.mPlacement)
ReLocate();
//eğer form hala ekranın dışındaysa
if (mNormalPos.X + mWindowSize.Width > workingArea.Right)
mNormalPos.X = workingArea.Right - mWindowSize.Width;
else if (mNormalPos.X < workingArea.Left)
mNormalPos.X = workingArea.Left;
if (mNormalPos.Y + mWindowSize.Height > workingArea.Bottom)
mNormalPos.Y = workingArea.Bottom - mWindowSize.Height;
else if (mNormalPos.Y < workingArea.Top)
mNormalPos.Y = workingArea.Top;
//animasyonun yaratılması
animasyon_Tip = mPopup.Animasyon_Tip;
if (animasyon_Tip != AnimationType.Fading)
{
mProgress = 0;
this.Opacity = (double)mPopup.OpacityValue / 100;
}
else
{
this.Opacity = 0;
}
if (mPopup.mAnimationSpeed > 0)
{
mTimer = new Timer();
mTimer.Interval = 1000 / 50;
mTimerStarted = DateTime.Now;
mTimer.Tick += new EventHandler(Showing);
mTimer.Start();//zamanlamayı başlat
Showing(null, null);
}
else
{
SetFinalLocation();
}
Show();//formu göster
mPopup.OnDropDown(mPopup.mParent, new EventArgs());
}
private void ReLocate()
{
int rH, rW;
rH = mWindowSize.Height;
rW = mWindowSize.Width;
mNormalPos = mPopup.mParent.PointToScreen(new Point());
switch (mPlacement)
{
case ePlacement.Top:
mNormalPos.Y -= rH;
break;
case ePlacement.TopLeft:
mNormalPos.Y -= rH;
break;
case ePlacement.TopRight:
mNormalPos.Y -= rH;
break;
case ePlacement.Bottom:
mNormalPos.Y += mPopup.mParent.Height;
break;
case ePlacement.BottomLeft:
mNormalPos.Y += mPopup.mParent.Height;
break;
case ePlacement.BottomRight:
mNormalPos.Y += mPopup.mParent.Height;
break;
case ePlacement.Left:
mNormalPos.Y += (mPopup.mParent.Height - rH) / 2;
break;
case ePlacement.Right:
mNormalPos.Y += (mPopup.mParent.Height - rH) / 2;
break;
}
switch (mPlacement)
{
case ePlacement.Left:
mNormalPos.X -= rW;
break;
case ePlacement.Right:
mNormalPos.X += mPopup.mParent.Width;
break;
case ePlacement.TopLeft:
mNormalPos.X += mPopup.mParent.Width - rW;
break;
case ePlacement.BottomLeft:
mNormalPos.X += mPopup.mParent.Width - rW;
break;
case ePlacement.Top:
mNormalPos.X += (mPopup.mParent.Width - rW) / 2;
break;
case ePlacement.Bottom:
mNormalPos.X += (mPopup.mParent.Width - rW) / 2;
break;
}
}
private void Showing(object sender, EventArgs e)
{
mProgress = ((TimeSpan)(DateTime.Now.Subtract(mTimerStarted))).TotalMilliseconds / mPopup.mAnimationSpeed;
if (mProgress >= 1)
{
mTimer.Stop();
mTimer.Tick -= new EventHandler(Showing);
AnimateForm(1);
}
else
AnimateForm(mProgress);//görünüme devam et
}
protected override void OnDeactivate(EventArgs e)
{
base.OnDeactivate(e);
if (mClosing == false)
{
if (this.mPopup.mUserControl is IPopupUserControl)
{
mClosing = ((IPopupUserControl)(this.mPopup.mUserControl)).AcceptPopupClosing();
}
else
{
mClosing = true;
}
if (mClosing) DoClose();
}
}
internal void DoClose()
{
try
{
mPopup.OnDropDownClosed(mPopup.mParent, new EventArgs());
}
finally
{
mPopup.mUserControl.Parent = null;
mPopup.mUserControl.Size = mControlSize;
mPopup.mForm = null;
Form parentForm = mPopup.mParent.FindForm();
if (parentForm != null)
parentForm.RemoveOwnedForm(this);
parentForm.Focus();
Close();
}
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
this.Bounds = mCurrentBounds;
}
protected override CreateParams CreateParams
{
get
{
CreateParams parameters = base.CreateParams;
bool son;
if (mShowShadow == false)
son = false;
else
{
if (DropShadowSupported() == false)
son = false;
else
{
son = true;
}
}
if (son)
{
parameters.ClassStyle += CS_DROPSHADOW;
}
return parameters;
}
}
public static bool DropShadowSupported()
{
OperatingSystem os = Environment.OSVersion;
return (os.Platform == PlatformID.Win32NT) && os.Version.CompareTo(new Version(5, 1, 0, 0)) >= 0;
}
private void SetFinalLocation()
{
mProgress = 1;
AnimateForm(1);
Invalidate();
}
private void AnimateForm(double progress)//açılır animasyon methodu
{
//x ve y poziyon daha sonra formun width ve hight değerleri
double[] dizi ={ 0, 0, 0, 0 };//x,y,w,h
if (progress <= 0.1) progress = 0.1;
if (animasyon_Tip == AnimationType.PopupMenu)
{
switch (mPlacement)//y pozisyon ve hight değerleri
{
case ePlacement.Top:
dizi[1] = 1 - progress;
dizi[3] = progress;
break;
case ePlacement.TopLeft:
dizi[1] = 1 - progress;
dizi[3] = progress;
break;
case ePlacement.TopRight:
dizi[1] = 1 - progress;
dizi[3] = progress;
break;
case ePlacement.Bottom:
dizi[1] = 0;
dizi[3] = progress;
break;
case ePlacement.BottomLeft:
dizi[1] = 0;
dizi[3] = progress;
break;
case ePlacement.BottomRight:
dizi[1] = 0;
dizi[3] = progress;
break;
case ePlacement.Left:
dizi[1] = 0;
dizi[3] = 1;
break;
case ePlacement.Right:
dizi[1] = 0;
dizi[3] = 1;
break;
}
switch (mPlacement)//x poziyon ve width değerleri
{
case ePlacement.TopLeft:
dizi[0] = 1 - progress;
dizi[2] = progress;
break;
case ePlacement.BottomLeft:
dizi[0] = 1 - progress;
dizi[2] = progress;
break;
case ePlacement.Left:
dizi[0] = 1 - progress;
dizi[2] = progress;
break;
case ePlacement.TopRight:
dizi[0] = 0;
dizi[2] = progress;
break;
case ePlacement.BottomRight:
dizi[0] = 0;
dizi[2] = progress;
break;
case ePlacement.Right:
dizi[0] = 0;
dizi[2] = progress;
break;
case ePlacement.Top:
dizi[0] = 0;
dizi[2] = 1;
break;
case ePlacement.Bottom:
dizi[0] = 0;
dizi[2] = 1;
break;
}
mCurrentBounds.X = mNormalPos.X + (int)(dizi[0] * mControlSize.Width);
mCurrentBounds.Y = mNormalPos.Y + (int)(dizi[1] * mControlSize.Height);
mCurrentBounds.Width = (int)(dizi[2] * mControlSize.Width) + 2 * BORDER_MARGIN;
mCurrentBounds.Height = (int)(dizi[3] * mControlSize.Height) + 2 * BORDER_MARGIN;
}
else
{
if (this.Opacity < (double)mPopup.OpacityValue / 100)
{
this.Opacity += (progress - 0.09);
}
else
{
this.Opacity = (double)mPopup.OpacityValue / 100;
}
mCurrentBounds.X = mNormalPos.X;//formun x mesafesi
mCurrentBounds.Y = mNormalPos.Y;//formun y mesafesi
mCurrentBounds.Width = mControlSize.Width + (2 * BORDER_MARGIN);//genişliği
mCurrentBounds.Height = mControlSize.Height + (2 * BORDER_MARGIN);//yüksekliği
}
this.Bounds = mCurrentBounds;
}
protected new void Dispose(bool disposing)
{
if (disposing)
{
if (mTimer != null)
mTimer.Dispose();
}
base.Dispose(disposing);
}
protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
e.Graphics.DrawRectangle(new Pen(mPopup.mBorderColor), 0, 0, this.Width - 1, this.Height - 1);
}
}
protected virtual void OnDropDown(object sender, EventArgs e)
{
DropDown(sender, e);
}
protected virtual void OnDropDownClosed(object sender, EventArgs e)
{
DropDownClosed(sender, e);
}
#region Public Properties and Event
public event bir DropDown;
public event iki DropDownClosed;
[Browsable(false)]//do not visible
public Control UserControl
{
get { return mUserControl; }
set { mUserControl = value; }
}
[Description("Formun opak veya transparent gözükme seçeneklerini ayarlar."),
Browsable(true),
DefaultValue(100)]
public byte OpacityValue
{
get { return opacity_deger; }//değer okunacak
set //gönderilen değer yazılacak
{
try
{
if (value < 0 || value > 100)
throw new Exception("Lütfen 0 ile 100 arasında bir değer giriniz.");
}
catch (Exception hata_Olustu)
{
MessageBox.Show(hata_Olustu.Message);
value = 100;
}
finally//hata olsada olmasada buraya uğrar
{
opacity_deger = value;
}
}
}
[Browsable(false)]
public Control Parent
{
get { return mParent; }
set { mParent = value; }
}
[Description("Shadow Visibility"),
DefaultValue(false)]
public bool ShowShadow
{
get { return mShowShadow; }
set { mShowShadow = value; }
}
[Description("Animasyonun hızını ayarlar."),
DefaultValue(100)]
public int AnimationSpeed
{
get { return mAnimationSpeed; }
set { mAnimationSpeed = value; }
}
[Description("Popup formun açılış kordinatlarını ayarlar."),
DefaultValue(typeof(SifreKontrol.Popup.ePlacement),"BottomRight")]
public ePlacement Placement
{
get { return mPlacement; }
set { mPlacement = value; }
}
[Description("Border Color"),
DefaultValue(typeof(Color),"DarkGray")]
public Color BorderColor
{
get { return mBorderColor; }
set { mBorderColor = value; }
}
[Description("Animasyon tipini ayarlamanızı sağlar."),
Browsable(true),
DefaultValue(typeof(Popup.AnimationType), "PopupMenu")]
public AnimationType Animasyon_Tip
{
get { return animasyon_Tip; }
set { animasyon_Tip = value; }
}
#endregion//done
}
}