tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: マウスのドラックで範囲を選択
投稿日: 2015/03/27(Fri) 14:38
投稿者魔界の仮面弁士
> マウスのドラックで範囲を選択
ドラックではなく
ドラッグ(drag)ですね。


>  ピクチャーボックス上に、動的にラベルを作成しています。
そのラベルは何のために作成しているものなのでしょうか。
文字列の表示のため? 座標の判定のため?

もしも枠線の描画に拘るのであれば、Label を使わない方が実装が楽かもしれません。

Label コントロールを使うことなく、PictureBox 上に直接文字列を描画したり、
あるいはクリック時に座標判定を行って処理をする方向で実装することも
検討してみては如何でしょうか。


> ピクチャーボックスにコンテナ機能がなく
デザイナ上のサポートが無いだけであって、基本的には
すべてのコントロールが、他のコントロールのコンテナになりえます。

たとえば
 PictureBox1.Controls.Add( Label1 )
のように載せられます。座標調整を忘れずに。

同様に、Button1.Controls.Add( TextBox2 ) とか
TextBox3.Controls.Add( PictureBox4 ) なんてことも可能です。

Form もまた Control を継承したクラスなので、
 Dim childForm As New Form()
 childForm.TopLevel = False
 childForm.Visible = True
 PictureBox1.Controls.Add(childForm)
のように、PictureBox の上にフォームを載せることさえできます。


>  枠内のラベルを取得したいです。
これでどうでしょう。

Dim rect As Rectangle = 枠範囲
Dim labels() As Label = PictureBox1.Controls.OfType(Of Label)().Where(Function(L) rect.Contains(L.Bounds)).ToArray()

上記は、PictureBox1 上に Label を配置している場合のコードです。
Form1 上の Label の場合は、Form1.Controls.OfType(Of Label)() で取り出せます。



> 表示状態が 一番上がラベル ⇒ その下が枠線 ⇒ ピクチャーボックス の順番で表示されます。
今回は「枠線」を、描画処理として実装しているのですよね。

Label の背景を透過させておいた上で、コンテナとなる PictureBox の BackgroundImage に
枠線を描画するようにしてやれば、Label の背景にも「枠線入りの背景画像」が透過表示されます。
ただしこの場合、透過されるのはラベルの背景だけで、文字はそれらの上に描かれることになります。

もしも、文字の上にも枠線が描かれるようにしたいのであれば、PictureBox だけではなく、
Label1 の Paint イベントも併用して、Label1 上にも枠線の一部を追加描画すれば OK です。


あるいは、枠線を描画するかわりに、Region プロパティを枠線状に切り抜いた Control を
重ね合わせるという手もあります。これなら、全てのコントロールの上に枠線を描くことが出来ます。


別案としては、デスクトップ全体に描画するとか…。
(作業量を考えると、今回の件のために用いることはおすすめしませんが)
http://homepage1.nifty.com/yasunari/VB/VB2005/DrawToScreen.htm

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。