- PR -

コントロールの背景を透明にする方法

投稿者投稿内容
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-10-19 23:57
「透明」の定義に問題があるのでしょう。しかも、
「コントロールがオーバーラップしたときの透明とは?」に、
ユーザー側の期待と実装側の技術上の問題(特にパフォーマンスコスト)
の乖離が見られます。

MSDN Product Feedback Center
http://lab.msdn.microsoft.com/productfeedback/SearchResults.aspx?text=Transparency&stype=1&fields=1&type=0&witId=0&pId=0&category=0&os=0&oslang=0&status=0&msstatus=0&resolution=0&chgdays=&validation=0&votes=&voterating=0&workarounds=False&attachments=False
_________________
IEEE-CSDP 2004-2007
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-20 00:12
引用:

「透明」の定義に問題があるのでしょう。しかも、
「コントロールがオーバーラップしたときの透明とは?」に、
ユーザー側の期待と実装側の技術上の問題(特にパフォーマンスコスト)
の乖離が見られます。



えーと、この記事かな?

http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=7b0ee12d-e443-4ecf-b3f5-361167470c39

引用:

Description: Opened by PascalLeBeta on 2005-06-05 at 11:13:48

When setting a label as transparent, its background color is not transparent but takes the form's background color.

Edited by Microsoft on 2005-06-06 at 21:38:05

The Microsoft Sub-status is now "Reproduced"

Thanks for reporting this bug, we have been able to repro this issue and are investigating.

Thank you,
Vivek, VS2005 Product Team.




直るのを期待せずに待つべきでしょうか??
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-20 00:28
iStationさんへ。

なんだか、こっちの難しそうなほうが先に実装されるかもしれません。

http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=d38cb40e-d5e7-4c37-a741-e2137a88fa99

引用:

Opened by mjoya on 2004-12-27 at 08:09:47

No TransparencyKey and Opacity for Controls and UserControls. This is very useful when creating games and great UIs.

Edited by Microsoft on 2004-12-27 at 11:33:14

Thank you for submitting the suggestion. We will review the suggestion and keep you informed.

.Net Client QA Team

Resolved as By Design by Microsoft on 2004-12-27 at 14:08:11

Hey there -

You can actually achieve at least some of the effect you're looking for by using the Web "transparency" faux-color on, say, your user-control. This doesn't work across the board for all controls, however. For a variety of reasons (mostly performance), we likely won't be adding the Opacity and TransparencyKey properties to any other controls than Form.

Hope this helps,
-Jeff



なんにもしない。ただそれだけ。。。。が、なんで難しいんだろう???
不思議。

ごめんなさい。愚痴みたいになってしまいましたね。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-10-20 23:29
例えば、下記によるとTextBox/RichTextBoxなどのコントロールは、.NETによるWin32-EditBoxのWrapで、透明化に対応するリスクが高いようです。
Support Transparent BackColor for RichTextBoxes and TextBoxes - MSDN Product Feedback Center
http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=a79072f6-a77a-4b49-b737-696a52cd2be7

次の例では、RichTextBoxを透明化する例(CodeProject)を挙げて、MSに修正を求めていますが、MSもなかなか頑固です。
Transparent Text Boxes & richtextboxes - MSDN Product Feedback Center
http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=f429908a-748a-4978-925f-835b184b78c8

ちなみに、参照されているコード例ではちゃんとRichTextBoxの背景が透明化され、コントロールのオーバーラップにも対応できています。
AlphaBlendTextBox - A transparent/translucent textbox for .NET - The Code Project - C# Controls
http://www.codeproject.com/cs/miscctrl/alphablendtextbox.asp

MSが頑固にも先送りするのは、やはり描画パフォーマンスが問題なのでしょう(背景の透明化、コントロールのフォアグランド描画、そして他のコントロールのオーバーラップを両立するのはパフォーマンスコストが高い。)

ところで、ジブさんの「Regionを設定するということで解決する方法」が少し気になるのですが、差し支えなければ参考に教えてもらえないでしょうか?
_________________
IEEE-CSDP 2004-2007
cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2005-10-21 10:39
「ユーザコントロールを透明にする」ではないですが、Formならば透明にできます。
以前、子供のゲームで福笑いを作ったときに、コントロールではなくFormを貼って実現しました。参考になれば。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-21 21:20
引用:

