C # рисунок исчезает (на самом деле более системный вопрос) - PullRequest
1 голос
/ 15 октября 2010

ОК, я уверен, что некоторые из вас уже знают, что происходит только по моему названию, так как я понимаю, что это очень распространенный вопрос. Но мой вопрос на самом деле немного глубже, поэтому, пожалуйста, будьте терпеливы со мной.

Все мои программы, которые я делал в прошлые годы, были на Ассемблере, в основном 8051 и AVR, как на С, но также и для микроконтроллеров. Я был более очарован HW, чем SW. Но я также очарован функциями ОС, ее API и так далее. Несколько дней спустя я сказал своему другу, что создать очень простую программу для построения графика функции должно быть очень легко, если у вас есть математический парсер. Он верил мне, поэтому я попытался сделать один.

Я решил пойти с C #, даже я не знаю ООП. Но я думал, что если я сделаю все одним действием кнопки, это будет как старый добрый C.

Итак, я заставил математический парсер работать, а потом начал рисовать, используя объект Pen. Моей первой попыткой было нарисовать простую линию. Прочитав один урок, я смог это сделать, и я создал простую ось для своего сюжета.

Но потом я заметил нечто странное, когда я свернул свою программу, рисование исчезает. Это заставило меня задуматься о том, как все это рисовать на системном уровне.

Я думал, что система хранит изображение активного окна, пока оно не изменится. Поэтому, когда вы перемещаете свои окна, он просто меняет свою позицию в famebuffer. И когда вы минимизируете его, он просто пропускает его во время отрисовки в кадровый буфер.

Но я видел, что это не так. Так, пожалуйста, не могли бы вы сказать мне, почему это происходит? Я могу прочитать, как предотвратить это во многих уроках, но я хотел бы знать больше, почему. Более того, это объясняется тем, как работает системный API, или тем, как работает класс рисования C #.

Кроме того, это заставило меня задуматься о том, что в библиотеках C # и .NET - это функция, которая является просто вызовом функции WinAPI, которая работает точно так же, и сколько библиотек и функций делают что-то большее. Например, если бы в GDI не было функции для рисования линий, и вы могли бы рисовать только точки, то C # добавил бы функцию для рисования линий из этих точек. Я надеюсь, что вы меня понимаете.

Спасибо.

Ответы [ 4 ]

5 голосов
/ 15 октября 2010

Вот как это работает в Win32 API. Когда окно свернуто, занимаемая им область «становится недействительной», поэтому система Windows знает, что эту область экрана необходимо перерисовать. Это приводит к отправке сообщения WM_PAINT программам Windows, ответственным за рисование этой области. Вы можете прочитать больше об аннулировании клиентской области (область, за которую отвечает ваша программа) здесь .

Если вы действительно заинтересованы в этом и хотите глубже понять, как система обрабатывает рисование (и другие вещи, например сообщения Windows), я рекомендую прочитать больше о Win32 API, например начиная с классики Чарльза Петцольда, Программирование Windows .

2 голосов
/ 15 октября 2010

Ваш рисунок не исчез, его просто нет. Потерпи меня:

  • Чтобы нарисовать в окне Windows, вы должны ответить на обратный вызов, указанный в сообщении WM_PAINT. Это было в Win 3.11, и это так СЕЙЧАС.
  • рисовать по нажатию кнопки - пустая трата времени, потому что перерисовка следующей формы / элемента управления / окна будет рисовать там цвет фона
  • переместите тот же код из обработчика событий кнопки в OnPaint - конечно, обработайте различия в семантике
  • окна не сохраняют копию вашего экранного буфера - вашего рисунка - поэтому вы должны сохранить его где-нибудь или нарисовать на лету
1 голос
/ 15 октября 2010

В Windows (до Vista / DWM и MIL) приложение отвечает за создание собственного графического интерфейса.То есть приложение должно рисовать свой собственный графический интерфейс, когда операционная система говорит приложению сделать это.Изменение размера или перемещение формы вызовет событие рисования.Вот как это работает в User32 + GDI.То есть приложение рисует свои собственные пиксели.

Приложение WPF, тем не менее, будет использовать уровень интеграции мультимедиа (Vista и Windows 7), а "mil core" отвечает за создание визуального дерева приложения.В этом случае операционная система отвечает за визуализацию, но приложение отвечает за то, что оно хочет визуализировать.

0 голосов
/ 15 октября 2010

Если вы хотите построить график, используйте элементы управления диаграммой Microsoft.http://www.microsoft.com/downloads/en/details.aspx?FamilyId=130F7986-BF49-4FE5-9CA8-910AE6EA442C&displaylang=en

или ZedGraph http://zedgraph.org/

Если вы хотите нарисовать себя: окно перерисовывается при изменении размера.Вам нужно перерисовать свой сюжет на событии перерисовки, или как он там называется.Это совершенно нормально.

Кроме того, используйте .NET 4.0, потому что иначе у вас нет возможности удалить все, что вы нарисовали программно, если вы не удалите (перекрасите) все.

...