#.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);
}
}