tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルマウスのドラックで範囲を選択
記事No11372
投稿日: 2015/03/26(Thu) 10:10
投稿者貴将
宜しくお願いします。

環境
WINDOWS8
VB.NET 2013
 

VB6から.NETへコンバートをしています。

やりたいこと
 ピクチャーボックス上でMouseDown・MouseUp・MouseMoveで枠表示をし
 枠内のラベルを取得したいです。

条件
 ピクチャーボックス上に、動的にラベルを作成しています。
 ラベルをクリックをすると、MSGBOXが表示されます

現状
 表示状態が 一番上がラベル ⇒ その下が枠線 ⇒ ピクチャーボックス の順番で表示されます。
 
 一番上に枠線 ラベル ピクチャーボックスと表示したいのですが
 



 

[ツリー表示へ]
タイトルRe: マウスのドラックで範囲を選択
記事No11373
投稿日: 2015/03/26(Thu) 17:34
投稿者花ちゃん
> やりたいこと
>  ピクチャーボックス上でMouseDown・MouseUp・MouseMoveで枠表示をし

下記が参考になりませんか?
 http://hanatyan.sakura.ne.jp/vb2005/vb2013graphics03.htm

>  枠内のラベルを取得したいです。
よく解らないのでパス。

[ツリー表示へ]
タイトルRe^2: マウスのドラックで範囲を選択
記事No11374
投稿日: 2015/03/26(Thu) 19:04
投稿者貴将
> > やりたいこと
> >  ピクチャーボックス上でMouseDown・MouseUp・MouseMoveで枠表示をし
>
> 下記が参考になりませんか?
>  http://hanatyan.sakura.ne.jp/vb2005/vb2013graphics03.htm
>
> >  枠内のラベルを取得したいです。
> よく解らないのでパス。

すみません。
ありがとうございます。


 上記のURLを参考に、PGを作成しました。
 
 ピクチャーボックス内のラベルの取得もできますが 
  
 枠線の表示がラベルの下なって表示をさえぎっています。
 ピクチャーボックスにコンテナ機能がなく、ピクチャーに線を引くため
 ピクチャーボックス・枠線・ラベルの順で表示しているのかと思うのですが
 ピクチャーボックス・ラベル・枠線を一番最前面にできないのでしょうか
 

[ツリー表示へ]
タイトルRe^3: マウスのドラックで範囲を選択
記事No11375
投稿日: 2015/03/27(Fri) 10:21
投稿者花ちゃん
>  ピクチャーボックス・ラベル・枠線を一番最前面にできないのでしょうか

VB2013 には、VB6.0 のような、Line コントロールや Shape コントロールのようなものはありません。
通常、今回のような枠線は、Bitmap や PictureBox の Image 上に描画することになるので、
枠線だけを最前面に移動させるようなことはできません。

何のためにこのような事が必要かによっては、代替案もあろうかと思いますが、VB6.0 と VB2013 では
描画関係は大きく変わっておりますので、ほとんど VB6.0 のコードは使用できませんので、一から
作り直すつもりで、仕様を含めて見直してみてはいかがでしょうか?

それとも場合によっては、下記のようなコントロールを作成して使用するとか。
 https://msdn.microsoft.com/ja-jp/library/cc440904.aspx

または、Label 上にも枠線の一部を描画するとか?


   

[ツリー表示へ]
タイトルRe^4: マウスのドラックで範囲を選択
記事No11376
投稿日: 2015/03/27(Fri) 14:24
投稿者貴将
> >  ピクチャーボックス・ラベル・枠線を一番最前面にできないのでしょうか
>
> VB2013 には、VB6.0 のような、Line コントロールや Shape コントロールのようなものはありません。
> 通常、今回のような枠線は、Bitmap や PictureBox の Image 上に描画することになるので、
> 枠線だけを最前面に移動させるようなことはできません。
>
> 何のためにこのような事が必要かによっては、代替案もあろうかと思いますが、VB6.0 と VB2013 では
> 描画関係は大きく変わっておりますので、ほとんど VB6.0 のコードは使用できませんので、一から
> 作り直すつもりで、仕様を含めて見直してみてはいかがでしょうか?
>
> それとも場合によっては、下記のようなコントロールを作成して使用するとか。
>  https://msdn.microsoft.com/ja-jp/library/cc440904.aspx
>
> または、Label 上にも枠線の一部を描画するとか?
>
>
>
    
花ちゃんさん
ありがとうございます。
記載されたURLを応用してがんばってみます。

[ツリー表示へ]
タイトル試してみましたが。
記事No11378
投稿日: 2015/03/29(Sun) 01:50
投稿者花ちゃん
> 記載されたURLを応用してがんばってみます。

試してみましたが、先のユーザ−コントロールではラベルが隠れるか、透過されてしまいだめですね。
FormBorderStyle.None の Form を使って赤枠以外は、透明にして作成し、ドラッグでサイズを確定した時点で
上記の Form2 を表示するようにすれば一応できるようです。

テスト結果の図(ここのサイトに掲載しているサンプルコードをつなぎ合わせて作成しております。)
 http://www.hanatyan.sakura.ne.jp/testfrom.png

 尚、右側の実行結果の赤枠は、Form で作成しているので、表示後も移動・サイズが可能で、Form として
 操作できます。
 

