Бегло посмотрел и есть несколько замечаний:
1. В MFC принята такая идеология - документ хранит и работает с данными, вид только рисует. Обработка тулбара и прочих сообщений - все, что относиться к отображению, обрабатывает вид, а все, что относится к работе с данными, отображению диалогов со свойствами, отображение диалогов с инфой - задача документа.
Документ - один единственный и виден всем видам. Видов даже в SDI (Single Document Interface) может быть несколько и прямое обращение к ним из документа усложняется.
Обычно CMainFrm владеет видами и всякими окошками (статус-бар и прочее), а следовательно связь между документом и последними можно сделать через CMainFrm, для чего в CMainFrm добавляем соответвствующие методы и используем его как "фасад" для обращения к этих окошкам.
Сохранение файлов, открытие и прочее - это непосредственная задача документа, в нем и методы соответствующие есть.
2. Зачем Вы используете alloc и free. Есть много причин (все не помню), почему следует использовать new и delete. А так вы делаете проект в MFC, то вам вообще стоит забыть про них. В MFC для отладки утечек памяти в начале каждого файла добавляется вот такой код -
Код:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
В Debug'е при выходе из приложения MFC в случае обнаружения утечек памяти выводит имя исходника, строку и все прочее, и Вы сразу видите, где и что забыли подчистить.
3. В виде объявлено куча глобальных функций - по-идее, это обработка изображения, они должны быть в документе. Но не в этом дело - раз уж мы используем классы документа и вида и помещаем этот код в .cpp, то почему не следать их мембер-функциями документа, скажем приватными?:))
4. В виде объявлено куча глобальных переменных (я говорю не про константы, а именно переменные Parts и прочее), которые используются в глобальных функциях. Если исключить глобальные функции, то эти данные хранят данные, которые были получены в результате обработки (т.е. в документе) и должны по идее храниться, создаваться и убаваться документом, т.е. быть его мемберами.
5. В OnMouseWheel есть вызов OnInitialUpdate() - это в корне неправильно, так как эта функция по-идее вызывается единыжды при создании вида -
Цитата:
Called by the framework after the view is first attached to the document, but before the view is initially displayed.
6. В коде отрисовки OnDraw Вы по несколько раз подряд включаете одни и теже CPen и CBrush. Это незачем - один раз включили некоторый CPen, и потом им рисуем, нужен другой - поменяли, продолжаем рисовать.
7. По хорошему, при смене кисти и карандаша нужно сохранять предыдущие, чтоб по окончанию нашего творчества вернуть исходные. Для этого есть много способов, классика выглядит вот так:
Код:
void OnDraw(CDC* pDC)
{
CPen pen(PS_SOLID, 1, RGB(255, 0, 0));
CPen* pOldPen = pDC->SelectObject(&pen);
// что-нить рисуем
.............................
CPen pen2(PS_SOLID, 1, RGB(0, 0, 255));
pDC->SelectObject(&pen2);// включаем другую
// что-нить рисуем2
....................................
// и возвращаем все на место
pDC->SelectObject(pOldPen);
}
Можно также использовать SaveDC и RestoreDC. Есть в инете классы умных кистей и карандашей, в конструкторе которого стоит сохранение текущего CPen (pOldPen ), а в деструкторе - SelectObject сохраненного pOldPen.
8. Если нужно нарисовать большое количество объектов, лучше всего использовать BufferDC.
Это так называемое Flicker-free drawing. Все сводиться к тому, что вы сначала рисуете в память BufferDC, а при завершении отрисовки вызывается деструктор BufferDC, в котором идет сброс картинки в физический CDC. В итоге ускоряется отрисовка и пропадает мерцание при частой отрисовке.
Будут вопросы, спрашивайте. Успехов:)