Синхронизация щелчков мыши между элементами управления

У меня есть TableLayoutPanel и Treeview, и я хотел бы синхронизировать щелчки мыши друг с другом. Причина этого заключается в том, что я хочу иметь возможность выбрать что-то в моей TableLayoutPanel, а затем он должен также выбрать что-то в Treeview.

Вот как это выглядит:

Моя первая попытка работает, но есть некоторая задержка. Я подключил свой Treeview к событию NodeMouseClick, и когда это событие сработало, я Refresh() TableLayoutPanel, так что событие CellPaint вызывается и рисует всю строку. При таком подходе я вижу некоторую задержку, потому что сначала рисуется Treeview, а затем TableLayoutPanel.

Когда я использую тот же метод, но наоборот (щелкните TableLayoutPanel и выберите соответствующий узел в древовидной структуре), я не получаю слишком много задержки. Я предполагаю, что это потому, что рисование моих строк занимает больше времени, чем выбор узла.

Я попробовал другое решение:

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);
    }

Я получил пример, как синхронизировать полосы прокрутки Treeview

Проблема в том, что событие CellPaint в TableLayoutPanel больше не запускается, даже с Update ()... Однако он выбирает правильный узел в Treeview:

Я также предвижу некоторые проблемы с этим, если я попытаюсь реализовать то же самое в Treeview (переопределяя WndProc), это вызовет сумасшедший цикл скопированных сообщений?

Так есть ли (n) (простой) способ сделать это?

Спасибо

1 ответ

Решение

Решил это, вместо того, чтобы пытаться отправить еще одно сообщение о клике в 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;
}
Другие вопросы по тегам