Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Вы могли попытаться поместить следующее в своего конструктора после вызова InitiliseComponent.
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
Править:
Если Вы даете этому движение, если Вы можете, удалить Ваш собственный код двойной буферизации и просто иметь контроль, тянут себя в ответ на соответствующие виртуальные называемые методы.
Я вытянул это от работы программа C#. Другие плакаты имеют синтаксические ошибки и ясно скопированный с C++ вместо C#
SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint, true);
Это может быть достаточно хорошо, чтобы просто звонить
SetStyle(ControlStyles::UserPaint | ControlStyles::AllDrawingInWmPaint, true);
Мерцание, которое Вы видите, скорее всего, потому что Windows тянет фон управления сначала (через WM_ERASEBKGND), затем просит, чтобы Ваше управление сделало безотносительно рисования, необходимо сделать (через WM_PAINT). Путем отключения фоновой краски и выполнения всего рисования в переопределении OnPaint может устранить проблему в 99% случаев без потребности использовать всю память, необходимую для двойной буферизации.
Вы говорите попытку двойной буферизации но затем Вы говорите что рисунок Изображению сначала и блитированию это. Вы попробовали установку DoubleBuffered = верный в конструкторе вместо того, чтобы делать его сами с Изображением?