我有一个TableLayoutPanel和一个Treeview,我想将鼠标点击相互同步。 这样做的原因是我希望能够在TableLayoutPanel中选择一些东西,然后它也应该在Treeview中选择一些东西。
它的外观如下:
我的第一次尝试有效,但有一些延迟。 我将Treeview连接到NodeMouseClick事件,当该事件触发我 Refresh() TableLayoutPanel时,CellPaint事件被调用并绘制整行。通过这种方法,我看到了一些延迟,因为Treeview首先被绘制,然后是TableLayoutPanel。
当我使用相同的方法但反过来时(单击TableLayoutPanel并在Treeview中选择相应的节点)我没有得到 AS MUCH 延迟。我猜这是因为绘制行所需的时间比选择节点所需的时间长。
我尝试了另一种解决方案:
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);
}
我明白了example how to sync Treeview scrollbars
问题是TableLayoutPanel中的CellPaint事件不再被触发,即使使用 Update() ......但它确实在Treeview中选择了正确的节点:
如果我尝试在Treeview中实现相同的东西(覆盖WndProc),我也预见到了一些问题,这会导致复制消息的疯狂循环吗?
那么有(n)(简单)方法吗?
谢谢
答案 0 :(得分:0)
解决了它,而不是尝试向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;
}