DockPane.SplitterControl.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*******************************************************************************
  2. * Copyright(c) 2014 DongkeSoft All rights reserved. / Confidential
  3. * 类的信息:
  4. * 1.程序名称:DockPane.cs
  5. * 2.功能描述:类文件
  6. * 编辑履历:
  7. * 作者 日期 版本 修改内容
  8. * 陈晓野 2014/09/01 1.00 新建
  9. *******************************************************************************/
  10. using System.Drawing;
  11. using System.Windows.Forms;
  12. namespace Dongke.IBOSS.PRD.Basics.DockPanel
  13. {
  14. /// <summary>
  15. /// 类文件
  16. /// </summary>
  17. partial class DockPane
  18. {
  19. private class SplitterControl : Control, ISplitterDragSource
  20. {
  21. DockPane m_pane;
  22. public SplitterControl(DockPane pane)
  23. {
  24. SetStyle(ControlStyles.Selectable, false);
  25. m_pane = pane;
  26. }
  27. public DockPane DockPane
  28. {
  29. get { return m_pane; }
  30. }
  31. private DockAlignment m_alignment;
  32. public DockAlignment Alignment
  33. {
  34. get { return m_alignment; }
  35. set
  36. {
  37. m_alignment = value;
  38. if (m_alignment == DockAlignment.Left || m_alignment == DockAlignment.Right)
  39. Cursor = Cursors.VSplit;
  40. else if (m_alignment == DockAlignment.Top || m_alignment == DockAlignment.Bottom)
  41. Cursor = Cursors.HSplit;
  42. else
  43. Cursor = Cursors.Default;
  44. if (DockPane.DockState == DockState.Document)
  45. Invalidate();
  46. }
  47. }
  48. protected override void OnPaint(PaintEventArgs e)
  49. {
  50. base.OnPaint(e);
  51. if (DockPane.DockState != DockState.Document)
  52. return;
  53. Graphics g = e.Graphics;
  54. Rectangle rect = ClientRectangle;
  55. if (Alignment == DockAlignment.Top || Alignment == DockAlignment.Bottom)
  56. g.DrawLine(SystemPens.ControlDark, rect.Left, rect.Bottom - 1, rect.Right, rect.Bottom - 1);
  57. else if (Alignment == DockAlignment.Left || Alignment == DockAlignment.Right)
  58. g.DrawLine(SystemPens.ControlDarkDark, rect.Right - 1, rect.Top, rect.Right - 1, rect.Bottom);
  59. }
  60. protected override void OnMouseDown(MouseEventArgs e)
  61. {
  62. base.OnMouseDown(e);
  63. if (e.Button != MouseButtons.Left)
  64. return;
  65. DockPane.DockPanel.BeginDrag(this, Parent.RectangleToScreen(Bounds));
  66. }
  67. #region ISplitterDragSource Members
  68. void ISplitterDragSource.BeginDrag(Rectangle rectSplitter)
  69. {
  70. }
  71. void ISplitterDragSource.EndDrag()
  72. {
  73. }
  74. bool ISplitterDragSource.IsVertical
  75. {
  76. get
  77. {
  78. NestedDockingStatus status = DockPane.NestedDockingStatus;
  79. return (status.DisplayingAlignment == DockAlignment.Left ||
  80. status.DisplayingAlignment == DockAlignment.Right);
  81. }
  82. }
  83. Rectangle ISplitterDragSource.DragLimitBounds
  84. {
  85. get
  86. {
  87. NestedDockingStatus status = DockPane.NestedDockingStatus;
  88. Rectangle rectLimit = Parent.RectangleToScreen(status.LogicalBounds);
  89. if (((ISplitterDragSource)this).IsVertical)
  90. {
  91. rectLimit.X += MeasurePane.MinSize;
  92. rectLimit.Width -= 2 * MeasurePane.MinSize;
  93. }
  94. else
  95. {
  96. rectLimit.Y += MeasurePane.MinSize;
  97. rectLimit.Height -= 2 * MeasurePane.MinSize;
  98. }
  99. return rectLimit;
  100. }
  101. }
  102. void ISplitterDragSource.MoveSplitter(int offset)
  103. {
  104. NestedDockingStatus status = DockPane.NestedDockingStatus;
  105. double proportion = status.Proportion;
  106. if (status.LogicalBounds.Width <= 0 || status.LogicalBounds.Height <= 0)
  107. return;
  108. else if (status.DisplayingAlignment == DockAlignment.Left)
  109. proportion += ((double)offset) / (double)status.LogicalBounds.Width;
  110. else if (status.DisplayingAlignment == DockAlignment.Right)
  111. proportion -= ((double)offset) / (double)status.LogicalBounds.Width;
  112. else if (status.DisplayingAlignment == DockAlignment.Top)
  113. proportion += ((double)offset) / (double)status.LogicalBounds.Height;
  114. else
  115. proportion -= ((double)offset) / (double)status.LogicalBounds.Height;
  116. DockPane.SetNestedDockingProportion(proportion);
  117. }
  118. #region IDragSource Members
  119. Control IDragSource.DragControl
  120. {
  121. get { return this; }
  122. }
  123. #endregion
  124. #endregion
  125. }
  126. private SplitterControl m_splitter;
  127. private SplitterControl Splitter
  128. {
  129. get { return m_splitter; }
  130. }
  131. internal Rectangle SplitterBounds
  132. {
  133. set { Splitter.Bounds = value; }
  134. }
  135. internal DockAlignment SplitterAlignment
  136. {
  137. set { Splitter.Alignment = value; }
  138. }
  139. }
  140. }