DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コントロールの指定位置にリストボックスを表示

環境/言語:[ ]
分類:[.NET]

こんにちは。

Windows XP Pro SP2
Microsoft Visual Basic .NET 2003 Enter
.NET Framework 1.1

リッチテキストボックス内の指定位置にリストボックスを表示したいのですが良い案はありますでしょうか?具体的にいうと、VBなどの「.」を入力した際に表示されるリストボックスと同様の事がしたいです。

リッチテキストのマウスダウンイベントにて、コントロール上のマウス座標を利用してリストボックスを表示しようと試みましたが、実際にはずれた位置に表示されてしまい(コントロールはフォーム上の座標を拾うため)お手上げです。更に、この方法だとテキストが変更されて対象の文字の位置に表示するのは不可能です。

このような機能を実装するには簡単には出来ないのでしょうか?
よろしくお願いします。
■No20846に返信(魔界の天使さんの記事)
Cursor.PositionとPointToClientの併用などで駄目なんですか?

ここらへんかもしれません。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.pointtoclient(VS.80).aspx

ただ、フォーム上のコントロール内にリストボックスを収めるようにするなら
もうちょっとだけ座標計算がいるかもしれませんが。
リストボックスの高さを求めないといけないと思いますが、
ここらへんは参考になるのは、こっちかも。

http://www.microsoft.com/japan/msdn/net/winforms/bettercombobox.aspx

いまいち判ってないので、見当違いの事いってたら申し訳ないです。
まずは使用しようとしているメソッドなどがどの座標系を求めているかを知らなければなりません。
#スクリーン座標とクライアント座標

http://msdn2.microsoft.com/ja-jp/library/ms171540(VS.80).aspx
■No20846に返信(魔界の天使さんの記事)
> リッチテキストボックス内の指定位置にリストボックスを表示したいのですが良い案はありますでしょうか?具体的にいうと、VBなどの「.」を入力した際に表示されるリストボックスと同様の事がしたいです。

あと文字列の入力カーソル(キャレット)の座標にあわせて出すなら、
GetCaretPosを使うのかもしれません。

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getcaretpos.asp

マウスしか頭になかったです。
書き忘れていました。すいません。

1.1のリッチテキストに座標取得用のプロパティがあったかもしれませんが・・・
ここらへんはもっと詳しい方がいますのでパスしておきます。
すいません。
2007/11/01(Thu) 16:51:13 編集(投稿者)

こんにちは。
> Microsoft Visual Basic .NET 2003 Enter
> .NET Framework 1.1
> このような機能を実装するには簡単には出来ないのでしょうか?


興味があったので、.NET 2003 で確認してみました。
RichTextBox1の外に適当にButton1をデザインして、Button1をRichTextBox1の中に置いてください。
RichTextBox1を最背面にしておいてください。

    Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
        Dim cidx As Integer = RichTextBox1.SelectionStart - 1
        If RichTextBox1.Text.Chars(cidx) = "." Then
            Dim pos1 As Point = RichTextBox1.GetPositionFromCharIndex(cidx)
            Dim s1 As String = "Position:" & pos1.ToString
            Console.WriteLine(s1)

            Button1.Left = RichTextBox1.Left + pos1.X + 10
            Button1.Top = RichTextBox1.Top + pos1.Y + 10
        End If
    End Sub

これで、"."をキーインしたら、その右下にButton1が移動しました。
参考になれば幸いです
2007/11/01(Thu) 17:33:08 編集(投稿者)

こんにちは。

みなさんご親切に回答有り難う御座います。
まどかさんにじゅでさん、非常に参考になる回答でした。
自分の説明不足もあったにも関わらず、数々の回答は適切であり親切さを実感できました。自分はマウスの座標に拘っていた為に、思った事が全く出来ておらず、回答を参考に試行錯誤してみましたが、マウスのクリックイベントでのみならば、何とか完成しました。が、テキストが変更された時にどうしても出来ないままでした。

じゅでさんの回答にもあるように、APIの力を借りるしかないのかなって思い、色々と参考になるサイトを探してみました。花ちゃんのサイトのVB6のサンプルにコントロール内のマウス座標を取得できるAPIのサンプルがあるのを発見しましたが、.NETで実行するとなぜか正確に取得できなかった。自分のミスだったのかな?

y4yamaさん・・・・・。
驚きの回答、って言うか丁寧にソースコードまで有り難う御座います。
まさしく思っていた通りのソースコードです。このサンプルを利用させて頂き、色々な機能を実装させてみたいと思います。今回の質問の回答として、今後も同様の質問者が居た時の為に、y4yamaさんのソースコードを利用して載せておきます。(ほぼそのまんまですがすみません)

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
※ リッチテキストとリストボックスを作成し、リストボックスは最前面にします。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  ListBox1.Visible = False
End Sub
Private Sub RichTextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox1.TextChanged
  Dim cidx As Integer = RichTextBox1.SelectionStart - 1
  If RichTextBox1.Text.Chars(cidx) = "." Then
    Dim pos1 As Point = RichTextBox1.GetPositionFromCharIndex(cidx)
    With ListBox1
      .Left = RichTextBox1.Left + pos1.X + 10
      .Top = RichTextBox1.Top + pos1.Y + 20
      .Visible = True
    End With
  Else
    ListBox1.Visible = False
  End If
End Sub
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

みなさん、本日は色々とお世話になりました。
貴重な時間の中からこのような様々な回答を頂き心から感謝しています。
これを気によろしくお願いします。
どうも有り難う御座いました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板