C# 在控件之间同步鼠标单击

C# 在控件之间同步鼠标单击,c#,treeview,.net-2.0,tablelayoutpanel,window-messages,C#,Treeview,.net 2.0,Tablelayoutpanel,Window Messages,我有一个TableLayoutPanel和一个Treeview,我想将鼠标图标彼此同步。 这样做的原因是我希望能够在TableLayoutPanel中选择一些内容,然后它还应该在Treeview中选择一些内容 这就是它的样子: 我的第一次尝试有效,但有一些延迟。 我将我的Treeview连接到NodeMouseClick事件,当该事件触发时,我刷新TableLayoutPanel()以便调用CellPaint事件并绘制整行。通过这种方法,我看到了一些延迟,因为树视图先被绘制,然后是TableL

我有一个TableLayoutPanel和一个Treeview,我想将鼠标图标彼此同步。 这样做的原因是我希望能够在TableLayoutPanel中选择一些内容,然后它还应该在Treeview中选择一些内容

这就是它的样子:

我的第一次尝试有效,但有一些延迟。 我将我的Treeview连接到NodeMouseClick事件,当该事件触发时,我刷新TableLayoutPanel()以便调用CellPaint事件并绘制整行。通过这种方法,我看到了一些延迟,因为树视图先被绘制,然后是TableLayoutPanel

当我使用相同的方法,但反过来(单击TableLayoutPanel并在Treeview中选择相应的节点)时,我不会得到太多的延迟。我猜这是因为绘制行的时间比选择节点的时间长

我尝试了不同的解决方案:

class TableControl : TableLayoutPanel
{
    TreeViewWithPaint m_TreeviewChild;

    public void AddChildControl(TreeViewWithPaint treeview)
    {
        m_TreeviewChild = treeview;
    }

    protected override void WndProc(ref Message message)
    {
        const int WM_LBUTTONDOWN = 0x201;

        switch (message.Msg)
        {
            case WM_LBUTTONDOWN:
                //invalidate our table control so the OnPaint Method gets fired
                this.Update();
                //now copy the message and send it to the treeview
                Message copy = new Message
                {
                    HWnd = m_TreeviewChild.Handle,
                    LParam = message.LParam,
                    Msg = message.Msg,
                    Result = message.Result,
                    WParam = message.WParam
                };
                //pass the message onto the linked tree view
                m_TreeviewChild.RecieveWndProc(ref copy);
                break;
        }
        base.WndProc(ref message);
    }
在我的Treeview类中,我添加了以下内容:

    public void RecieveWndProc(ref Message m)
    {
        base.WndProc(ref m);
    }
我想到了一个

问题是TableLayoutPanel中的CellPaint事件不再被触发,即使使用Update()…它也会在树视图中选择正确的节点:

我也预见到了一些问题,如果我尝试在Treeview中实现同样的东西(覆盖WndProc),这会导致复制消息的疯狂循环吗

那么有没有一个(n)(简单)的方法来做到这一点


谢谢 

解决了这个问题,我没有尝试向TableLayoutPanel发送另一条单击消息,而是在Treeview WM_LBUTTONDOWN中完成了所有的绘制(我对TableLayoutPanel WM_LBUTTONDOWN消息也做了同样的处理)

const int WM_LBUTTONDOWN = 0x201;

switch( message.Msg ) 
{
    case WM_LBUTTONDOWN:
        Int16 x = (Int16)message.LParam;
        Int16 y = (Int16)((int)message.LParam >> 16);

        //Getting the control at the correct position
        Control control = m_TableControl.GetControlFromPosition(0, (y / 16));

        if (control != null)
            m_TableControl.Refresh();

        TreeNode node = this.GetNodeAt(x, y);
        this.SelectedNode = node;
        break;
}