- PR -

TextBoxの背景を透明にする方法

投稿者投稿内容
たけちゃん
会議室デビュー日: 2003/04/10
投稿数: 6
お住まい・勤務地: 埼玉在住 勤務地東京
投稿日時: 2003-04-10 11:11
初めて投稿します。よろしくお願いします。

VB.Netでアプリケーションを作成しているのですが、
TextBoxの背景色を透明にしたいのです。

TextBoxのサブクラスを作成し、コンストラクタで

setStyle(ControlStyles.SupportsTransparentBackColor,true)
を呼び出し、背景色に透過を設定できるようにして、

デザイン画面で、BackColorにTransparentを設定しているのですが、
背景色で白が使われて描画されてしまいます。

やはり、TextBoxはOS依存の描画処理をしているので、
透過色を利用することはできないのでしょうか?

解決策または、回避策がありましたらアドバイスよろしくお願いします。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2003-04-10 12:35
karajanです。

<html>
<head><title></title></head>
<body bgcolor="red">
<input style="background-color:transparent" type="text" value="hello">
</body>
</html>

上記のページではTextBoxの背景は透明(この場合は赤色)になります。
ASPXでもコントロールのCSSプロパティを指定すればよいかと思います。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2003-04-10 12:51
サブクラスを作ってそのコンストラクタということですね。
失礼しました。

public class MyTextBox:System.Web.UI.WebControls.TextBox
{
public MyTextBox()
{
this.BackColor = System.Drawing.Color.Transparent;
}
}

特に問題なく動作します。
WebControlは最終的にはHTMLになりますので、OS依存というよりはブラウザ依存になります。

念のため確認なのですが、WebControlのTextBoxを継承しているということでよろしいでしょうか?

SetStyleってWindows.Forms.Controlのメソッドじゃないかと思うのですが・・・。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2003-04-10 13:46
よく見たらどこにもWebControlとは書いてありませんでした。
重ね重ね早とちり、すみません。

Windows.Formsということですと、

SetStyleでSupportsTransparentBackColorを指定する場合は、同時にUserPaintも指定する必要があります(ドキュメント参照)。

ただ、その場合ですと、OnPaintメソッドを自前で実装しないと望みどおりの動作はしないと思います(ぽっかり穴があく感じ)。

単に親コントロールと同じ背景色にするのであれば、
OnParentChanged(場合によってはOnParentBackColorChangedも)で、
BackColor = Parent.BackColor
としてやればよいかと思います。


たけちゃん
会議室デビュー日: 2003/04/10
投稿数: 6
お住まい・勤務地: 埼玉在住 勤務地東京
投稿日時: 2003-04-11 11:33
返信ありがとうございます。

すいません、説明不足で勘違いさせてしまいました。
VB.NetでWindowsアプリケーションを作っています。

karajanさんのいうとおり、UserPaintを指定すると、OnPaintメソッドが
呼ばれるので、自力実装で解決できるかもしれないですね。

…ただ、TextBoxにフォーカスが移ったときにOS依存の部分が呼ばれているらしく
OnPaintが呼び出されないんです。

さらに透明色で背景が描画されません。
UserPaintにしても自力実装しなければ、透明色では表示されないということでしょうか?

以下のようにプログラムを書いたのですが、これでもTransparentで描画されないのです。
やっぱり、無理なんですかねぇ。。。

Public Class TransparentSupportTextBox
Inherits System.Windows.Forms.TextBox

#Region " コンポーネント デザイナで生成されたコード "

Public Sub New()
MyBase.New()
' この呼び出しは、コンポーネント デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
'コントロールへの透明な背景の適用
Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)
'OnPaintを呼び出すように明示的に指定
Me.SetStyle(ControlStyles.UserPaint, True)
End Sub

#End Region

Private baseBackground As Brush = Nothing
Private rectPaint As Rectangle
Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)
'MyBase.OnPaint(pe)
If baseBackground Is Nothing Then
baseBackground = New SolidBrush(Color.Transparent)
End If
rectPaint = New Rectangle(0, 0, Me.Width, Me.Height)
pe.Graphics.FillRectangle(baseBackground, rectPaint)
End Sub

End Class
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2003-04-11 13:00
karajanです。

そうですね。
ちょっと私にはわかりません。

テキストボックスの背景色を常に親コントロールの背景色と同じにしたい、というわけではないということですよね?

う〜ん、、、わかりません。



mei
大ベテラン
会議室デビュー日: 2003/04/08
投稿数: 114
投稿日時: 2003-04-11 22:18
こんばんは、meiです。

ひょっとしてこんな感じでしょうか?
外していたら、ごめんなさい。

#あと、win2k系じゃないと駄目です・・・


-- 以下、ソースコードまるごと

Public Class Form1
Inherits System.Windows.Forms.Form

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

Public Sub New()
MyBase.New()

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。

End Sub

' Form は dispose をオーバーライドしてコンポーネント一覧を消去します。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer

' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
' Windows フォーム デザイナを使って変更してください。
' コード エディタは使用しないでください。
Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.TextBox1 = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
'TextBox1
'
Me.TextBox1.Anchor = (((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _
Or System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right)
Me.TextBox1.Location = New System.Drawing.Point(8, 8)
Me.TextBox1.Multiline = True
Me.TextBox1.Name = "TextBox1"
Me.TextBox1.Size = New System.Drawing.Size(272, 256)
Me.TextBox1.TabIndex = 0
Me.TextBox1.Text = "TextBox1"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(288, 273)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox1})
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)

End Sub

#End Region

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.TransparencyKey = TextBox1.BackColor
End Sub
End Class

-- ここまで
たけちゃん
会議室デビュー日: 2003/04/10
投稿数: 6
お住まい・勤務地: 埼玉在住 勤務地東京
投稿日時: 2003-04-14 09:43
meiさんアドバイスありがとうございます。

ちょっとやってみたんですが、背景は透けませんでした。
WindowsXPだからですかねぇ〜。

やりたいことを具体的に言うとウィンドウの背景にImageを設定してそれをTextBoxから透けさせて見せたいんです。
なんか方法ですかねぇ〜

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