Доброго дня, а в чем собственно проблема то? Для масштабирования заведите какую нибудь float m_scale = 1.f переменную, в событии OnMouseWheel увеличивайте или уменьшайте ее значение, а потом ваши числовые значения перемножайте на m_scale, да и все. То же и с перемещением: вот код с форума, честно - переписывать леньки, уж простите))
//перемещение формы
bool dragging = false;
POINT MousePnt;
POINT point;
HWND hWnd;
RECT wndrect;
void __fastcall TClock::Image1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
GetCursorPos(&MousePnt);
dragging = true;
SetCapture(hWnd);
}
//---------------------------------------------------------------------------
void __fastcall TClock::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if (dragging==true) // Если нажата кнопка, то...
{
// Получить текущую позицию курсора
GetCursorPos(&point);
// Откорректировать положение окна
Clock->Left = Clock->Left+(point.x - MousePnt.x);
Clock->Top = Clock->Top +(point.y - MousePnt.y);
// Установить новые размеры окна
//SetWindowPos(hWnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
// Запоминаем текущую позицию курсора
MousePnt=point;
}
}
//---------------------------------------------------------------------------
void __fastcall TClock::Image1MouseUp(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
if (dragging==true)
{
dragging=false;
ReleaseCapture();
}
}
Код примитивный и немного глуповатый, но смысл думаю поймете. Тут перемещение окна, но вам нужна суть - координаты Clock. Используйте их для отрисовки ваших фигур, и будут они бегать за мышкой.
P.S.Хотя, неблагодарное это дело, плавности не добиться. Наткнувшись на опенсорсную библиотеку (на основе OpenGL), теперь увы на поделки с Timage, да и вообще отрисовка сложных интерфейсов, без слез смотреть невозможно - как по плавности, так и по нагрузке, реализуй хотя бы 50% из того, что там наворотил, на Borland-вской графике, программа бы и не пошевелилась)