- - PR -
TextBoxをScrollToCaretを利用しても任意の位置にスクロール出来ない!
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-01-20 21:05
こんにちは。皆様。
TextBoxで、ScrollToCaretを利用すれば、スクロールを任意の位置に持ってこれること は分かりました。 しかし、これを利用してもスクロールできません。 マイクロソフトのページには、 ============================================= コントロールにフォーカスがない場合、またはカレットが既にコントロールの表示領域に位置している場合、このメソッドは無効です。 ============================================ とあるので、キットフォーカスがないためだと思われます。 そこで、どのようにフォーカスを当てればよいのかをお教え願いたいのです。 form.Invokeメソッドを使えば良いのではないかというところまでは分かったのですが、 これをどのように利用してよいのかが分かりません。 ご存知の方がいらっしゃいましたら、お教え願います。 よろしくお願いします! | ||||
|
投稿日時: 2004-01-20 23:01
諸農です。
フォームにMultiLine、ScrolBarをVertcalにしたTextBoxとRichTextBoxと Buttonを配置して、デザイナでTextBoxに複数行のテキスト(メールのコピペ)を 行ったプロジェクトで、ButtonのクリックイベントでScrollToCaret()を呼び出し ましたが、期待通りの動作はします。 期待通りにならないと言われている状況をもう少し説明していただけますか。 ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||
|
投稿日時: 2004-01-20 23:20
ご返答ありがとうございます。
そして、Jubeiさん、わざわざやってくださったのですね。ありがとうございます。 私も、以前に作成したチャットでは、ScrollToCaret()で動作するのですが、 今回新しく作成したアプリケーションでは動作しません。 少し調べてみましたところ、 「呼び出し元がコントロールの作成されたスレッドと異なるスレッド上にあるため、コントロールに対してメソッドの呼び出しを実行するときに、呼び出し元で invoke メソッドを呼び出す必要がある」 ということを知りました。 このinvokeが必要かどうかは、InvokeRequired プロパティで分かるそうなので (下記参照)、実際にtextBox1.InvokeRequiredと記述し実行してみましたら、 Trueが返され、invokeが必要であることが分かりました。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpref/html/frlrfsystemwindowsformscontrolclassinvokerequiredtopic.asp 現状で分かっているのはこのくらいです。 どうぞよろしくお願いします。 | ||||
|
投稿日時: 2004-01-21 01:22
諸農です。
もしかしてマルチスレッドからの呼び出しって事でしょうか? であるなら、こちらのトピックとサンプルコードが参考になるかも。 SDK1.1 [.NET Framework 開発者ガイド] 「マルチスレッド Windows フォーム コントロールのサンプル [C#]」 ms-help://MS.NETFrameworkSDKv1.1.JA/cpguidenf/html/cpcondevelopingmultithreadedwindowsformscontrol.htm ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||
|
投稿日時: 2004-02-19 14:53
皆様!!!
すごいです。スクロールする方法が分かりました!! TextBoxではなく、RichTextBoxだったので問題が起こったようです。 public readonly uint EM_LINESCROLL = 0x00B6; [DllImport("User32.dll")] public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lparam); //2行上にスクロールします SendMessage(richTextBox1.Handle, EM_LINESCROLL, 0, (uint)(2)); ちなみに参考にしたサイトのURLは次の通りです。 http://www.dotnet247.com/247reference/msgs/17/87791.aspx http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20743071.html | ||||
|
投稿日時: 2004-02-22 03:02
皆様、
こんにちは。 補足説明です。 上記の記述に加え、あと、 using System.Runtime.InteropServices; を追加する必要があります。 以上です。 | ||||
|
投稿日時: 2004-02-22 03:25
諸農です。
おめでとうございますっ \(^o^)/ 実現できて、よかったですね! Win32と言うことなので、こっちのトピックも参考になるかと(^^ http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8248&forum=7 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=8427&forum=7 ではでは(^^)/ _________________ 諸農和岳 Powered by Turbo Delphi & Microsoft Visual Studio 2005 十兵衛@わんくま同盟 http://blogs.wankuma.com/jubei/ | ||||
|
投稿日時: 2004-02-22 04:26
おー、これいいですね。私も使いま〜す。 でも、よく考えてみますと、 Win32でアプリを作るとき、自然と思い浮かびますよね、メッセージって。 .NETなら、なんかクラスないかなとか、メソッドないかなとか 探しますよね^-^。 _________________ |