web-dev-qa-db-ja.com

Windowsフォームテキストボックスの透明性

C#でWindowsフォームを使用していますが、テキストボックスの背景色を透明にする必要があります。 0から255までのトラックバーがあり、それを制御するはずですが、問題があります。今日、まったく同じことを尋ねる質問を作成しましたが、成功しませんでした。

私が現在持っているコードは次のとおりです。

_private void trackAlpha_ValueChanged(object sender, EventArgs e)
{
    newColor = Color.FromArgb(trackAlpha.Value, colorDialog.Color.R, colorDialog.Color.G, colorDialog.Color.B);
    colorDialog.Color = newColor; // The Windows dialog used to pick the colors
    colorPreview.BackColor = newColor; // Textbox that I'm setting the background color
}
_

問題は、まったく何も起こらないことです。これが機能しない理由についてのアイデアはありますか?

前の質問で、このナイスガイはSetStyle(ControlStyles.SupportsTransparentBackColor, true);について何か言いましたが、これをどこに置けばいいのか分かりません。

15
P1C Unrelated

このようなものを試す必要があります。

新しいユーザーコントロールを追加し、たとえばCustomTextBoxと変更

public partial class CustomTextBox : UserControl

public partial class CustomTextBox : TextBox

次に、「AutoScaleMode」が定義されていないという次のエラーが表示されます。 Designer.csクラスの次の行を削除します。

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

次のように、新しく追加したコントロールのコンストラクターを変更します。

public partial class CustomTextBox : TextBox
{
    public CustomTextBox()
    {
        InitializeComponent();
        SetStyle(ControlStyles.SupportsTransparentBackColor |
                 ControlStyles.OptimizedDoubleBuffer |
                 ControlStyles.AllPaintingInWmPaint |
                 ControlStyles.ResizeRedraw |
                 ControlStyles.UserPaint, true);
        BackColor = Color.Transparent;
    }
}

ビルドし、開いている場合はカスタムコントロールデザイナーを閉じます。他のコントロールまたはフォームでこのコントロールを使用できます。

以下に示すようにツールボックスからドロップします enter image description here

16
Patrick D'Souza

このために、独自の継承コントロールを作成する必要がありませんでした。そこで、プライベートSetStyle関数のラッパー関数を作成しました。

独自のクラスを作成する代わりに使用してみてください?

