| File: System\Windows\Forms\Controls\ListView\ListViewInsertionMark.cs | Web Access |
| Project: src\winforms\src\System.Windows.Forms\System.Windows.Forms.csproj (System.Windows.Forms) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Drawing; namespace System.Windows.Forms; /// <summary> /// Encapsulates insertion-mark information /// </summary> public sealed class ListViewInsertionMark { private readonly ListView _listView; private int _index; private Color _color = Color.Empty; private bool _appearsAfterItem; internal ListViewInsertionMark(ListView listView) { _listView = listView; } /// <summary> /// Specifies whether the insertion mark appears /// after the item - otherwise it appears /// before the item (the default). /// </summary> public bool AppearsAfterItem { get { return _appearsAfterItem; } set { if (_appearsAfterItem != value) { _appearsAfterItem = value; if (_listView.IsHandleCreated) { UpdateListView(); } } } } /// <summary> /// Returns bounds of the insertion-mark. /// </summary> public Rectangle Bounds { get { RECT bounds = default; PInvokeCore.SendMessage(_listView, PInvoke.LVM_GETINSERTMARKRECT, (WPARAM)0, ref bounds); return bounds; } } /// <summary> /// The color of the insertion-mark. /// </summary> public Color Color { get { if (_color.IsEmpty) { _color = new COLORREF((uint)PInvokeCore.SendMessage(_listView, PInvoke.LVM_GETINSERTMARKCOLOR)); } return _color; } set { if (_color != value) { _color = value; if (_listView.IsHandleCreated) { PInvokeCore.SendMessage(_listView, PInvoke.LVM_SETINSERTMARKCOLOR, 0, _color.ToWin32()); } } } } /// <summary> /// Item next to which the insertion-mark appears. /// </summary> public int Index { get { return _index; } set { if (_index != value) { _index = value; if (_listView.IsHandleCreated) { UpdateListView(); } } } } /// <summary> /// Performs a hit-test at the specified insertion point and returns the closest item. /// </summary> public unsafe int NearestIndex(Point pt) { LVINSERTMARK lvInsertMark = new() { cbSize = (uint)sizeof(LVINSERTMARK) }; PInvokeCore.SendMessage(_listView, PInvoke.LVM_INSERTMARKHITTEST, (WPARAM)(&pt), ref lvInsertMark); return lvInsertMark.iItem; } internal unsafe void UpdateListView() { Debug.Assert(_listView.IsHandleCreated, "ApplySavedState Precondition: List-view handle must be created"); LVINSERTMARK lvInsertMark = new() { cbSize = (uint)sizeof(LVINSERTMARK), dwFlags = _appearsAfterItem ? PInvoke.LVIM_AFTER : PInvoke.LVIM_BEFORE, iItem = _index }; PInvokeCore.SendMessage(_listView, PInvoke.LVM_SETINSERTMARK, 0, ref lvInsertMark); if (!_color.IsEmpty) { PInvokeCore.SendMessage(_listView, PInvoke.LVM_SETINSERTMARKCOLOR, 0, _color.ToWin32()); } } }