Doga |
Отправлено: 09.03.2006, 21:54 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Всем привет!
Если установить толщину линии достаточно большую, ну например CODE |
Canvas->Pen->Width = 10;
|
и нарисовать ее с помощью MoveTo, LineTo, то концы линии получаются скруглённые. А хотелось бы, что б они были прямоугольные.
Как это сделать?
|
|
Grigoriy |
Отправлено: 10.03.2006, 03:18 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Может понравиться такая функция ?
CODE |
void Rec_Line(TWinControl* winc1, int x1, int y1, int x2, int y2, int t, TColor c1)
{
unsigned int val_2=2;
HDC DC1;
HBRUSH br1;
HPEN pen1;
if ((x1==x2)&&(y1==y2)) return;
tagPOINT* tp2 = new tagPOINT[4];
DC1=GetDC(winc1->Handle);
br1=CreateSolidBrush(c1);
pen1=CreatePen(PS_SOLID,1,c1);
SelectObject(DC1,br1);
SelectObject(DC1,pen1);
asm
{
fild dword ptr x1;
fisub dword ptr x2;
fmul st(0),st(0);
fild dword ptr y1;
fisub dword ptr y2;
fmul st(0),st(0);
fadd;
fsqrt;
fild x2;
fisub dword ptr x1;
fdiv st(0),st(1);
fimul dword ptr t;
fidiv dword ptr val_2;
fild y2;
fisub dword ptr y1;
fdiv st(0),st(2);
fimul dword ptr t;
fidiv val_2;
ffree st(2);
mov ecx,tp2;
fild dword ptr x1;
fsub st(0),st(1);
fistp dword ptr [ecx];
fild dword ptr x1;
fadd st(0),st(1);
fistp dword ptr [ecx+8];
fild dword ptr y1;
fadd st(0),st(2);
fistp dword ptr [ecx+4];
fild dword ptr y1;
fsub st(0),st(2);
fistp dword ptr [ecx+12];
fild dword ptr x2;
fsub st(0),st(1);
fistp dword ptr [ecx+24];
fild dword ptr x2;
fadd st(0),st(1);
fistp dword ptr [ecx+16];
fild dword ptr y2;
fadd st(0),st(2);
fistp dword ptr [ecx+28];
fild dword ptr y2;
fsub st(0),st(2);
fistp dword ptr [ecx+20];
ffree st(1);
ffree st(0);
};
Polygon(DC1,tp2,4);
DeleteObject(br1);
DeleteObject(pen1);
DeleteDC(DC1);
delete tp2;
};
|
Пояснения.
winc1 — оконный компонент.
x1, y1, x2, y2 — координаты крайних точек прямоугольного отрезка.
t — толщина отрезка.
c1 — цвет отрезка.
Замечания.
Если начальная и конечная точки совпадают, то ничего не рисуется.
Демонстрационный пример
CODE |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i;
for (i=0;i<20;i++)
Rec_Line(Form1,rand()/50,rand()/50,rand()/50,rand()/50,rand()/1000,rand()*255);
}
|
Нажмите несколько раз на Button1 и убедитесь.
Отредактировано Grigoriy — 10/03/2006, 03:20
|
|
vvoid |
Отправлено: 10.03.2006, 11:23 |
|
Машинист паровоза
Группа: Участник
Сообщений: 171
|
Чисто спортивный интерес... а что подправляется в асмовском куске?
|
|
Grigoriy |
Отправлено: 10.03.2006, 13:22 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE |
Чисто спортивный интерес... а что подправляется в асмовском куске?
|
Вычисляются координаты четырех точек прямоугольного четырехугольника.
|
|
Doga |
Отправлено: 10.03.2006, 15:22 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Вообще то я склонялся к использованию FillRect, результат похоже, был бы такой же.
А может в WinApi есть что нибудь такое?
|
|
Grigoriy |
Отправлено: 10.03.2006, 18:21 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE (Doga @ 10/03/2006, 15:22) | Вообще то я склонялся к использованию FillRect, результат похоже, был бы такой же.
А может в WinApi есть что нибудь такое? |
FillRect может нарисовать только такой прямоугольник, у которого две стороны горизонтальные и две вертикальные.
Вспомните функцию канвы
CODE |
Canvas->FillRect(const TRect &);
|
или соответствующую API — функцию
CODE |
FillRect(void* hDC, const tagRECT* lprc, void* hbr);
|
где
hDC — контекст устройства;
lprc — указатель на структуру прямоугольной области;
hbr — дескриптор кисти.
НО прямые отрезки ведь могут быть не только горизонтальными или вертикальными.
|
|
Doga |
Отправлено: 10.03.2006, 18:53 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
2Grigoriy
QUOTE |
FillRect может нарисовать только такой прямоугольник, у которого две стороны горизонтальные и две вертикальные.
|
Да, я в курсе, просто забыл сказать что мне именно это и нужно:
т.е. ТОЛЬКО вертикальные и горизонтальные линии.
А кроме FillRect есть ещё что нибудь такое?
|
|
Grigoriy |
Отправлено: 10.03.2006, 19:45 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
QUOTE (Doga @ 10/03/2006, 18:53) | А кроме FillRect есть ещё что нибудь такое? |
Есть.
Canvas->Rectangle(int , int, int, int).
Отличается от FillRect тем, что закрашивается все отрезки прямоугольника, а FillRect правую и нижнюю границы не закрашивает.
|
|
|