0

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>

4

1 に答える 1

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;
}
于 2013-01-08T00:38:13.387 に答える