[ツリー表示へ]
タイトルRe: 試してみましたが。
記事No11379
投稿日: 2015/03/31(Tue) 11:48
投稿者貴将
> > 記載されたURLを応用してがんばってみます。
>
> 試してみましたが、先のユーザ−コントロールではラベルが隠れるか、透過されてしまいだめですね。
> FormBorderStyle.None の Form を使って赤枠以外は、透明にして作成し、ドラッグでサイズを確定した時点で
> 上記の Form2 を表示するようにすれば一応できるようです。
>
> テスト結果の図(ここのサイトに掲載しているサンプルコードをつなぎ合わせて作成しております。)
>  http://www.hanatyan.sakura.ne.jp/testfrom.png
>
>  尚、右側の実行結果の赤枠は、Form で作成しているので、表示後も移動・サイズが可能で、Form として
>  操作できます。
>  
ありがとうございます。

返信が遅くなりすみません。

試してみたのですが
枠線が一番下になってしまい御知恵をかりたく、記載しようと思い開いたところ
レスがあり、拝読して、これだと思い担当者に伝えたのですが
赤枠が大きくなっていく過程も必要といわれました。
Formを大きくしていく過程を表示すればいいのかと思い、早速試したのですが、
うまくいきません

マウスダウンのイベントで


赤枠のFormLoadを行ったのですが
 Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
 Me.SetStyle(ControlStyles.UserPaint, True)
 Me.SetStyle(ControlStyles.ResizeRedraw, True)

 Me.backColor = Color.Transparent
  Me.Text = ""
  Me.ControlBox = False
  Me.Location(マウスダウンのx、マウスダウンのy)

 としたのですが、

透明化されません。

基本的に考え方が間違っているのでしょうか?
宜しくお願い致します。

[ツリー表示へ]
タイトルRe^2: 試してみましたが。
記事No11381
投稿日: 2015/03/31(Tue) 14:58
投稿者花ちゃん
詳しい仕様や目的がよく解りませんので、とりあえず、赤枠をトップレベルで表示するだけのテスト用コードです。
使用コントロール類は、前回の実行結果の図のとおりで、別途 Form2 を追加しておいてください。

下記に改良サンプルを掲載しました。
http://www.hanatyan.sakura.ne.jp/vb2005/vb2013mouse04.htm

[ツリー表示へ]
タイトル画面のチラツキが気になるようでしたら。
記事No11382
投稿日: 2015/03/31(Tue) 16:07
投稿者花ちゃん
赤枠の描画時に画面のチラツキが気になるようでしたら、下記のようにサイズに変更がない場合は
描画しないようにして下さい。

下記に改良サンプルを掲載しました。
http://www.hanatyan.sakura.ne.jp/vb2005/vb2013mouse04.htm

[ツリー表示へ]
タイトルRe: 画面のチラツキが気になるようでしたら。
記事No11383
投稿日: 2015/04/01(Wed) 16:45
投稿者貴将
花ちゃんさん
ありがとうございました。

 赤枠を左上か右下だけでなく、どちらにでも赤枠を引けるように、
 改良を加えていて、返事が送れてしまい、すみませんでした。
 本来なら返信後に、改良するのが手順ですが
 パニックいて、すみませんでした。

 赤枠をイメージどおりに書くことができました。
 ありがとうございました。 
  

[ツリー表示へ]
タイトルRe: マウスのドラックで範囲を選択
記事No11377
投稿日: 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

[ツリー表示へ]
タイトルRe^2: マウスのドラックで範囲を選択
記事No11380
投稿日: 2015/03/31(Tue) 13:56
投稿者貴将
> > マウスのドラックで範囲を選択
> ドラックではなく
> ドラッグ(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 を
> 重ね合わせるという手もあります。これなら、全てのコントロールの上に枠線を描くことが出来ます。
>

ありがとうございます。
返信が遅くなりすみません。


枠線は、ラベルの範囲決定後、必要がなくなります。消えるという条件もあります。
ラベルは表示及び座標判定等に使用しています。
ラベルが 一つ一つに意味合いがあります


範囲指定前

   1    2    3    4    5    6    7    8
 □□ □□ □□ □□ □□ □□ □□ □□ A
 □□ □○ □□ □□ □□ □□ □□ □□

 □□ □□ □□ □□ □□ □□ □□ □□ B
 □□ □□ □□ □□ □□ □□ □□ □□

 □□ □□ □□ ◎□ □□ □□ □□    C
 □□ □□ □□ □□ □□ □□ □□  

 □□ □□ □□ □□ □□ □□ □□ □□ D
 □□ □□ □□ □□ □□ □□ □□ □□


2の○から4の◎まで範囲を指定
範囲指定後
 
   1    2    3    4    5    6    7    8
 □□ □□ □□ □□ □□ □□ □□ □□ A
 □□ □■ ■■ ■□ □□ □□ □□ □□

 □□ □■ ■■ ■□ □□ □□ □□ □□ B
 □□ □■ ■■ ■□ □□ □□ □□ □□

 □□ □■ ■■ ■□ □□ □□ □□    C
 □□ □□ □□ □□ □□ □□ □□  

 □□ □□ □□ □□ □□ □□ □□ □□ D
 □□ □□ □□ □□ □□ □□ □□ □□


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

[ツリー表示へ]