C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: Pictureboxの透過


(過去ログ 35 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■17579 / inTopicNo.1)  Pictureboxの透過
  
□投稿者/ ハンマー (1回)-(2008/04/27(Sun) 21:55:06)

分類:[VB.NET/VB2005] 

大分調べましたが,分かりませんでした.
分かる方がいましたら,教えて下さい.

VB.netで開発しています.
Webbrowserコントロール上にPictureboxの背景を透過して配置したいです.
・Picturebox.BackColorをTransparentにする
・Pictureboxの親コントロールをWebbrowserにする
この2つの処理をしても,PictureboxにはFormのBackColorが(透過されて)見えています.

Webbrowserのみが目に見えていて,その上に見えないPictureboxが配置されているのが希望です.
下位レイヤー:Webbrowser,上位レイヤー:Pictureboxというイメージです.

ヒント,ご教授よろしくお願いします.



引用返信 編集キー/
■17582 / inTopicNo.2)  Re[1]: Pictureboxの透過
□投稿者/ やじゅ (326回)-(2008/04/27(Sun) 22:15:20)
やじゅ さんの Web サイト
No17579 (ハンマー さん) に返信
> Webbrowserのみが目に見えていて,その上に見えないPictureboxが配置されているのが希望です.
> 下位レイヤー:Webbrowser,上位レイヤー:Pictureboxというイメージです.
>

目的は何でしょう?
それによっては、違う方法も提案できますが。

引用返信 編集キー/
■17585 / inTopicNo.3)  Re[2]: Pictureboxの透過
□投稿者/ ハンマー (2回)-(2008/04/27(Sun) 22:29:10)
さっそくの返信ありがとうございます.

目的なのですが,Webbrowser上にお絵かきができることです.
(pictureboxではなくinkpictureでもいいですね^^;;)

よろしくお願いいたします.
引用返信 編集キー/
■17590 / inTopicNo.4)  Re[3]: Pictureboxの透過
□投稿者/ やじゅ (328回)-(2008/04/28(Mon) 01:03:06)
やじゅ さんの Web サイト
No17585 (ハンマー さん) に返信

> 目的なのですが,Webbrowser上にお絵かきができることです.
> (pictureboxではなくinkpictureでもいいですね^^;;)
>

私も試して見ましたが、透明になりませぬ(^^;

違う方法なのですが、別フォームを透明にして開いて
常にWebControlに位置が合うようにあわせる。

絵は重ねることは出来るのですが、イベントがWebControl側が
動作するので、例えばマウスとかリンク先を合わせると動作
してしまいますね。

お絵かきするとなると、そこらへんの制御が必要です。
http://shinshu.fm/MHz/88.44/archives/0000135548.html



引用返信 編集キー/
■17605 / inTopicNo.5)  Re[4]: Pictureboxの透過
□投稿者/ Azulean (89回)-(2008/04/28(Mon) 10:12:01)
> 私も試して見ましたが、透明になりませぬ(^^;
背景の透過は親のコントロールに対してのみ効果があるようです。
例えばForm_Paintで図形を描画する位置にTransparentなPictureBoxを配置すると、うまく透過します。
しかし、別のPictureBoxに図形を描画する位置の上にTransparentなPictureBoxを配置すると透過しません。
これはPictureBoxに限らず、Label等でも同様です。

解決策としてはやじゅさんが書かれている透明フォームかなと現状は考えます。
引用返信 編集キー/
■17608 / inTopicNo.6)  Re[5]: Pictureboxの透過
□投稿者/ やじゅ (329回)-(2008/04/28(Mon) 10:40:57)
No17605 (Azulean さん) に返信
>
> 解決策としてはやじゅさんが書かれている透明フォームかなと現状は考えます。
>

あと思いついたのは、WebControlの中身を画像としてキャプチャして、PictureBoxに転送
PictureBox同士ならなんとかなるような気がします。
引用返信 編集キー/
■17624 / inTopicNo.7)  Re[4]: Pictureboxの透過
□投稿者/ ハンマー (3回)-(2008/04/28(Mon) 15:13:41)
2008/04/28(Mon) 15:15:17 編集(投稿者)
2008/04/28(Mon) 15:15:11 編集(投稿者)

