tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルAutoScroll
記事No9197
投稿日: 2009/07/21(Tue) 19:44
投稿者VB
VB2008 WinXP

テキストボックスを動的にPanel上に作成しています。
そこで、コンロトールの位置が既に表示されたPanelサイズ
越えたときにPanelのAutoScrollによりスクロールが出来るようになりますよね。
そこで、スクロールバーをスライドすると
一度置いたコントロールの座標が、
勝手に少し移動してしまっているとバグを見つけたのですが、
どのような対処法があるのでしょうか?
アドバイス宜しくお願いいたします。

[ツリー表示へ]
タイトルRe: AutoScroll
記事No9201
投稿日: 2009/07/23(Thu) 10:33
投稿者花ちゃん
>> 一度置いたコントロールの座標が、
> 勝手に少し移動してしまっているとバグを見つけたのですが、

バグと言うなら、他の人が事象を再現できるコードを投稿して下さい。


# 返事は速やかにお願いします。

 http://hanatyan.sakura.ne.jp/hazimeni.htm#keijiban

[ツリー表示へ]
タイトルRe^2: AutoScroll
記事No9204
投稿日: 2009/07/23(Thu) 19:23
投稿者VB
現象がわかりました。
パネルをスクロールさせても、常に画面左上が(X:Y)=(0:0)原点となってしまうため
スクロールをさせた後にコントロールの座標を確認すると
あたかも座標が変わってしまったようにプロパティが変わってしまっていたようです。

そこで、質問なのですが。
スクロールをしても、原点を最初に表示されたパネルの左上として
みなすような方法は、ありますでしょうか?

アドバイスの返事は、明日の午後になります。
宜しくお願いいたします。

[ツリー表示へ]
タイトルRe^3: AutoScroll
記事No9205
投稿日: 2009/07/24(Fri) 08:25
投稿者花ちゃん
>バグと言うなら、他の人が事象を再現できるコードを投稿して下さい。
上記の件はどうなったのでしょうか?

貴方の説明だけでは、何の為に何を知りたいのかをよく理解できません、例えば、
>パネルをスクロールさせても、常に画面左上が(X:Y)=(0:0)原点となってしまう
何のどのような座標値(スクリーン座標・クライアント座標 等)
(画面左上の座標値は、0,0 となるのが普通のようですが)

>スクロールをさせた後にコントロールの座標を確認すると のコントロールは
何を指しているのか解りません。


下記のサイト等を参考に質問事項を書き直すなりされた方がレスが得られ易いかと
思います。

 技術系メーリングリストで質問するときのパターン・ランゲージ(結城浩氏)
 http://www.hyuki.com/writing/techask.html

[ツリー表示へ]
タイトルRe^4: AutoScroll
記事No9206
投稿日: 2009/07/24(Fri) 13:31
投稿者VB
> >バグと言うなら、他の人が事象を再現できるコードを投稿して下さい。
> 上記の件はどうなったのでしょうか?
コードを書くととても長くなってしまいます。

> 貴方の説明だけでは、何の為に何を知りたいのかをよく理解できません、例えば、
> >パネルをスクロールさせても、常に画面左上が(X:Y)=(0:0)原点となってしまう
> 何のどのような座標値(画面左上の座標値は、0,0 となるのが普通のようですが)
> >スクロールをさせた後にコントロールの座標を確認すると のコントロールは
> 何を指しているのか解りません。

動的に作成したテキストボックスのコントロールの座標が
パネルをスクロールすることによって最初に指定していた位置と異なってしまう。
スクロールとともにテキストボックスの位置も変わってしまうので仕方ないと言えば
仕方ないですよね。

動的に作成したテキストボックスの座標を再度取得するときは、
AutoScrollプロパティをその時だけFalseにしてあげれば、
今回の問題は、解決でした。


次に新たな質問なのですが。
今回もPanelのAutoScrollをTrueにしているのですが。
Panelにイメージを貼り付けているのですが、
スクロールさせたときにそのイメージがゆがんでしまいます。
スクロールしてもイメージを鮮明に表示させるには、
どのようにしたら良いでしょうか?
アドバイス宜しくお願い致します。

次回のコメントは、本日15時以降になります。

[ツリー表示へ]
タイトルRe^5: AutoScroll
記事No9207
投稿日: 2009/07/24(Fri) 19:36
投稿者魔界の仮面弁士
> Panelにイメージを貼り付けているのですが、
> スクロールさせたときにそのイメージがゆがんでしまいます。

試していませんが、Panel に直接張り付けるのではなく、その上に PictureBox を乗せて、
PictureBox の Image (≠BackgroundImage) プロパティに割り当ててみては如何でしょう。

[ツリー表示へ]
タイトルRe^6: AutoScroll
記事No9208
投稿日: 2009/07/25(Sat) 10:06
投稿者VB
> 試していませんが、Panel に直接張り付けるのではなく、その上に PictureBox を乗せて、
> PictureBox の Image (≠BackgroundImage) プロパティに割り当ててみては如何でしょう。

