и влияет только на сегмент
и влияет только на сегмент данных программы BCWDEMO.
Перемещение "мыши"
-----------------------------------------------------------------
Когда вы перемещаете "мышь" при нажатой левой кнопке в поль-
зовательской области ввода, Windows посылает WM_MOUSEMOVE (или WM
_MOUSEFIRST, что то же самое) в WndProc, которая вызывает
DoMouseMove. Эта подпрограмма вызывает DrawShape для стирания фи-
гуры от предыдущей позиции "мыши" до исходной, а затем снова -
для рисования фигуры от текущей позиции до метки. Единственное
использование глобальной памяти в DoMouseMove состоит в получении
контекста устройства для текущего окна, который освобождается в
конце подпрограммы вызовом ReleaseDC.
Рисование фигуры (и нахождение позиции ошибки)
-----------------------------------------------------------------
Теперь рассмотрим подпрограмму DrawShape, которая дважды вы-
зывается из DoMouseMove. DrawShape запоминает перо, которым рисо-
валась предыдущая фигура, создает новое перо и рисует линию, эл-
липс или прямоугольник. В конце своей работы она восстанавливает
сохраненное на входе перо.
Поскольку перо - это объект интерфейса графических устройств
(GDI), выделяемый в глобальной памяти, подпрограмма DrawShape мо-
жет содержать код, вызывающий проблемы с памятью. Эта подпрограм-
ма вызывает особенное подозрение, так как она вызывается дважды
при каждом перемещении мыши. Если она создает перья и не удаляет
их, то она "съест" память очень скоро.
TDeb 3.0 #3-3 = 61 =
Действительно, недалеко от начала DrawShape выделяет перо
вызовом SelectObject, но не освобождает выделенную ему память вы-
зовом DeleteObject в конце. Чтобы исправить эту ошибку, вы должны