やじゅさん,Azuleanさんありがとうございます.

> 絵は重ねることは出来るのですが、イベントがWebControl側が
> 動作するので、例えばマウスとかリンク先を合わせると動作
> してしまいますね。
>
> お絵かきするとなると、そこらへんの制御が必要です。
> http://shinshu.fm/MHz/88.44/archives/0000135548.html

絵を重ねることはできました.ありがとうございます.
リンク先などをコントロールさせない手段として,Formを表示するときにShowDialogを使ってなど考えています.
(お絵かきモードと,ブラウジングモードは,何かしらの方法で切り換えられればよいので)
#後は,Browserの表示をキャプチャしてPictureboxのイメージに配置して透過しているかのように見せるかですね.

色々試してみて,有効な解決法がありましたら,報告いたします.
とりあえず「解決済み」にしておきますが,何かありましたらよろしくお願い致します.
解決済み
引用返信 編集キー/
■17666 / inTopicNo.8)  Re[5]: Pictureboxの透過
□投稿者/ H.K.R. (1回)-(2008/04/30(Wed) 00:24:08)
2008/04/30(Wed) 00:38:28 編集(投稿者)
2008/04/30(Wed) 00:33:53 編集(投稿者)

H.K.R.と申します。
 
> リンク先などをコントロールさせない手段として,Formを表示するときにShowDialogを使ってなど考えています.
System.Windows.Forms.Formのクライアント領域内に巨大な透明色の楕円を描画すると、
私の環境ではなぜか透明部分の背景に対してクリック等の操作ができなくなりました。
<追記> ↑すなわち、後ろ側のWebBrowserではなく、クライアント領域が透明になったFormがマウス入力を受け取る状態になる。 </追記>
詳しい理由は私にはわかりませんが、私の環境で上記の現象を発生させることのできたコードを掲載します。参考になれば幸いです。
 
※ 私が試した環境:WindowsXPHomeSP2(画面のプロパティの「デザイン」タブでWindowsXPスタイルが選択された状態)、
          VisualBasic2008ExpressEdition(対象Frameworkは、.NET Framework 2.0)
 
Public Class Program
  <STAThread()> _
  Public Shared Sub Main()
   Application.EnableVisualStyles()
   Application.SetCompatibleTextRenderingDefault(False)
  
   Application.Run(New MyForm)
  End Sub
End Class

' なぜか背景をクリックできないForm
Public Class MyForm
  Inherits Form
  Public Sub New()
   Me.BackColor = SystemColors.Control
   Me.TransparencyKey = SystemColors.Control
   Me.Text = "背景をクリックできないForm"
  End Sub
 
  Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
   Dim r0 As Rectangle = Me.ClientRectangle
   r0.Inflate(Me.Width, Me.Height)
   ' ↓巨大な透明色の楕円を描画すると、なぜか背景がクリックできなくなった。
   e.Graphics.FillEllipse(SystemBrushes.Control, r0)
  
   ' ↓コメントを解除すると模様を描画する。
   'Do While r0.Width >= 0 OrElse r0.Height >= 0
   ' r0.Inflate(-20, -20)
   ' e.Graphics.FillEllipse(Brushes.Blue, r0)
   ' r0.Inflate(-20, -20)
   ' e.Graphics.FillEllipse(SystemBrushes.Control, r0)
   'Loop
   MyBase.OnPaint(e)
  End Sub
 
End Class

引用返信 編集キー/
■17799 / inTopicNo.9)  Re[6]: Pictureboxの透過
□投稿者/ ハンマー (4回)-(2008/05/01(Thu) 21:57:53)
こんばんは

H.K.R.さん,情報ありがとうございます.
試してみたところ,楕円が描画されているところ(青部分)に関しては,Formがマウス入力を受け取る状態になって,
楕円が描画されていないところ(透明部分)に関しては,WebBrowserがマウス入力を受け取る状態になりました...

ちなみに,Formにお絵かきをしてみると,
ストロークの始点が描画部分(青の部分)であれば,ストローク中にWebBrowser(透明部分)を通っても,お絵かきはできています.
(つまり,初期始点(?)が透明部分でなければ,入力はFormが常に受け取る状態になっています)
逆に,ストロークの始点がWebBrowser(透明部分)であれば,筆記はできません.
入力をWebBrowserが受け取る状態になっています.

