TableLayoutPanel と Treeview があり、マウスクリックを互いに同期させたいと考えています。この理由は、TableLayoutPanel で何かを選択できるようにしたいので、Treeview でも何かを選択する必要があるためです。
これはどのように見えるかです:
私の最初の試みは機能しますが、多少の遅延があります。Treeview を NodeMouseClick イベントに接続し、そのイベントが発生すると TableLayoutPanel をRefresh()して、CellPaint イベントが呼び出されて行全体をペイントするようにします。このアプローチでは、Treeview が最初に描画され、次に 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);
}
Treeviewスクロールバーを同期する方法の例を思いついた
これに関する問題は、 Update()を使用しても、TableLayoutPanel の CellPaint イベントが発生しなくなったことです。ただし、ツリービューで正しいノードを選択します。
また、Treeview で同じことを実装しようとすると (WndProc をオーバーライドする)、これに関するいくつかの問題が予測されますが、コピーされたメッセージのクレイジーなループが発生しますか?
これを行う(簡単な)方法はありますか?
ありがとう</p>