2013-02-16 2 views
4

Так что, пытаясь ненадолго, я в конечном итоге решил спросить о способе сделать прозрачные элементы управления отображением друг друга.Управление для контроля прозрачности

enter image description here

Как вы видите на картинке у меня есть 2 прозрачные коробки изображения, они показывают фон очень хорошо, но когда дело доходит до выбранного PictureBox, как вы можете видеть на картинке он делает только фоновое изображение форма, но не другая рамка изображения под ней. Я знаю, что в winforms есть общие обстоятельства из-за отсутствия надлежащего рендеринга, но возникает вопрос:

Есть ли способ обойти эту ошибку рендеринга, есть ли способ сделать прозрачные элементы управления рендерингом друг друга?

Ну это Ответ: Transparent images with C# WinForms

ответ

2

прозрачность управления зависит от его родительского контроля .Вы может, однако, использовать пользовательский элемент управления контейнера вместо коробки изображения для родительского image.and может быть, этот код usfull

using System; 
using System.Windows.Forms; 
using System.Drawing; 

public class TransparentControl : Control 
{ 
    private readonly Timer refresher; 
    private Image _image; 

    public TransparentControl() 
    { 
     SetStyle(ControlStyles.SupportsTransparentBackColor, true); 
     BackColor = Color.Transparent; 
     refresher = new Timer(); 
     refresher.Tick += TimerOnTick; 
     refresher.Interval = 50; 
     refresher.Enabled = true; 
     refresher.Start(); 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams cp = base.CreateParams; 
      cp.ExStyle |= 0x20; 
      return cp; 
     } 
    } 

    protected override void OnMove(EventArgs e) 
    { 
     RecreateHandle(); 
    } 


    protected override void OnPaint(PaintEventArgs e) 
    { 
     if (_image != null) 
     { 
      e.Graphics.DrawImage(_image, (Width/2) - (_image.Width/2), (Height/2) - (_image.Height/2)); 
     } 
    } 

    protected override void OnPaintBackground(PaintEventArgs e) 
    { 
     //Do not paint background 
    } 

    //Hack 
    public void Redraw() 
    { 
     RecreateHandle(); 
    } 

    private void TimerOnTick(object source, EventArgs e) 
    { 
     RecreateHandle(); 
     refresher.Stop(); 
    } 

    public Image Image 
    { 
     get 
     { 
      return _image; 
     } 
     set 
     { 
      _image = value; 
      RecreateHandle(); 
     } 
    } 
} 
+0

К сожалению, это не дает ожидаемому результату никаких других идей? –

+0

http://stackoverflow.com/questions/11412169/is-it-possible-to-have-two-overlapping-picturebox-controls-with-transparent-imag –

+0

благодарит Shahrooz за вашу приятную помощь. –

Смежные вопросы