FqbCheckedListBox.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. namespace FastReport.FastQueryBuilder
  5. {
  6. internal class FqbCheckedListBox : CheckedListBox
  7. {
  8. private Rectangle dragBoxFromMouseDown;
  9. public event EventHandler VertScrollValueChanged;
  10. protected override void OnMouseDown(MouseEventArgs e)
  11. {
  12. base.OnMouseDown(e);
  13. if (SelectedItem != null)
  14. {
  15. Size dragSize = SystemInformation.DragSize;
  16. dragBoxFromMouseDown = new Rectangle(new Point(e.X - (dragSize.Width / 2),
  17. e.Y - (dragSize.Height / 2)), dragSize);
  18. }
  19. else
  20. dragBoxFromMouseDown = Rectangle.Empty;
  21. }
  22. protected override void OnMouseMove(MouseEventArgs e)
  23. {
  24. base.OnMouseMove(e);
  25. if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
  26. {
  27. if ((dragBoxFromMouseDown != Rectangle.Empty) &&
  28. !dragBoxFromMouseDown.Contains(e.X, e.Y))
  29. {
  30. DoDragDrop(SelectedItem, DragDropEffects.Copy);
  31. }
  32. }
  33. }
  34. protected override void OnMouseUp(MouseEventArgs e)
  35. {
  36. base.OnMouseUp(e);
  37. dragBoxFromMouseDown = Rectangle.Empty;
  38. }
  39. #if WPF
  40. private System.Windows.Controls.ScrollViewer scrollViewer;
  41. internal Rectangle GetItemRectangle(int pos)
  42. {
  43. if (scrollViewer != null)
  44. pos -= (int)scrollViewer.ContentVerticalOffset;
  45. return new Rectangle(0, (pos) * ItemHeight, Width, ItemHeight);
  46. }
  47. public FqbCheckedListBox()
  48. {
  49. control.Loaded += (s, e) =>
  50. {
  51. scrollViewer = control.GetChildOfType<System.Windows.Controls.ScrollViewer>();
  52. scrollViewer.ScrollChanged += (s, e) => VertScrollValueChanged?.Invoke(this, EventArgs.Empty);
  53. };
  54. }
  55. #endif
  56. #if AVALONIA
  57. private Avalonia.Controls.ScrollViewer scrollViewer;
  58. internal Rectangle GetItemRectangle(int pos)
  59. {
  60. int y = pos * ItemHeight;
  61. if (scrollViewer != null)
  62. y -= (int)(scrollViewer.Offset.Y / DpiScale);
  63. return new Rectangle(0, y, Width, ItemHeight);
  64. }
  65. public FqbCheckedListBox()
  66. {
  67. control.Loaded += (s, e) =>
  68. {
  69. scrollViewer = Avalonia.VisualTree.VisualExtensions.FindDescendantOfType<Avalonia.Controls.ScrollViewer>(control);
  70. scrollViewer.ScrollChanged += (s, e) => VertScrollValueChanged?.Invoke(this, EventArgs.Empty);
  71. };
  72. }
  73. #endif
  74. #if !MONO
  75. private const int WM_VSCROLL = 0x115;
  76. protected override void WndProc(ref Message m)
  77. {
  78. base.WndProc(ref m);
  79. if (m.Msg == WM_VSCROLL)
  80. {
  81. VertScrollValueChanged?.Invoke(this, EventArgs.Empty);
  82. }
  83. }
  84. #endif
  85. }
  86. }