Изначально была ошибка в создании пера для рисования точки (для рисования линий в других элементах как раз все нормально). Размер высчитывался по формуле:
Round((fScale.x + fScale.y) * ReadInteger(_Data,_data_Size,_prop_Size)/2)
и вот это деление на 2 и привело к тому что пришлось рисовать не точку: MoveToEx(pDC, x, y, nil);
LineTo(pDC, x, y);
а линию: LineTo(pDC, x, y);
MoveToEx(pDC, x, y, nil);
LineTo(pDC, x + 1, y + 1);
LineTo(pDC, x + 1, y + 1);
Так вот к чему в результате пришел:
1. Толщину пера находим по формуле:
Round((fScale.x + fScale.y) * ReadInteger(_Data,_data_Size,_prop_Size))
2. Рисуем именно точку
MoveToEx(pDC, x, y, nil);
LineTo(pDC, x, y);
LineTo(pDC, x, y);
3. А в процедуре _Set (рисование на канве с доступом как к матрице), удаляем все это безобразие с высчитыванием размера пера (все равно толщина в один пиксель), да и само перо без надобности. И вместо:
#pas
procedure THIImg_Point._Set;
var pen: HPEN;
begin
TRY
if not ImgGetDC(Val) then exit;
x := Round(x * fScale.x);
y := Round(y * fScale.y);
pen := CreatePen(PS_SOLID, Round(fScale.x + fScale.y)/2, Color2RGB(ReadInteger(Val,_data_Color,_prop_Color)));
SelectObject(pDC,Pen);
MoveToEx(pDC, x, y, nil);
LineTo(pDC, x, y);
DeleteObject(Pen);
FINALLY
ImgReleaseDC;
END;
end;
#pas
procedure THIImg_Point._Set;
begin
TRY
if not ImgGetDC(Val) then exit;
x := Round(x * fScale.x);
y := Round(y * fScale.y);
SetPixelV(pDC, x, y, Color2RGB(ReadInteger(Val,_data_Color,_prop_Color)));
FINALLY
ImgReleaseDC;
END;
end;
Тестировал вот такой схемой: img_point_testsize.sha
на трех разных машинах, везде точка оставалась точкой.
XP 1280x768
XP 1024x768
W7 1920x1080
Файл для обновления hiImg_Point_07_07_2014.zip