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 
    } 
}