Синхронизация щелчков мыши между элементами управления
У меня есть 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;
}