質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.77%

  • C#

    6579questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1703questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C#で子のマウスホイールイベントを親のマウスホイールイベントとして処理する方法を知りたいです

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 669

usbmemory

score 7

前提・実現したいこと

フローレイアウトパネルに動的に追加したTextBoxをマウスホイールでスクロールしようとすると、
スムーズにできないときがあります。というのもTextBoxにマウスが重なっているとこちらが優先されてしまい、
TextBoxに対してのスクロールとなってしまいます。
この子のマウスホイールイベントを親のマウスホイールイベントとして処理する方法を知りたいです。

発生している問題・エラーメッセージ

TextBoxで出たイベントをそのまま親のイベントとして使えればできそうなのですが、やり方が分かりません。

このやり方ではできない、ほかにいいやり方があるという方、ぜひ知恵を貸してください

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

TextBoxの代わりに以下を使ってみてください。

public class MyTextBox : TextBox
{
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    static extern IntPtr DefWindowProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    const int WM_MOUSEWHEEL = 0x020A;

    public MyTextBox() {}

    protected override void WndProc(ref Message m)
    {
        if(m.Msg == WM_MOUSEWHEEL){
            m.Result = DefWindowProc(m.HWnd, m.Msg, m.WParam, m.LParam);
            return;
        }
        base.WndProc(ref m);
    }
}


WM_MOUSEWHEELイベントを奪ってDefWindowProcを呼ぶと既定の動作でその親に投げることができます。
base.DefWndProcではだめです。APIレベルで親に投げるがポイントです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/03 21:43

    回答ありがとうございます。質問なのですが const int WM_MOUSEWHEEL = 0x020A;から上の行はなにをしているのでしょうか?

    キャンセル

  • 2017/10/03 22:24

    C#からWindowsのAPIを直接呼び出すP/Invokeという機能を使うための定義です。
    今回はWindowsから送られるマウスホイールのイベント(WM_MOUSEWHEEL)をTextBoxが処理するよりも前に奪って親に渡すために、WindowsのAPIを自前で呼び出しています。

    WindowsのUIの根元に当たる処理ですが.NET Frameworkでは手厚くラッピングされているのでC/C++でウィンドウを一から作ってみないと動作の理解は難しいかもしれません。

    キャンセル

  • 2017/10/04 17:41

    無事動作しました。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    xcode iPhone6Plus レイアウトについて

    質問よろしくお願いします。 現在iPhoneアプリを作成していてレイアウト部分の質問なのですが、 プレビューに5s,6,6Plusの画面を表示しておいて、確認しながら全部ちゃんと

  • 解決済

    VB テキストボックスの中身

    こんばんは。 電卓のものです。 現在機能変更に基づいて、コードを書き換えています。 一つの機能はすぐ変更が終わりましたが、 もう一つがよくわからないです。 計算経過を表示する

  • 解決済

    C#.netでの予定表の実現方法

    C#.netにてWindowsアプリケーションを作成するのですが、 その一部の機能として、予定表を作成したいと考えております。 下記のようなGUIを実現するための良い方法をご教授頂

  • 解決済

    unityのanimatorについて

    unityのanimatorを使おうと思って開いたのですが、下の写真のようにAny Stateが見切れて表示できません。 スクロールもできないのですがどうしたら表示させることがで

  • 受付中

    moancaでスクロールを禁止したい

    前提・実現したいこと moancaでenchant.jsを使用してゲームアプリを作成中なのですが、 iphoneの実機で確認すると、画面がスクロールできてしまいます。 このス

  • 解決済

    Windowsでマウスホバー中のウィンドウを取得

     困っていること C#/WPFでデスクトップアプリを開発しています。 Windowsにて、マウスホバーされているウィンドウの情報を取得する方法を探しています。 Windo

  • 解決済

    labelをスクロールしたい C#

    やりたいこと labelをスクロールしたいです。Yahoo知恵袋にそのようなコードがあったのですが、文字数が多いとどうしても重たくなってしまいます。そこで、文字数が多くても軽くスク

  • 受付中

    Electronで配置オブジェクトが多くスクロールが重くなるときの対応方法

     前提・実現したいこと Electronに限った話ではないのですが、htmlにてそれぞれ10個程度の小要素を持つオブジェクトを1000個程度配置したところ、ページのスクロールが非常

同じタグがついた質問を見る

  • C#

    6579questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Visual Studio

    1703questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • トップ
  • C#に関する質問
  • C#で子のマウスホイールイベントを親のマウスホイールイベントとして処理する方法を知りたいです