Текущий архив: 2006.12.31;
Скачать: CL | DM;
ВнизПрозрачный TextOut Найти похожие ветки
← →
Lakearo (2006-03-16 22:17) [0]Нужно вывести текст поверх рисунка. Просто Canvas.TextOut выводит с фоном цвета кисти. Пробовал SetBkMode(Canvas.Handle,TRANSPARENT) - просто так помогает, но при использовании жирного или курсива или при назначении onPaint снова начинает выводить с фоном или даже вообще не выводит ничего. Точнее, заметно что, что-то рисуется, но потом стирается вместе с рисунком.
Не подскажете, что делать?
← →
mdw © (2006-03-16 22:38) [1]Canvas.Brush.BrushStyle:= bsClear; ??
← →
ECM © (2006-03-17 00:03) [2]
> но при использовании жирного или курсива или при назначении
> onPaint снова начинает выводить с фоном или даже вообще
> не выводит ничего. Точнее, заметно что, что-то рисуется,
> но потом стирается вместе с рисунком.
А исходный код можно увидеть?
Или это секрет...?
← →
BaryVetaL © (2006-03-17 11:03) [3]Хотелось бы также узнать как на канве залить какую то ограниченную область не используя FloodFill.
По идее нужно использовать FloodFill(X,Y,fsBorder(fsSurface))
Где (Х,Y) точка внутри ограниченной области.
Но, она не работает(или я чего-то делаю не так), при попытке залить область она делает всю канву такого цвета (контур замкнут и точка сто процентов внутренняя)
← →
Lakearo (2006-03-17 12:06) [4]> А исходный код можно увидеть?
Ну хотя бы вот такой пример...program Project1;
uses Windows,KOL;
var F,R:PControl;
procedure onClick(Dummy:Pointer;Sender:PObj);
var A:PBitmap;
begin
A:=NewBitmap(0,0);
A.LoadFromFile("d:\test.bmp");
A.Draw(F.Canvas.Handle,0,0);
A.Free;
if F.Font.FontStyle=[] then F.Font.FontStyle:=[fsBold] else F.Font.FontStyle:=[];
SetBkMode(F.Canvas.Handle,TRANSPARENT);
F.Canvas.TextOut(300,300,"1234567890");
end;
begin
F:=NewForm(Applet,"123");
R:=NewButton(F,"098");
R.OnClick:=TOnEvent(MakeMethod(nil,@onClick));
Run(F);
F.Free;
end.
← →
ECM © (2006-03-17 13:05) [5]
F.Canvas.RequiredState(HandleValid or FontValid or BrushValid);
SetBkMode(F.Canvas.Handle,TRANSPARENT);
Но я считаю, что отрисовывать всё надо в методе OnPaint (OnEraseBkgnd - им даже можно назначить общий обработчик - меньше будет мельканий).
Любой контрол должен уметь правильно отображать своё состояние в любой момент времени. Это как раз и достигается, когда вся прорисовка идет в OnPaint. Попробуйте вызвать у себя onClick а затем свернуть-развернуть окно - вся доп. отрисовка пропадёт...А если бы отрисовка была в OnPaint такого бы не происходило....:))
А в onClick для перерисовки нового состояния вызовите F.Invalidate - система пошлет контролу WM_PAINT (но предварительно WM_ERASEBKGND) и соответсвенно вызовется OnPaint
← →
Lakearo (2006-03-17 14:24) [6]В принципе, я обычно и пишу в onPaint, это сейчас для примера просто не стал писать, ведь все равно должно было отрисоваться... Ну да ладно... Вообщем, с RequiredState все работает именно так, как должно =))
PS. Кстати, сначала забыл в onClick написать F.Invalidate, а форма все равно обновлялась. Видимо, при смене шрифта этот вызов все равно происходит...
Страницы: 1 вся ветка
Текущий архив: 2006.12.31;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.04 c