_public static bool SetStyle(Control c, ControlStyles Style, bool value)
{
    bool retval = false;
    Type typeTB = typeof(Control);
    System.Reflection.MethodInfo misSetStyle = typeTB.GetMethod("SetStyle", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    if (misSetStyle != null && c != null) { misSetStyle.Invoke(c, new object[] { Style, value }); retval = true; }
    return retval;
}
_

bool itWorked = SetStyle(myControl, ControlStyles.SupportsTransparentBackColor, true);

5
Plater

TextBoxから継承する新しいコントロールを作成し、コンストラクターで透過性を許可するようにスタイルを設定します。次に、TextBoxの代わりに新しいコントロールを使用します

コンストラクタでこれを行います:

this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

これにより、新しいコントロールの背景色が透明になります。

コントロールスタイルの詳細については、こちらをご覧ください。 MSDN:Control Styles 、これも役立ちます。 Visual C#を使用したWindowsフォームコントロールからの継承

5
madbrendon

古い投稿を見つけて申し訳ありませんが、テキストボックスの透明性がないというこの恐ろしい問題の解決策を見つけるために数日探しています! (MSAccessには透明性を示すチェック状態があります!)

とにかく、私はVB回避策を構築しましたが、それは非常に粗雑であり、多くの人々が洞察力を備えたよりハードコアな人からの入力も好むかもしれません。 。

基本的にテキストボックスを使用し、サイズを変更してラベルに置き換えます(したがって、透明な「表示」テキストボックスを表します。1行のテキストボックスでEnterキーを押した場合のビープ音の停止など、他にもいくつかあります。

使用するには-新しいクラスを作成し、すべてのコードを上に貼り付けます。これにより、2つのカスタムオブジェクト(CTextBoxとCLabel)が作成されます。フォームデザインでCTEXTBOXを使用するだけです。

あなたの言語であればCに簡単に変換できますが、何か提案があれば教えてください。

Imports System.ComponentModel

Public Class CTextBox
Inherits TextBox
Dim _zUseEnterAsTab As Boolean = True
Dim _zUseTransparent As Boolean = False
Dim _zUseTransparentColor As Color = Color.Transparent
Dim _zUseTransparentBorderColor As Color = Color.Gray
<Description("Use the Enter Key as Tab (Stops Beeps) only for Single line TextBox"), Category("CTextBox")> _
Public Property zUseEnterAsTab() As Boolean
    Get
        Return _zUseEnterAsTab
    End Get
    Set(value As Boolean)
        _zUseEnterAsTab = value
        Me.Invalidate()
    End Set
End Property
<Description("Use Transparent TextBox"), Category("CTextBox")> _
    Public Property zUseTransparent() As Boolean
    Get
        Return _zUseTransparent
    End Get
    Set(value As Boolean)
        _zUseTransparent = value
        Me.Invalidate()
    End Set
End Property
<Description("Change the transparency to ANY color or shade or Alpha"), Category("CTextBox")> _
Public Property zUseTransparentColor() As Color
    Get
        Return _zUseTransparentColor
    End Get
    Set(value As Color)
        _zUseTransparentColor = value
        Me.Invalidate()
    End Set
End Property
<Description("Border color of the texbox when transparency used"), Category("CTextBox")> _
    Public Property zUseTransparentBorderColor() As Color
    Get
        Return _zUseTransparentBorderColor
    End Get
    Set(value As Color)
        _zUseTransparentBorderColor = value
        Me.Invalidate()
    End Set
End Property
Protected Overrides Sub OnCreateControl()
    'Again for my benifit - there may be other ways to force the transparency 
    'code at form / event startup, but this is the way i chose, any advice
    'or alternatives would be great!! :)
    If Not DesignMode Then
        'Basically don't do in design mode!
        If _zUseTransparent Then
            'Added to handle the event of textbox dissabled
            If Me.Enabled Then
                CreateMyLabel(Me)
                MakeLabelVisible(foundLabel, Me)
            End If
        End If
    End If
    MyBase.OnCreateControl()
End Sub
Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
    If MyBase.Multiline = True Then
        MyBase.OnKeyPress(e)
    Else
        If e.KeyChar = Chr(Keys.Enter) Then
            e.Handled = True
            If zUseEnterAsTab = True Then SendKeys.Send("{tab}")
            MyBase.OnKeyPress(e)
        End If
    End If
End Sub
Protected Overrides Sub OnLeave(e As EventArgs)
    If _zUseTransparent Then
        CreateMyLabel(Me)
        MakeLabelVisible(foundLabel, Me)
    End If
    MyBase.OnLeave(e)
End Sub
Protected Overrides Sub OnEnter(e As EventArgs)
    If _zUseTransparent Then
        CreateMyLabel(Me)
        MakeTextBoxVisible(foundLabel, Me)
    End If
    MyBase.OnEnter(e)
End Sub
Dim foundLabel As CLabel = Nothing
Sub CreateMyLabel(_TxtBox As CTextBox)
    foundLabel = Nothing
    Dim l As CLabel
    If GetMyLabel("L_" & Me.Name, Me) Then
        l = foundLabel
        If Not l.Name = "L_" & Me.Name Then
            MsgBox("L_" & Me.Name)
        End If
        l.Font = _TxtBox.Font
        l.Text = _TxtBox.Text
        l.BorderColor = _zUseTransparentBorderColor
        l.BackColor = _zUseTransparentColor
        l.BorderStyle = Windows.Forms.BorderStyle.None 'Handled by Paint event
    Else
        l = New CLabel
        l.Name = "L_" & _TxtBox.Name
        l.BorderColor = _zUseTransparentBorderColor
        l.BackColor = _zUseTransparentColor
        l.Size = _TxtBox.Size
        l.BorderStyle = Windows.Forms.BorderStyle.None 'Handled by Paint event
        l.AutoSize = False
        l.Font = _TxtBox.Font
        l.Location = _TxtBox.Location
        l.Text = _TxtBox.Text
        l.Anchor = _TxtBox.Anchor
        _TxtBox.Parent.Controls.Add(l)
        foundLabel = l
    End If
End Sub
Function GetMyLabel(_LabelName As String, _TxtBox As CTextBox) As Boolean
    For Each ctl As Control In _TxtBox.Parent.Controls
        If ctl.Name = _LabelName Then
            foundLabel = ctl
            Return True
        End If
    Next
    Return False
End Function
Private Sub MakeLabelVisible(_Label As CLabel, _TxtBox As CTextBox)
    _Label.Location = _TxtBox.Location
    _Label.Anchor = _TxtBox.Anchor
    _Label.Size = _TxtBox.Size
    _TxtBox.Size = New Size(0, 0)
    _TxtBox.Anchor = AnchorStyles.None
End Sub
Private Sub MakeTextBoxVisible(_Label As CLabel, _TxtBox As CTextBox)
    _TxtBox.Location = _Label.Location
    _TxtBox.Anchor = _Label.Anchor
    _TxtBox.Size = _Label.Size
    _Label.Size = New Size(0, 0)
    _Label.Anchor = AnchorStyles.None
End Sub
End Class

Public Class CLabel
Inherits Label
Public BorderColor As Color = Color.Gray
Sub New()
    MyBase.FlatStyle = Windows.Forms.FlatStyle.Standard
    'Added padding as labels shifted text upwards
    'NOT tested on all fonts etc, purely for my sources
    MyBase.Padding = New Padding(0, 3, 0, 0)
End Sub
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
    Dim _TxtBox As CTextBox = Nothing
    Dim _TxtBoxName As String = Microsoft.VisualBasic.Right(Me.Name, Len(Me.Name) - 2)
    For Each elem As Control In Me.Parent.Controls
        If elem.Name = _TxtBoxName Then
            _TxtBox = elem
            Exit For
        End If
    Next
    _TxtBox.Select()
    MyBase.OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseEnter(e As EventArgs)
    Cursor = Cursors.IBeam
    MyBase.OnMouseEnter(e)
End Sub
Protected Overrides Sub OnMouseLeave(e As EventArgs)
    Cursor = Cursors.Default
    MyBase.OnMouseLeave(e)
End Sub
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    MyBase.OnPaint(e)
    ControlPaint.DrawBorder(e.Graphics, Me.DisplayRectangle, Color.Gray, ButtonBorderStyle.Solid)
End Sub
Private Sub MakeLabelVisible(_Label As CLabel, _TxtBox As CTextBox)
    _Label.Size = _TxtBox.Size
    _TxtBox.Size = New Size(0, 0)
    _Label.Anchor = _TxtBox.Anchor
    _TxtBox.Anchor = AnchorStyles.None
End Sub
Private Sub MakeTextBoxVisible(_Label As CLabel, _TxtBox As CTextBox)
    _TxtBox.Size = _Label.Size
    _Label.Size = New Size(0, 0)
    _TxtBox.Anchor = _Label.Anchor
    _TxtBox.Anchor = AnchorStyles.None
End Sub
End Class
0
Chicken