Здравствуйте.
Изначально, когда видео отрендерено, выполняется это:
public bool ConfigureVideoOutput()
{
if (OutputWindow == null || videoWindow == null || basicVideo == null ||
basicVideo.GetVideoSize(out int w, out int h) != S_OK)
{
return false;
}
videoWindow.put_Owner(OutputWindow.Handle);
videoWindow.put_MessageDrain(OutputWindow.Handle);
videoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipChildren | WindowStyle.ClipSiblings);
_videoWidth = w;
_videoHeight = h;
Rectangle r = CenterRect(ResizeRect(new Rectangle(0, 0, _videoWidth, _videoHeight), OutputWindow.Size), OutputWindow.ClientRectangle);
SetScreenRect(r);
videoWindow.put_Visible(OABool.True);
return true;
}
а при ресайзе это:
public void ResizeOutputWindow()
{
panelVideoScreen.Top = lblTitleBar.Visible ? lblTitleBar.Height : 0;
panelVideoScreen.Height = panelControls.Visible ? panelControls.Top - panelVideoScreen.Top : Height - panelVideoScreen.Top;
if (State != PLAYER_STATE.Null)
{
PlayerEngine.ConfigureVideoOutput();
}
}
public void SetScreenRect(Rectangle rectangle)
{
if (videoWindow != null)
{
videoWindow.SetWindowPosition(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
_outputScreenRect = rectangle;
}
else
{
_outputScreenRect = new Rectangle(0, 0, 0, 0);
}
}
Проблема в том, что панель перерисовывается полностью и получается мерцание. Можно в обработчике события Paint
заливать только нужный регион. Но как отменить стандартную отрисовку, которая делается еще до прихода события?
Просто оставить пустым?
protected override void OnPaint(PaintEventArgs e)
{
}
p.s. Да, код кривоват. Надо фиксить. Но мерцание возникает из-за перерисовки панели.