Panelをクリックしたときの動作がありまして、
PictureBoxを乗せるとその処理が行えなくなってしまうので残念ですが
すみませんがそれは、出来ません・・・。
Panelを透過させて後ろにあるPictureBoxを映し出せたら良いのですが。

[ツリー表示へ]
タイトルRe^7: AutoScroll
記事No9209
投稿日: 2009/07/25(Sat) 12:23
投稿者魔界の仮面弁士
>>> Panelにイメージを貼り付けているのですが、
>>> スクロールさせたときにそのイメージがゆがんでしまいます。
スクロールさせたときに、そのイメージの位置として望ましいのは
 (1) 一緒にスクロールしてほしい。
 (2) スクロールに連動させたくない。
 (3) 画像そのもののスクロールはどうでも良い。
のいずれでしょうか?


>>> スクロールしてもイメージを鮮明に表示させるには、
>>> どのようにしたら良いでしょうか?
Panel 単体で現象を軽減したいのであれば、Panel の Scroll イベントで
Panel の Invalidate メソッドを呼ぶようにすると、多少なりとも改善するかと思います。
さらに念のため、Application の Idle イベントで、Panel の Update メソッドも
呼んでおくと良いでしょう。スクロール中の描画崩れを回避できるわけでは無いですが、
少なくとも、スクロール完了時には正常に再描画されるようになります。


>> 試していませんが、Panel に直接張り付けるのではなく、その上に PictureBox を乗せて、
試してみたところ、Panel の上に PictureBox を乗せた場合には、
スクロール中でも描画の歪みは殆ど発生しなくなりました。


> Panelをクリックしたときの動作がありまして、
> PictureBoxを乗せるとその処理が行えなくなってしまうので
見た目の話では無く、クリック時の問題だけであるならば、
PictureBox のクリック時に、Panel のクリック時の処理を呼び出せば済むと思います。


> 残念ですが
『残念』という事は、Panel のクリック時の問題があるので採用はできなかったが、
AutoScroll 時の画像の歪みそのものは解消していた、という事でしょうか?

それとも、もしもクリック時の問題が解決できたとしても、現象の解決には
至らなかったという意味での『残念』なのでしょうか?


> Panelを透過させて後ろにあるPictureBoxを映し出せたら良いのですが。
出来ますが、それだと描画崩れの問題は解決できない(むしろ悪化する)と思いますよ。

一応手順的には、Panel を PictureBox の上に載せて(≠重ねて)、Panel の BackColor を
Transparent にする事で、その下にある PictureBox の画像が透けて見えるようになります。
なお、この場合のコントロール階層は、以下のようになります。
 [Form1]
 ┗[PictureBox]
  ┗[Panel1]
   ┗[その他のコントロール]

ただしフォーム デザイナ上では 「PictureBox1.Controls.Add(Panel1)」の状態にできず、
 [Form1]
 ┣[PictureBox]
 ┗[Panel1]
  ┗[その他のコントロール]
の状態にしかできないため、Form1.Designer.vb の InitializeComponent を
直接書き換える(あるいは、Form_Load 等で調整する)などの対処が必要ですけれどね。
http://dobon.net/vb/dotnet/control/labelonpicturebox.html

[ツリー表示へ]
タイトルRe^8: AutoScroll
記事No9210
投稿日: 2009/07/25(Sat) 14:21
投稿者VB
> スクロールさせたときに、そのイメージの位置として望ましいのは
>  (1) 一緒にスクロールしてほしい。
>  (2) スクロールに連動させたくない。
>  (3) 画像そのもののスクロールはどうでも良い。
> のいずれでしょうか?
(1)です。

> Panel 単体で現象を軽減したいのであれば、Panel の Scroll イベントで
> Panel の Invalidate メソッドを呼ぶようにすると、多少なりとも改善するかと思います。
> さらに念のため、Application の Idle イベントで、Panel の Update メソッドも
> 呼んでおくと良いでしょう。スクロール中の描画崩れを回避できるわけでは無いですが、
> 少なくとも、スクロール完了時には正常に再描画されるようになります。
これだと、(1)の一緒にスクロールと言う点でダメでした。

> 見た目の話では無く、クリック時の問題だけであるならば、
> PictureBox のクリック時に、Panel のクリック時の処理を呼び出せば済むと思います。
かなりのコーディング修正になるので、この方法は保留とさせてください。
すみません・・・。

> 『残念』という事は、Panel のクリック時の問題があるので採用はできなかったが、
> AutoScroll 時の画像の歪みそのものは解消していた、という事でしょうか?
おっしゃるとおり、クリックの問題がありましたが画像の歪みは改善されました。

> > Panelを透過させて後ろにあるPictureBoxを映し出せたら良いのですが。
> 出来ますが、それだと描画崩れの問題は解決できない(むしろ悪化する)と思いますよ。
試してみましら、その通りでした・・・。

