Турбо отладчик (Turbo Debugger) 3.0



Турбо отладчик 3.0 - стр. 296


       и влияет только на сегмент данных программы 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 в конце. Чтобы исправить эту ошибку, вы должны



Содержание  Назад  Вперед