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

#.net #winforms

#.net #winforms

Вопрос:

У меня есть SDK в неуправляемом коде, который я использую в программе с графическим интерфейсом .NET Winforms. SDK рисует изображения на панелях, которые я передаю с помощью дескриптора в SDK. Тем не менее, это все еще элемент управления .NET, содержащийся в полностью управляемых элементах GUI.

Проблема, с которой я сталкиваюсь, заключается в том, что когда главное окно перерисовывается, моя программа (и .NET runtime) перерисовывает эти панели, что происходит после того, как неуправляемый код перерисовывает изображение на панели. Это перезаписывает ожидаемое изображение с помощью «фона», настроенного в конструкторе.

После передачи панели моему SDK я хочу остановить их перерисовку .NET. Но мне нужно сохранить режим изменения размера.

Я попробовал простой подход, который заключался в том, чтобы вывести «MyPanel» из панели, добавив пользовательский код, который управляет методом OnPaint():

 public class MyPanel : Panel
{
    [Category("Behavior"), DefaultValue(true)]
    public bool LetNetPaint { get; set; }

    protected override void OnPaint(PaintEventArgs e)
    {
        if(LetNetPaint)
            base.OnPaint(e);
    }
}
  

Однако это не работает.

Я также пытался перехватывать сообщения WM_PAINT и WM_ERASEBKGND в WndProc(), и это … лучше, но не очень.

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

Комментарии:

1. Также переопределите OnPaintBackground. Или просто используйте setStyle() в конструкторе, чтобы отключить стиль UserPaint, чтобы эти методы никогда не вызывались.

2. В итоге я использовал setStyle, но как часть свойства, чтобы я мог повернуть . При определенных обстоятельствах отображение СЕТИ включается / выключается. Просто сделайте это ответом, и вы получите чек, Ханс.

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

Ответ №1:

В качестве ответа на мой собственный вопрос, вот код, который в итоге заработал, основанный на предложении setStyle Ханса Пассанта:

 public class NativeDrawingPanel : Panel
{
    private bool letNetPaint;

    [Category("Behavior"), DefaultValue(true)]
    public bool LetNetPaint
    {
        get { return letNetPaint; }
        set 
        { 
            letNetPaint = value;
            SetStyle(ControlStyles.UserPaint, value);
            if(value) Refresh();
        }
    }

    public NativeDrawingPanel()
    {
        letNetPaint = true;
        SetStyle(ControlStyles.UserPaint, true);
    }
}