/* User Interfaces in C#: Windows Forms and Custom Controls by Matthew MacDonald Publisher: Apress ISBN: 1590590457 */ using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Drawing.Drawing2D; namespace DockingWindows { /// <summary> /// Summary description for Form1. /// </summary> public class MDIMain : System.Windows.Forms.Form { internal System.Windows.Forms.Panel pnlDock; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public MDIMain() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.pnlDock = new System.Windows.Forms.Panel(); this.SuspendLayout(); // // pnlDock // this.pnlDock.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left); this.pnlDock.BackColor = System.Drawing.SystemColors.AppWorkspace; this.pnlDock.Name = "pnlDock"; this.pnlDock.Size = new System.Drawing.Size(148, 302); this.pnlDock.TabIndex = 2; this.pnlDock.Visible = false; this.pnlDock.Paint += new System.Windows.Forms.PaintEventHandler(this.pnlDock_Paint); // // MDIMain // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(534, 304); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.pnlDock}); this.IsMdiContainer = true; this.Name = "MDIMain"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); this.ResumeLayout(false); } #endregion /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.Run(new MDIMain()); } private void Form1_Load(object sender, System.EventArgs e) { Floater frmFloat = new Floater(); frmFloat.Owner = this; frmFloat.Show(); } public bool DrawDockRectangle { get { return pnlDock.Visible; } set { pnlDock.Visible = value; } } public void AddToDock(Form frm) { // Allow the form to be contained in a container control. frm.TopLevel = false; pnlDock.Controls.Add(frm); // Don't let the form be dragged off. frm.WindowState = FormWindowState.Maximized; } private void pnlDock_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { HatchBrush dockCueBrush = new HatchBrush(HatchStyle.LightDownwardDiagonal, Color.White, Color.Gray); Pen dockCuePen = new Pen(dockCueBrush, 10); e.Graphics.DrawRectangle(dockCuePen, new Rectangle(0, 0, pnlDock.Width, pnlDock.Height)); } } /// <summary> /// Summary description for Floater. /// </summary> public class Floater : System.Windows.Forms.Form { internal System.Windows.Forms.PictureBox PictureBox2; internal System.Windows.Forms.Button Button3; internal System.Windows.Forms.Button Button2; internal System.Windows.Forms.Button Button1; internal System.Windows.Forms.Timer tmrDock; private System.ComponentModel.IContainer components; public Floater() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.PictureBox2 = new System.Windows.Forms.PictureBox(); this.Button3 = new System.Windows.Forms.Button(); this.Button2 = new System.Windows.Forms.Button(); this.Button1 = new System.Windows.Forms.Button(); this.tmrDock = new System.Windows.Forms.Timer(this.components); this.SuspendLayout(); // // PictureBox2 // this.PictureBox2.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right); this.PictureBox2.Location = new System.Drawing.Point(1, -3); this.PictureBox2.Name = "PictureBox2"; this.PictureBox2.Size = new System.Drawing.Size(134, 172); this.PictureBox2.TabIndex = 2; this.PictureBox2.TabStop = false; // // Button3 // this.Button3.FlatStyle = System.Windows.Forms.FlatStyle.System; this.Button3.Location = new System.Drawing.Point(14, 56); this.Button3.Name = "Button3"; this.Button3.Size = new System.Drawing.Size(108, 20); this.Button3.TabIndex = 7; this.Button3.Text = "Controls"; // // Button2 // this.Button2.FlatStyle = System.Windows.Forms.FlatStyle.System; this.Button2.Location = new System.Drawing.Point(14, 36); this.Button2.Name = "Button2"; this.Button2.Size = new System.Drawing.Size(108, 20); this.Button2.TabIndex = 6; this.Button2.Text = "Dockable"; // // Button1 // this.Button1.FlatStyle = System.Windows.Forms.FlatStyle.System; this.Button1.Location = new System.Drawing.Point(14, 16); this.Button1.Name = "Button1"; this.Button1.Size = new System.Drawing.Size(108, 20); this.Button1.TabIndex = 5; this.Button1.Text = "Sample"; // // tmrDock // this.tmrDock.Interval = 10; this.tmrDock.Tick += new System.EventHandler(this.tmrDock_Tick); // // Floater // this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); this.ClientSize = new System.Drawing.Size(136, 166); this.Controls.AddRange(new System.Windows.Forms.Control[] { this.Button3, this.Button2, this.Button1, this.PictureBox2}); this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow; this.Name = "Floater"; this.Text = "Floater"; this.Move += new System.EventHandler(this.Floater_Move); this.ResumeLayout(false); } #endregion private Point dockTestAt; private void Floater_Move(object sender, System.EventArgs e) { // Determine the current location in parent form coordinates. Point mouseAt = this.Owner.PointToClient(this.Location); // Determine if the floated is close enough to dock. if (mouseAt.X < 5 && mouseAt.X > -5) { if ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left) { dockTestAt = mouseAt; // Show the dock focus rectangle. ((MDIMain)this.Owner).DrawDockRectangle = true; // Reset the timer to poll for the MouseUp event. tmrDock.Enabled = false; tmrDock.Enabled = true; } } } private void tmrDock_Tick(object sender, System.EventArgs e) { if (dockTestAt.X == this.Owner.PointToClient(this.Location).X && dockTestAt.Y == this.Owner.PointToClient(this.Location).Y) { if (Control.MouseButtons == MouseButtons.None) { // Dock in place. tmrDock.Enabled = false; ((MDIMain)this.Owner).AddToDock(this); } } else { // Mouse has moved. Disable this dock attempt. tmrDock.Enabled = false; ((MDIMain)this.Owner).DrawDockRectangle = false; } } } }