winforms 如何确定鼠标指针是否在表格布局面板单元格边框上c#

c3frrgcw  于 2023-02-13  发布在  C#
关注(0)|答案(1)|浏览(151)

我在窗口窗体上有TableLayoutPanel。我希望鼠标指针在单元格边框上/附近时光标样式是十字形。
编辑我尝试了鼠标移动事件。我得到了鼠标点移动的单元格位置。但是我不能使用这个信息,我被卡住了。怎么能做到呢?
编辑:我修正了这个问题。这是关于尺寸类型的。代码工作正常。我分享给那些有类似需求的人。谢谢。

bool calcCells = false;
List<float> XCoordinates = new List<float>();
List<float> YCoordinates = new List<float>();  
    
public Form3()
{
    InitializeComponent();
    // Set the DoubleBuffered property via reflection (if needed)
    var flags = BindingFlags.Instance | BindingFlags.NonPublic;
    tlp1.GetType().GetProperty("DoubleBuffered", flags).SetValue(tlp1, true);
    tlp1.Layout += tlp1_Layout;
    tlp1.CellPaint += tlp1_CellPaint;
    tlp1.MouseMove += tlp1_MouseMove;
}

// Added the x coordinates of cell borders in a List
private void CreateXCoordinateList()
{
    XCoordinates.Clear();

    //  first  and last column sizetype is SizeType.Absoulute.
    float tlpWidth = tlp1.Width- tlp1.ColumnStyles[0].Width - tlp1.ColumnStyles[tlp1.ColumnCount-1].Width;
    float x = 0;
    for (int i = 0; i < tlp1.ColumnCount; i++)
    {
        if(tlp1.ColumnStyles[i].SizeType==SizeType.Absolute)
        x += tlp1.ColumnStyles[i].Width;
        else if(tlp1.ColumnStyles[i].SizeType == SizeType.Percent)
        {
            double k = tlpWidth * tlp1.ColumnStyles[i].Width * 0.01;
            x += Convert.ToSingle(k);
        }
        XCoordinates.Add(x);
    }
}

// Added the y coordinates of cell borders in a List
private void CreateYCoordinateList()
{
    YCoordinates.Clear();

    //  first  and last row sizetype is SizeType.Absoulute.
    float tlpHeight = tlp1.Height - tlp1.RowStyles[0].Height - tlp1.RowStyles[tlp1.RowCount - 1].Height;
    float y = 0;
    for (int i = 0; i < tlp1.RowCount; i++)
    {
        if (tlp1.RowStyles[i].SizeType == SizeType.Absolute)
            y += tlp1.RowStyles[i].Height;
        else if (tlp1.RowStyles[i].SizeType == SizeType.Percent)
        {
            double k = tlpHeight * tlp1.RowStyles[i].Height*0.01;
            y += Convert.ToSingle(k);
        }
        YCoordinates.Add(y);
    }
}


private void tlp1_Layout(object sender, LayoutEventArgs e) => calcCells = true;

private void tlp1_CellPaint(object sender, TableLayoutCellPaintEventArgs e)
{
    if (calcCells)
    {
        CreateXCoordinateList();
        CreateYCoordinateList();
        if (e.Column == tlp1.ColumnCount - 1 &&
            e.Row == tlp1.RowCount - 1) 
            calcCells = false;
    }
}
private void tlp1_MouseMove(object sender, MouseEventArgs e)
{
    //Comparing the mouse pointer position with the cellborder coordinates,
    //if the difference is less than and equal to 4, change the cursor style.
    float x = e.Location.X;
    float y = e.Location.Y;
    if (MouseNearCellBorderXAxis(e) || MouseNearCellBorderYAxis(e))
        tlp1.Cursor = Cursors.Cross;
    else
        tlp1.Cursor = Cursors.Default;
}
private bool MouseNearCellBorderXAxis(MouseEventArgs e)
{
    float x = e.Location.X;
    for (int i = 0; i < XCoordinates.Count; i++)
    {
        float Border = XCoordinates[i];
        double difference = Math.Abs(x - Border);
        if (difference <= 4)
            return true;
        
    }
    return false;
}
private bool MouseNearCellBorderYAxis(MouseEventArgs e)
{
    float y = e.Location.Y;
    for (int i = 0; i < YCoordinates.Count; i++)
    {
        float Border = YCoordinates[i];
        double difference = Math.Abs(y - Border);
        if (difference <= 4)
            return true;
        
    }
    return false;
}
vql8enpb

vql8enpb1#

如果我明白你的意思,假设你在TableLayoutPanel的单元格中有控件,那么你只需要为以下对象设置一次不同的光标:

  • 主窗体(箭头)
  • 表格布局面板(交叉)
  • 其中包含的控件(例如:手动)

其他的事情都应该自己发生。

public MainForm()
{
    InitializeComponent();

    // MainForm has ARROW
    this.Cursor = Cursors.Arrow;

    // TableLayoutPanel has CROSS
    tableLayoutPanel.Cursor = Cursors.Cross;

    int key = 0; string text;
    for (int column = 0; column < tableLayoutPanel.ColumnCount; column++)
        for (int row = 0; row < tableLayoutPanel.RowCount; row++)
        {
            switch (++key)
            {
                case 10: text = "*"; break;
                case 11: text = "0"; break;
                case 12: text = "#"; break;
                default: text = $"{key}";  break;
            }
            tableLayoutPanel.Controls.Add(new Label
            {
                BackColor = Color.LightGreen,
                Anchor = (AnchorStyles)0xF,
                Margin = new Padding(10),  
                Text = text,
                TextAlign = ContentAlignment.MiddleCenter,

                // Controls in the table have HAND
                Cursor = Cursors.Hand,
            });
        }
}

相关问题