> 一応手順的には、Panel を PictureBox の上に載せて(≠重ねて)、Panel の BackColor を
> Transparent にする事で、その下にある PictureBox の画像が透けて見えるようになります。
> なお、この場合のコントロール階層は、以下のようになります。
>  [Form1]
>  ┗[PictureBox]
>   ┗[Panel1]
>    ┗[その他のコントロール]
>
> ただしフォーム デザイナ上では 「PictureBox1.Controls.Add(Panel1)」の状態にできず、
>  [Form1]
>  ┣[PictureBox]
>  ┗[Panel1]
>   ┗[その他のコントロール]
> の状態にしかできないため、Form1.Designer.vb の InitializeComponent を
> 直接書き換える(あるいは、Form_Load 等で調整する)などの対処が必要ですけれどね。
> http://dobon.net/vb/dotnet/control/labelonpicturebox.html

Form1.Designer.vbの書換えですか。大変そうですね。f(^^;
ですが、そうするしかないような気もしてきました。
ない頭で色々考えてそれでも、実現不可能な場合
保留としていた方法でコーディングさせてもらいたいと思います。
アドバイスありがとうございました。

[ツリー表示へ]
タイトルRe^9: AutoScroll
記事No9211
投稿日: 2009/07/25(Sat) 14:37
投稿者魔界の仮面弁士
> > 少なくとも、スクロール完了時には正常に再描画されるようになります。
> これだと、(1)の一緒にスクロールと言う点でダメでした。
そもそも、今はどのようにしているのでしょうか?

Panel の背景画像だとしたら、(1) の要求は満たせないので、何にせよ、
Panel の上に何か(例: PictureBox)を載せて、
そこに画像を割り当てる必要があるはずですが。


> > 見た目の話では無く、クリック時の問題だけであるならば、
> > PictureBox のクリック時に、Panel のクリック時の処理を呼び出せば済むと思います。
> かなりのコーディング修正になるので、この方法は保留とさせてください。
画面イメージを見ていないので、なんとも言えないのですが、クリック時の処理のために、
 Sub Panel1_Click(…) Handles Panel1.Click

 Sub Panel1_Click(…) Handles Panel1.Click, PictureBox1.Click
とするだけでは駄目なのでしょうか?

> Form1.Designer.vbの書換えですか。大変そうですね。f(^^;
1行変更するだけですよ。Form1.Designer.vb を修正したくなければ、
Form1_Load に、Controls.Add しなおすコードを記述しても OK です。

> ですが、そうするしかないような気もしてきました。
本当に「そうするしかない」のですか? その方法では問題を解決できなかったのですよね?(↓)

> > > Panelを透過させて後ろにあるPictureBoxを映し出せたら良いのですが。
> > 出来ますが、それだと描画崩れの問題は解決できない(むしろ悪化する)と思いますよ。
> 試してみましら、その通りでした・・・。


もし、パネル背景 の PictureBox を表示させつつ、スクロール崩れにも対応させるなら、

 [Form1]
 ┣[Panel1] AutoScroll = True
 ┃┣[PictureBox1] Image = 任意画像
 ┃┃┗[Panel2] BackColor = Transparent、Click イベント処理用
 ┃┃ ┗[その他のコントロール]
 ┃┗[その他のコントロール]
 ┗[その他のコントロール]

という構成にするという手もあるかと。

[ツリー表示へ]
タイトルRe^10: AutoScroll
記事No9240
投稿日: 2009/08/03(Mon) 09:53
投稿者VB
> そもそも、今はどのようにしているのでしょうか?
Panel1をAutoScrollにして、イメージもPanel1のBackGroundImageに挿入しています。

> 画面イメージを見ていないので、なんとも言えないのですが、クリック時の処理のために、
>  Sub Panel1_Click(…) Handles Panel1.Click
> を
>  Sub Panel1_Click(…) Handles Panel1.Click, PictureBox1.Click
> とするだけでは駄目なのでしょうか?
そのようにしてもPanel1上のコントロールに変化があったとき、
PictureBoxに隠れてしまいますので・・・。

> 1行変更するだけですよ。Form1.Designer.vb を修正したくなければ、
> Form1_Load に、Controls.Add しなおすコードを記述しても OK です。
勉強になりました。

> もし、パネル背景 の PictureBox を表示させつつ、スクロール崩れにも対応させるなら、
>
>  [Form1]
>  ┣[Panel1] AutoScroll = True
>  ┃┣[PictureBox1] Image = 任意画像
>  ┃┃┗[Panel2] BackColor = Transparent、Click イベント処理用
>  ┃┃ ┗[その他のコントロール]
>  ┃┗[その他のコントロール]
>  ┗[その他のコントロール]
>
> という構成にするという手もあるかと。
その線で少し考えてみたいと思います。時間を下さい。
アドバイスありがとうございました。

[ツリー表示へ]