Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.037 c
6-1155102290
Nikus
2006-08-09 09:44
2006.12.31
WebSnap - нужен ликбез :)


2-1165821434
makvell
2006-12-11 10:17
2006.12.31
справочная система


15-1165855670
Гоблин
2006-12-11 19:47
2006.12.31
MSSQL - посоветуйте книжку


11-1141250469
Maloric
2006-03-02 01:01
2006.12.31
Вопрос по TKOLMemo (MCK)


15-1165982425
ПасЮзер
2006-12-13 07:00
2006.12.31
Бейсик в Паскаль перевести Есть такие утилиты?