Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
ВнизОтбросить тень TLabel и получит её регион и регин Найти похожие ветки
← →
lesee © (2005-09-30 00:13) [0]как Отбросить тень TLabel (непосредственно букв) и получить её регион и регион самих букв
← →
Юрий Зотов © (2005-09-30 05:08) [1]> как Отбросить тень TLabel (непосредственно букв)
1. Выводим текст цветом тени (обычно темно-серым).
2. Прямоугольник, в котором выводился текст сдвигаем на несколько пикселей (обычно 1-3) навстречу воображаемому источнику света (обычно влево-вверх).
3. Выводим тот же текст цветом шрифта.
> и получить её регион и регион самих букв
А вот это поподробнее, плз - о чем идет речь? Какие-такие регионы у букв?
← →
TUser © (2005-09-30 10:32) [2]> и получить её регион и регион самих букв
Это прямоугольник, размеры которого можно узнать через Canvas.TextWidth, Canvas.TextHeight, где Canvas - канва того компонента, на котором рисуется TLabel.
← →
lesee © (2005-09-30 19:20) [3]Нееет :)) регион прямоугольника все умеют, как посчитать регион букв ?!
← →
Gorger © (2005-09-30 19:41) [4]Вот тебе процедура для получения региона по битмапу. Работает правда кривовато, но идея там правильная. Твоя же идея такая: нужно получить битмап для каждой буквы и пихнуть его в мою процедуру, правда ее изменить будет нужно, она масштабирует немного этот регион.
Буквы при этом обязательно должны быть черные, фон- обяз. белый. Как это сделать? - через BitBlt.Порой в Win32SDK Help.
А у тебя вообще получатся оченб маленькие регионы. Незнаю даже, получится ли.. Разве что буквы будут 24-30 шрифта.function SofisticForm(PBmp:TBitmap;FormHandle:DWORD;OffsX:Integer;OffsY:Integer):HRGN;
//type TMyByteArray = array[0..32767] of Byte;
var
i,j,unt:Integer;
Ms:TStringStream;
fileLog:TextFile;
n,bk:integer;
bwork:Tbitmap;
BoundsL:array [1..100] of TPoint;
BoundsR:array [1..100] of TPoint;
ResultArr:Array[1..200] of TPoint;
s:string;
//RowLens:array of integer;
Reg1,Reg2:HRGN;
begin
For i:=1 to 100 do begin
ResultArr[i].X:=0; ResultArr[i].Y:=0;
ResultArr[i+100].X:=0; ResultArr[i].Y:=0;
BoundsR[i].X:=0;BoundsR[i].Y:=0;
BoundsL[i].X:=0;BoundsL[i].Y:=0;
end;
Ms:=TStringStream.Create("");
AssignFile(FileLog,"Log.txt");
Rewrite(FileLog);
bwork:=TBitmap.Create;
Bwork.Assign(PBmp);
n:=0;
//Setlength(rowlens,BWork.Height);
//SetLength(BoundsR,BWork.Height*3);
//SetLength(BoundsL,BWork.Height*3);
for i:=0 to BWork.Height-1 do begin
Pba:=Bwork.ScanLine[i];
for j:=0 to (BWork.Width*3)-1 do begin
If Pba[j]=255 then Pba[j]:=0 else Pba[j]:=255;
Ms.WriteString(Char(Pba[j] mod 254+Ord("0")));
end;
Ms.WriteString(#13+#10);
end;
Ms.Seek(0,0);
i:=1;
While Ms.Position<Ms.Size do begin
s:=Ms.ReadString((Bwork.Width*3)+2);
BoundsL[i].X:=Pos("1",s);
s:=ReverseString(s);
BoundsR[i].X:=((Length(s)-2))-Pos("1",s);
BoundsR[i].y:=i;
BoundsL[i].Y:=i;
write(filelog,"[",BoundsL[i].X,"-",BOundsR[i].X,"]",BOundsR[i].Y,#$D,#$A);
inc(i);
end;
write(filelog,Ms.DataString);
CloseFile(FileLog);
n:=1;
While (BoundsL[n].X=0) do inc(n);
for i:=1 to Length(BoundsL) do begin
if i<=n then BoundsL[i]:=BoundsL[(n-1)+i]
else BoundsL[i]:=BoundsL[n+n+i];
end;
n:=1;
While BoundsR[n].X=(BWork.Width*3) do inc(n);
for i:=1 to Length(BoundsL) do begin
if i<=n then BoundsR[i]:=BoundsR[(n-1)+i]
else BoundsR[i]:=BoundsR[n+n+i];
end;
{While (BoundsR[n].X<>0) do inc(n);|
{Form2.PaintBox1.Canvas.MoveTo(BoundsR[1].X+150,BoundsR[i].Y+150);}
i:=1;
while BoundsR[i].X<>BWork.Width*3 do begin
ResultArr[i].X:=BoundsR[i].X;
ResultArr[i].Y:=BoundsR[i].Y;
i:=i+1;
end;
n:=i;
For i:=n downto 1 do begin
ResultArr[n+((n-1)-i)].X:=BoundsL[i].X;
ResultArr[n+((n-1)-i)].Y:=BoundsL[i].Y;
end;
ResultArr[((n-1)*2)]:=ResultArr[1];
{Reg2:=CreatePolygonRgn`BoundsR,BWork.Height,1);
CombineRGN(Reg1,Reg2,Reg1,rgn_xor);}
SofisticForm:=CreatePolygonRgn(ResultArr,(n*2),1);
//Form2.Refresh;
Bwork.Free;
Ms.Free;
end;
← →
Gorger © (2005-09-30 19:43) [5]Некоторые переменные лишние,некоторые в глобальнике объявлены, вообще код надотпочистить, но все же...ТАк что прошу не очень ругать.
← →
lesee © (2005-10-02 15:21) [6]Угу, интересно, спасибо, я уже научился перегонять в Bitmap:
bit:=TBitmap.Create;
Bit.Height:=Label1.Height;
bit.Width:=Label1.Width;
for i:=0 to Label1.Width do
for y:=0 to Label1.Height do
begin
if Label1.Canvas.Pixels[i,y]=Label1.Font.Color then
bit.Canvas.Pixels[i,y]:=Label1.Canvas.Pixels[i,y]
else bit.Canvas.Pixels[i,y]:=clWhite;
end;
, а из него в регион есть классная функция, описанная, кажется на исходник.ру.
← →
Джо © (2005-10-02 21:16) [7]Чем так мучаться, то лучше б уже GetGlyphOutline использовал.
← →
wicked © (2005-10-02 22:24) [8]> Джо © (02.10.05 21:16) [7]
ууу.... судя по вопросу, ответ ЮЗа самое то.... GetGlyphOutline - непростая функция, даже в мсдн признается.... ;)
← →
Джо © (2005-10-02 23:49) [9]Да, похоже с GetGlyphOutline я ошибся и насчет "попроще" и насчет полезности. Битовую картинку получить несложно, но смысла не имеет, так как ее точно также можно получить при помощи TextOut, а Transformation Matrix не нужен. Если же получать в Native-формате, то, возможно это был бы отличный вариант, но, все-равно функций перевода его в region нету, а сам формат зубодробильный :\
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c