iStationさんの書き込み (2005-10-20 23:29) より:

例えば、下記によるとTextBox/RichTextBoxなどのコントロールは、.NETによるWin32-EditBoxのWrapで、透明化に対応するリスクが高いようです。

(略)

MSが頑固にも先送りするのは、やはり描画パフォーマンスが問題なのでしょう(背景の透明化、コントロールのフォアグランド描画、そして他のコントロールのオーバーラップを両立するのはパフォーマンスコストが高い。)



動的に変化するケースだと難しいということなのでしょうか?

引用:

ところで、ジブさんの「Regionを設定するということで解決する方法」が少し気になるのですが、差し支えなければ参考に教えてもらえないでしょうか?



簡単なサンプルを作ってみました。(こんな使い方はしてないんですが、わかりやすそうな例として)

コード:
Public Class UserControl1
    Inherits System.Windows.Forms.UserControl

#Region " Windows フォーム デザイナで生成されたコード "
(略)
#End Region

    Private _path As System.Drawing.drawing2d.GraphicsPath
    Private _textBrush As Brush

    Private _Caption As String = "透明?"
    Private _font As Font

    Private Sub UserControl1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _font = New Font("MS ゴシック", 40)
        _textBrush = New SolidBrush(MyBase.ForeColor)
        SetRegion()
    End Sub

    Private Sub SetRegion()
        _path = New System.Drawing.drawing2d.GraphicsPath(Drawing2D.FillMode.Winding)
        _path.AddString(_Caption, _font.FontFamily, _font.Style, _font.Height, New Point(0, 0), StringFormat.GenericDefault)
        MyBase.Region = New System.Drawing.Region(_path)
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        e.Graphics.FillPath(_textBrush, _path)
    End Sub


End Class



ちなみにフォントサイズを小さくすると汚いです。

えーと。悪い例をサンプルにしちゃいました。
透明なラベルみたいなのはちょっと無理かもしれません。

三角とか楕円とかGraphicsPath.AddXXXXXできるものならなんでもOKなんで
普通に使う分には役立つと思います。

引用:

Formならば透明にできます。



Catsさん。ありがとうございます。たぶん同じやり方かも。

インテリセンス?にひっかからなかったので気づきにくかったです。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-10-21 22:31
えーと、追加です。

引用:

ちなみに、参照されているコード例ではちゃんとRichTextBoxの背景が透明化され、コントロールのオーバーラップにも対応できています。
AlphaBlendTextBox - A transparent/translucent textbox for .NET - The Code Project - C# Controls
http://www.codeproject.com/cs/miscctrl/alphablendtextbox.asp



コードを見てみましたが、どうやら背景(コンテナ)のビットマップを取得して書いているだけですね。
alphaBlendTextBox1,2と背景の間にPanelとかをはさんでみてみてください。


マイクロのTransParencyKeyを使ったフォームの透明化はちゃんとやっているみたいです。
後ろにあるフォームを動かしてもちゃんと透明になっている。



[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-21 22:39 ]

[ メッセージ編集済み 編集者: ジブ 編集日時 2005-10-21 23:15 ]
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2005-10-22 18:02
Regionのサンプル有難うございました。
引用:

ジブさんの書き込み (2005-10-09 20:07) より:
...
簡単にいえばすべて自分でお絵描きするから、箱の中のクリックイベントだけ拾ってくれればいいよ。
というようなコントロールはどこかにないものでしょうか?


当初の課題はRegionで解決できましたか?

引用:

...
コードを見てみましたが、どうやら背景(コンテナ)のビットマップを取得して書いているだけですね。
alphaBlendTextBox1,2と背景の間にPanelとかをはさんでみてみてください。


alphaBlendTextBoxのコードを使うと背景が透明化され、またコントロールのオーバーラップに対応できます。
Panelは操作を誤ると該当TextBoxがPanel内部に取り込まれる(Addされる)恐れがありますので注意ください。
PanelにAddされた場合は一度取り出し、該当TextBoxが部分的にPanelに重なるように配置してみてください。
その際に該当TextBoxのZ-orderが最前面になるように設定してください。
_________________
IEEE-CSDP 2004-2007

[ メッセージ編集済み 編集者: iStation 編集日時 2005-10-22 18:06 ]

スキルアップ/キャリアアップ(JOB@IT)