H.K.R.さんの表示フォームにお絵かきをしたら,どこでも,うまく筆記できますか??
お時間ありましたら,試していだけると嬉しいです.



引用返信 編集キー/
■17806 / inTopicNo.10)  Re[7]: Pictureboxの透過
□投稿者/ H.K.R. (2回)-(2008/05/01(Thu) 23:21:00)
H.K.R.と申します。

> 楕円が描画されていないところ(透明部分)に関しては,WebBrowserがマウス入力を受け取る状態になりました...
どうやら私の環境だけだったみたいですね・・・(泣  お役に立てませんでした。

私の環境では、なぜかGraphics.FillEllipse()メソッドで透明色の楕円を描画すると、当該透明色の楕円内をクリックしてもFormがマウス入力を受けとります。私の上記のプログラムで100%再現します。しかし、Graphics.FillRectangle()メソッドや、Graphics.FillRegion()メソッドで透明色の図形を描画した場合には、当該図形の透明部分をクリックすると後ろ側のWebBrowserがマウス入力を受け取ります(←これが正常な動作)・・・

> (つまり,初期始点(?)が透明部分でなければ,入力はFormが常に受け取る状態になっています)
おそらく、FormのCaptureプロパティがTrue(既定値はTrue)となっているためと思われます。マウスボタンを押下した状態でマウスカーソルを一度Formの外に移動させてから再度Form内に移動させた場合も、線が描画され続けると思います。

> H.K.R.さんの表示フォームにお絵かきをしたら,どこでも,うまく筆記できますか??
ほんの少ししかテストしていませんが、私の環境でもGraphics.FillEllipse()メソッドで透明色の楕円を描画することさえしなければ、ハンマーさんの環境と全く同じ動作になっているはずです。しかし、Graphics.FillEllipse()メソッドで透明色の楕円を描画すると、当該楕円領域内では、青色の部分と同様の動作となります(!)。例えば、青色と透明色の楕円が同心円状に並んだ箇所の透明部分をクリックした場合も、Formがマウス入力を受け取ります・・・。

とりあえず私が試したコードを掲載します。前回の私のコードのPublic Class MyForm内に追加してください。
Dim m_position As Point
Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
  m_position = Me.PointToClient(Cursor.Position)
  MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
  Using g As Graphics = Me.CreateGraphics
   If e.Button = Windows.Forms.MouseButtons.Left Then
    Dim p As Point = Me.PointToClient(Cursor.Position)
    g.DrawLine(Pens.Red, m_position, p)
    m_position = p
   End If
  End Using
  MyBase.OnMouseMove(e)
End Sub

引用返信 編集キー/
■17807 / inTopicNo.11)  Re[8]: Pictureboxの透過
□投稿者/ H.K.R. (3回)-(2008/05/01(Thu) 23:31:38)
私の直前の投稿におけるコードに修正があります。
(編集キーを入れ忘れていました)
 
とりあえず私が試したコードを掲載します。前回の私のコードのPublic Class MyForm内に追加してください。
Dim m_position As Point
' Protected Overrides Sub OnMouseDown()メソッドは不要
Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
  Using g As Graphics = Me.CreateGraphics
   If e.Button = Windows.Forms.MouseButtons.Left Then
    Dim p As Point = Me.PointToClient(Cursor.Position)
    g.DrawLine(Pens.Red, m_position, p)
    m_position = p
   Else
    m_position = Me.PointToClient(Cursor.Position)
   End If
  End Using
  MyBase.OnMouseMove(e)
End Sub
引用返信 編集キー/
■17809 / inTopicNo.12)  Re[9]: Pictureboxの透過
□投稿者/ やじゅ (340回)-(2008/05/02(Fri) 00:56:20)
やじゅ さんの Web サイト
2008/05/02(Fri) 09:05:02 編集(投稿者)

透明フォームも2つの方法があります。
Form1.TransparencyKey = System.Drawing.SystemColors.Control
Form1.Opactity = 0%

TransparencyKeyでは、透明な部分では下のコントロールが動作してしまいます。
Form1.Opactityでは、透明な部分でも下のコントロールが動作しません、が、描画しようが全て透明です。

