Вверх ↑
Ответов: 2293
Рейтинг: 678
#1: 2014-07-08 00:38:08 ЛС | профиль | цитата
Посмотрел все внимательнее и вот что получается.
Изначально была ошибка в создании пера для рисования точки (для рисования линий в других элементах как раз все нормально). Размер высчитывался по формуле:
Round((fScale.x + fScale.y) * ReadInteger(_Data,_data_Size,_prop_Size)/2)
и вот это деление на 2 и привело к тому что пришлось рисовать не точку:
MoveToEx(pDC, x, y, nil);
LineTo(pDC, x, y);
а линию:
MoveToEx(pDC, x, y, nil);
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);

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
карма: 11

0
файлы: 2hiimg_point_07_07_2014.zip [1KB] [177], img_point_testsize.sha [5.3KB] [290]