- - PR -
TextBoxの背景を透明にする方法
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-04-10 11:11
初めて投稿します。よろしくお願いします。
VB.Netでアプリケーションを作成しているのですが、 TextBoxの背景色を透明にしたいのです。 TextBoxのサブクラスを作成し、コンストラクタで setStyle(ControlStyles.SupportsTransparentBackColor,true) を呼び出し、背景色に透過を設定できるようにして、 デザイン画面で、BackColorにTransparentを設定しているのですが、 背景色で白が使われて描画されてしまいます。 やはり、TextBoxはOS依存の描画処理をしているので、 透過色を利用することはできないのでしょうか? 解決策または、回避策がありましたらアドバイスよろしくお願いします。 |
|
投稿日時: 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プロパティを指定すればよいかと思います。 |
|
投稿日時: 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のメソッドじゃないかと思うのですが・・・。 |
|
投稿日時: 2003-04-10 13:46
よく見たらどこにもWebControlとは書いてありませんでした。
重ね重ね早とちり、すみません。 Windows.Formsということですと、 SetStyleでSupportsTransparentBackColorを指定する場合は、同時にUserPaintも指定する必要があります(ドキュメント参照)。 ただ、その場合ですと、OnPaintメソッドを自前で実装しないと望みどおりの動作はしないと思います(ぽっかり穴があく感じ)。 単に親コントロールと同じ背景色にするのであれば、 OnParentChanged(場合によってはOnParentBackColorChangedも)で、 BackColor = Parent.BackColor としてやればよいかと思います。 |
|
投稿日時: 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 |
|
投稿日時: 2003-04-11 13:00
karajanです。
そうですね。 ちょっと私にはわかりません。 テキストボックスの背景色を常に親コントロールの背景色と同じにしたい、というわけではないということですよね? う〜ん、、、わかりません。 |
|
投稿日時: 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-14 09:43
meiさんアドバイスありがとうございます。
ちょっとやってみたんですが、背景は透けませんでした。 WindowsXPだからですかねぇ〜。 やりたいことを具体的に言うとウィンドウの背景にImageを設定してそれをTextBoxから透けさせて見せたいんです。 なんか方法ですかねぇ〜 |