この2つを組み合わせます。

WebControlの上に、Opactity=0%のフォーム、さらに上にTransparencyKeyによるフォーム
を重ねます。

試してはいないですが、いい感じになると思います。

追記:Opactity=0%のフォームのイベントを使って、TransparencyKeyフォームに描画する。
引用返信 編集キー/
■17812 / inTopicNo.13)  Re[10]: Pictureboxの透過
□投稿者/ H.K.R. (4回)-(2008/05/02(Fri) 02:09:11)
H.K.R.と申します。
 
やじゅ さん、ありがとうございます。
Opacityプロパティを0.01にすると、私の環境では上手く行きました。(画面の外観への影響はほとんどないようです)
# ただし、私の環境は前述の通り特殊な環境ですので・・・
 
Public Class WebBrowserAndForm
  Inherits WebBrowser
 
  Dim m_frm As New Form
  Dim WithEvents m_frmdummy As New Form
  Dim WithEvents m_parent As Form
 
  Public Sub New(ByVal parent As Form)
   m_parent = parent
   m_frmdummy.TransparencyKey = Color.Transparent
   m_frmdummy.Owner = m_parent
   m_frmdummy.Text = "これはダミー"
   m_frmdummy.Opacity = 0.01 ' Opacity = 0では上手くいかなかった。
 
   m_frm.Owner = m_parent
   m_frm.TransparencyKey = SystemColors.Control
   m_frm.Text = "画像描画用Form"
  End Sub
 
  ' このメソッドを外部から呼び出す
  Public Sub ShowForm()
   m_frmdummy.Show()
   m_frm.Show()
  End Sub
 
  Dim m_position As Point
  Private Sub m_frmdummy_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles m_frmdummy.MouseMove
   Using g As Graphics = m_frm.CreateGraphics
    If e.Button = Windows.Forms.MouseButtons.Left Then
     Dim p As Point = m_frmdummy.PointToClient(Cursor.Position)
     g.DrawLine(Pens.Red, m_position, p)
     m_position = p
    Else
     m_position = m_frmdummy.PointToClient(Cursor.Position)
    End If
   End Using
  End Sub
 
  Protected Overrides Sub OnLocationChanged(ByVal e As System.EventArgs)
   Me.m_parent_LocationChanged(Nothing, Nothing)
   MyBase.OnLocationChanged(e)
  End Sub
  Protected Overrides Sub OnSizeChanged(ByVal e As System.EventArgs)
   m_frm.Size = Me.Size
   m_frmdummy.Size = Me.Size
   MyBase.OnSizeChanged(e)
  End Sub
 
  Private Sub m_parent_LocationChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles m_parent.LocationChanged
   m_frm.Location = m_parent.PointToScreen(Me.Location)
   m_frmdummy.Location = m_parent.PointToScreen(Me.Location)
  End Sub
End Class

引用返信 編集キー/
■17817 / inTopicNo.14)  Re[10]: Pictureboxの透過
□投稿者/ やじゅ (341回)-(2008/05/02(Fri) 09:06:20)
2008/05/02(Fri) 09:08:34 編集(投稿者)

> Form1.Opactity = 0% → 0.01%の方がいいらしい
>

すばらしい、試して頂きありがとうございます。

引用返信 編集キー/
■17829 / inTopicNo.15)  Re[11]: Pictureboxの透過
□投稿者/ ハンマー (5回)-(2008/05/02(Fri) 11:14:04)
H.K.Rさん,やじゅさんありがとうございます.

やじゅさんのおっしゃった方法(2つのForm)で解決することができました!
H.K.Rさん,色々試していただいてありがとうございます.
Graphics.FillEllipse()の謎は環境の違いなのでしょうかね...?

成果をまとめておきます.

WebBrowserコントロール上に,DrawForm(Opacity=0.01)を配置して,そこにViewForm(BackColor,Transparencykey=Control)を重ねました.
ViewFormは,くりぬかれた状態なので,イベントはDrawFormが受け取ります.
イベントを受け取り,イベントから発生するお絵かきの描画はViewFormに行いました.
外観といい,無事に解決です.

ありがとうございました.
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -