0

UIにいくつかのコンボボックスがあり、それぞれに類似したエントリ(番号)の長いリストがあります。ユーザーがコンボボックスの1つからアイテムを選択すると、ユーザーが他のコンボボックスから同様の値(ただし同じではない可能性が高い)のエントリを選択することを私は知っています。したがって、ユーザーが値を選択した後、ユーザーに多くのスクロールを強制しないようにするために、次のコンボボックスのドロップダウンを最後に選択した値の近くに「自動スクロール」したいと思います(このドロップダウンにまだ選択)。理想的には、最後に選択した値がドロップダウンの中央に表示されるようにスクロール位置を設定したいと思います。

これまで、ドロップダウンイベントで選択したアイテムを設定してこれを実行しようとしましたが、これには独自の問題があります。アイテムを選択せず​​にドロップダウンのスクロール位置を設定する方法はありますか?

これまで私はこれを試しました:

[DllImport("user32.dll", EntryPoint = "SendMessageW", CharSet = CharSet.Unicode)]
private static extern IntPtr SendMessageCb(IntPtr hWnd, int msg, IntPtr wp, out COMBOBOXINFO lp);

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

// P/Invoke declarations
private struct COMBOBOXINFO
{
   public Int32 cbSize;
   public RECT rcItem, rcButton;
   public int buttonState;
   public IntPtr hwndCombo, hwndEdit, hwndList;
}

private struct RECT
{
   public int Left, Top, Right, Bottom;
}

private const int LVM_FIRST = 0x1000;
private const int LVM_SCROLL = (LVM_FIRST + 20);

private const int WM_VSCROLL = 0x0115;
private const int SB_BOTTOM = 7;
private const int SB_PAGEDOWN = 3;

private void comboBox_DropDown(object sender, EventArgs e)
{
  COMBOBOXINFO info = new COMBOBOXINFO();
  info.cbSize = Marshal.SizeOf(info);
  SendMessageCb((sender as ComboBox).Handle, 0x164, IntPtr.Zero, out info); // seems to work
  SendMessage(info.hwndList, WM_VSCROLL, (IntPtr)SB_PAGEDOWN, IntPtr.Zero); // does nothing
  SendMessage(info.hwndList, LVM_SCROLL, IntPtr.Zero, (IntPtr) 50); // does nothing         
}

しかし、それはうまくいかないようです。COMBOBOXINFO構造は適切に設定されているようですが、SendMessageWM_VSCROLLおよびLVM_SCROLLは効果がありません。

4

1 に答える 1

0

WM_VSCROLL、LVM_SCROLL (および SetScrollInfo() の呼び出し) を使用してメッセージを送信すると、ComboBox によってドロップダウンとして表示される ListView のスクロール位置を設定することができます。問題は、ListView が実際に表示される前に発生する DropDown イベントにあります。これは、DropDown イベントで呼び出されたときに GetScrollInfo() が最小、最大 0 を返すためです。DropDown が起動されてから 1 秒の遅延のタイマーを設定し、その遅延後に GetScrollInfo() を呼び出すと、適切な最小値、最大値が返されます。その遅延の後にスクロール位置を設定することも機能します。

私は明らかに遅延が好きではありませんが、ListView が表示されたときに利用できるイベントはないと思いますか? イベントを作成することは可能ですか?

于 2012-10-03T16:05:45.153 に答える