C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Рисование линий, TCanvas
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 может нарисовать только такой прямоугольник, у которого две стороны горизонтальные и две вертикальные.


Да, я в курсе, просто забыл сказать что мне именно это и нужно:
т.е. ТОЛЬКО вертикальные и горизонтальные линии. smile.gif

А кроме FillRect есть ещё что нибудь такое?
Grigoriy
Отправлено: 10.03.2006, 19:45


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Doga @ 10/03/2006, 18:53)
А кроме FillRect есть ещё что нибудь такое?

Есть.
Canvas->Rectangle(int , int, int, int).

Отличается от FillRect тем, что закрашивается все отрезки прямоугольника, а FillRect правую и нижнюю границы не закрашивает.

Вернуться в Вопросы программирования в C++Builder