2

スクロール バーが表示されているときに、WinForms コンテナー コントロールでこれを実現するにはどうすればよいですか?

ここでハイライト表示 (Google Chrome ブラウザー):

ここに画像の説明を入力

編集: このカーソルは、スクリーンショットに表示される唯一のものです。私が言いたいことが明確であることを願っています。

編集:私のコントロールでこれを試しました。動作しません。

    const int WM_MBUTTONDOWN = 0x207;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_MBUTTONDOWN)
            DefWndProc(ref m);
        else
            base.WndProc(ref m);
    }
4

2 に答える 2

2

Here's what I have so far. It exits "reader mode" if I release the middle button, and I haven't implemented scrolling within the control (I used a textbox), but it may give you something to start with.

    [DllImport("comctl32.dll", SetLastError=true,  EntryPoint="#383")]
    static extern void DoReaderMode(ref READERMODEINFO prmi);

    public delegate bool TranslateDispatchCallbackDelegate(ref MSG lpmsg);
    public delegate bool ReaderScrollCallbackDelegate(ref READERMODEINFO prmi, int dx, int dy);

    [StructLayout(LayoutKind.Sequential)]
    public struct READERMODEINFO
    {
        public int cbSize;
        public IntPtr hwnd;
        public int fFlags;
        public IntPtr prc;
        public ReaderScrollCallbackDelegate pfnScroll;
        public TranslateDispatchCallbackDelegate fFlags2;
        public IntPtr lParam;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct MSG
    {
        public IntPtr hwnd;
        public UInt32 message;
        public IntPtr wParam;
        public IntPtr lParam;
        public UInt32 time;
        public POINT pt;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int x;
        public int y;
    }

    [StructLayout(LayoutKind.Sequential)]
    struct RECT
    {
        public int left, top, right, bottom;
    }

    private bool TranslateDispatchCallback(ref MSG lpMsg)
    {
        return false;
    }
    private bool ReaderScrollCallback(ref READERMODEINFO prmi, int dx, int dy)
    {
        // TODO: Scroll around within your control here

        return false;
    }

    private void EnterReaderMode()
    {
        READERMODEINFO readerInfo = new READERMODEINFO
        {
            hwnd = this.textBox1.Handle,
            fFlags = 0x00,
            prc = IntPtr.Zero,
            lParam = IntPtr.Zero,
            fFlags2 = new TranslateDispatchCallbackDelegate(this.TranslateDispatchCallback),
            pfnScroll = new ReaderScrollCallbackDelegate(this.ReaderScrollCallback)
        };
        readerInfo.cbSize = Marshal.SizeOf(readerInfo);

        DoReaderMode(ref readerInfo);
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Middle)
        {
            EnterReaderMode();
        }
    }
于 2012-11-06T15:55:14.193 に答える
0

RichTextBox コントロールは、マウス ホイール ボタンを押すと、既定でそれを行います。

編集:申し訳ありませんが、コンテナコントロールではなくテキストボックス内で行うことについて質問していると誤解してしまいました

于 2012-11-06T14:33:08.413 に答える