2011-02-05 2 views
7

как я могу сделать прозрачным поле richtext
Я хочу это, потому что я пытаюсь поместить текст поверх графического изображения (которое является фоном моей формы).transparent richTextBox

Вот почему я хотел RichTextBox быть прозрачным,
Я использую .NET, C# и в окне формы приложении

+1

Вам придется самому закодировать его (или найти того, кто уже это сделал), ничего не сделано для этого афаика. – ChristopheD

+1

Взгляните на эту возможную дублируемую запись - http://stackoverflow.com/questions/1716427/making-a-textbox-transparent – eandersson

+0

Что вы подразумеваете под кодом? Как так?? –

ответ

5

В управлении WinForms нет такой вещи, как истинная прозрачность. Прозрачный режим наследует фон по умолчанию его родителя. Способ, которым я работал в прошлом, состоял в том, чтобы использовать событие OnPaint, а затем использовать метод Graphics.DrawString для размещения текста, в котором я его хочу.

0

Там нет никакого способа, чтобы иметь элементы управления Windows Forms с прозрачным фоном. Многие уже пробовали это, и все потерпели неудачу. Некоторые придумали экзотические хаки, но все они не справляются с некоторыми деталями. Используйте WPF или HTML, если вам нужны более продвинутые возможности визуализации, чем могут предложить старые Windows Forms.

+1

Это неверно. Это возможно, особенно при работе с графической библиотекой. Хотя все Winforms являются GDI + или растровыми (по существу), «прозрачность» определенно возможна, просто устанавливая прозрачность, а затем отменяя фоновый рисунок. К сожалению, так работает вся прозрачность 2D (даже поддельные 3D-рендеринги), фон рисован или не нарисован, но когда он не нарисован, вы заметите, что это цвет «маска» с инструкциями в заголовке файла, что делать с ними - см. спецификации прозрачности PNG для более глубокого понимания применяемых трюков. WPF не является исключением. –

7

Я знаю, что этот ответ очень поздний, но я надеюсь, что это поможет другим, кто хотел бы, чтобы это было сделано легко.

Сначала создайте новый пользовательский элемент управления в своем проекте и укажите ему имя, скажем CustomRTB.cs. После этого откройте частичный класс и изменения:

public partial class CustomRTB : UserControl 

к:

public partial class CustomRTB : RichTextBox 

Это вызовет ошибку при открытии файла Design так просто перейти к файлу designer.cs и удалить/комментарий линии, которые показывают ошибки (там будет не более двух строк с ошибками). Затем добавьте следующее к частичному классу:

protected override CreateParams CreateParams 
{ 
    get 
    { 
     //This makes the control's background transparent 
     CreateParams CP = base.CreateParams; 
     CP.ExStyle |= 0x20; 
     return CP; 
    } 
} 

Класс должен выглядеть, как это сейчас:

public partial class CustomRTB : RichTextBox 
{ 
    public CustomRTB() 
    { 
     InitializeComponent(); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      //This makes the control's background transparent 
      CreateParams CP = base.CreateParams; 
      CP.ExStyle |= 0x20; 
      return CP; 
     } 
    } 
} 

Теперь создать решение, и вы будете иметь возможность использовать контроль в своих формах. Этот элемент управления будет полностью прозрачным, и вы не сможете настроить прозрачность. Вы также сможете создавать различные прозрачные элементы управления помимо richtextbox, изменяя первую строку в этом коде. Надеюсь, что это помогает :)

Edit:

Проблема с выше контроля является то, что она может быть использована только для отображения текста программно, как это проблематично изменить во время работы или отладки приложения (как @nevelis объясняется в комментарии ниже). Однако есть простой способ:

Сначала создайте в своем проекте другой элемент управления пользователя и назовите его TranslucentPanel.cs (Да, это панель, и она будет полупрозрачной, непрозрачность которой может управляться программно) , Теперь откройте частичный класс и изменить его, как:

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

Вы должны позаботиться о том, что ошибка выплывает при создании проекта, просто закомментировать строку в файле designer.cs, который бросает его.После этого снова создайте проект, и прозрачная панель появится в панели инструментов, как и раньше. Используйте эту панель в качестве родительского элемента управления для прозрачного richtextbox, то есть поместите панель в свою форму и поместите RTB внутри нее. Вы также можете установить свойство BorderStyle как None, чтобы удалить следы RTB из пользовательского интерфейса.

Вы также можете контролировать прозрачность полупрозрачной панели, используя его свойство BackColor в программе:

translucentPanel1.BackColor = Color.FromArgb(50, 0, 0, 0); 

Изменение аргументов, переданных выше позволит вам контролировать прозрачность и цвет панели.

Это обходное решение решит проблемы с курсором и прокруткой не только прозрачного RTB, но и любого другого прозрачного элемента управления, который вы создаете.

+1

Это не очень хорошо работает при прокрутке или редактировании. 0x20 или WS_EX_TRANSPARENT, означает, что элемент управления не перерисовывается, если его родительское окно не будет окрашено. Если вы наберете, курсор останется слева после каждого символа, и если вы прокрутите его, он превратится в размытый беспорядок :( – nevelis

+0

@nevelis Я отредактировал свой ответ, чтобы включить обходной путь для этой проблемы. Скажите, поможет ли это вам :) –

+0

Oh черт возьми, вы легенда: DI не проверял это с помощью богатого текстового поля, но редактирование именно то, что мне нужно, чтобы остановить настраиваемый прозрачный индикатор выполнения от мерцания: D: D: D вы сделали мой день. Я подойду к тестированию вещи RichTextBox немного и дам вам знать! – nevelis