非重叠透明控制 [英] Non-overlapped transparent control

查看:39
本文介绍了非重叠透明控制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的视频播放器制作工具提示.我在 c# (AxWMPLib.AxWindowsMediaPlayer) 上使用嵌入到我的 winform 应用程序中的 Windows 媒体播放器来播放视频.我创建了一个显示媒体当前位置的控件.这种控制是透明的.控件代码如下:

I'm trying to make a tooltip for my video player. I use a windows media player embedded into my winform's app on c# (AxWMPLib.AxWindowsMediaPlayer) for playing video. And I have created a control that shows a current position of a media. This control is transparent. Control's code is below:

namespace player.Controls
{
public partial class TransparentToolTip : System.Windows.Forms.UserControl
{
    public enum PointerLocation : byte { ... }

    #region Private data
     // ...
    #endregion

    Timer Wriggler = new Timer();
    int iInterval = 100;
    protected void TickHandler(object sender, EventArgs e)
    {
        this.InvalidateEx();
    } 

    private void _SetStyle()
    {
        this.SetStyle((ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.CacheText | ControlStyles.ContainerControl), true);
        this.SetStyle(ControlStyles.Selectable, false);
        this.SetStyle(ControlStyles.SupportsTransparentBackColor | ControlStyles.Opaque, true);            
        this.UpdateStyles();
    }
    private void _SetTimer(int _Interval)
    {
        Wriggler.Tick += new EventHandler(TickHandler);
        this.Wriggler.Interval = _Interval;
        this.Wriggler.Enabled = true;
    }    

    public TransparentToolTip()
    {            
        InitializeComponent();
        _SetStyle();
        _SetTimer(iInterval);                    
    }
    public TransparentToolTip(System.ComponentModel.IContainer container)
    {               
        container.Add(this);             
        InitializeComponent();            
        _SetStyle();
        _SetTimer(iInterval); 
    }        

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= (0x00000020 | 0x00000008); // WS_EX_TRANSPARENT  = 0x00000020, WS_EX_TOPMOST = 0x00000008              
            return cp;
        }
    }
    #region Extra Properties
    // ...
    #endregion

    // Drawing            
    protected void InvalidateEx()
    {
        if (Parent == null)
            return;
        Rectangle rc = new Rectangle(this.Location, this.Size);
        Parent.Invalidate(rc, true);
    }
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {

    }
    protected override void OnPaint(PaintEventArgs pe)
    {           
        pe.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        pe.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        pe.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        pe.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;

        Rectangle rect = new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - 1, this.ClientRectangle.Height - 1);            
        SolidBrush brushBackground = new SolidBrush(ColorBackground);
        SolidBrush brushBorder = new SolidBrush(ColorBorder);
        using (GraphicsPath graphicsPath = ToolTipBody(...))
        {
            using (Pen p = new Pen(brushBorder, BorderSize))
            {
                pe.Graphics.FillPath(brushBackground, graphicsPath); // background
                pe.Graphics.DrawPath(p, graphicsPath); // borders
            }
        }            

        TextFormatFlags flags = // some flags;
        TextRenderer.DrawText(pe.Graphics, ToolTipText, Font, new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width, this.ClientRectangle.Height - TriangleSizeSide), ToolTipColor, System.Drawing.Color.Transparent, flags);
        brushBorder.Dispose();
        brushBackground.Dispose();

        base.OnPaint(pe);
    }
    // Form mapping tips
    private GraphicsPath ToolTipBody(...)
    { 
        // some code
        return graphicsPath;
    }
}

我尝试在 axWindowsMediaPlayer 对象上显示此工具提示.但是我的控制权被媒体播放器重叠了.我尝试使用 SetWindowPos 但这不起作用:

I try to show this tooltip over the axWindowsMediaPlayer object. But my control is overlapped by the media player. I've tried to use SetWindowPos but this does not work:

static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
const int SWP_NOSIZE = 0x0001;
const int SWP_NOMOVE = 0x0002;
const int SWP_SHOWWINDOW = 0x0040;
//...
 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
 [return: MarshalAs(UnmanagedType.Bool)]
  public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int flags);
//...
SetWindowPos(transparentToolTip1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);

注意:如果不更改新控件的CreateParams,它将在媒体播放器上绘制.但它变得不透明.

Note: If do not change CreateParams of a new control it draws over the media player. But it becomes opaque.

是否有任何想法可以使用 ?

Is any ideas to do it correct using winforms?

推荐答案

我的猜测是透明的事情正在发生,因为您将控件样式定义为 ControlStyles.Opaque.然后,将标志设置为 WS_EX_TRANSPARENT,您将再次将其设置为透明样式.

My guess is that the transparent thing is happening because you're defining the control style as ControlStyles.Opaque. Then, setting the flag to WS_EX_TRANSPARENT you're setting it to transparent style again.

关于重叠问题:如果您使用 Visual Studio Windows Forms 设计器设计了表单,则您的控件可能会在 AxWMPLib.AxWindowsMediaPlayer 组件中被 zOrdered.尝试放在前面控制您控件中的 ChildrenIndex先收藏再展示.

About the overlapped issue: If you designed the form using the Visual Studio Windows Forms designer, maybe your control is zOrdered down the AxWMPLib.AxWindowsMediaPlayer component. Try to bring to front or control the ChildrenIndex in your control collection before show it.

希望有帮助.

这篇关于非重叠透明控制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