Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

TextOut и кисть bsClear, как вывести текст без фона?   Найти похожие ветки 

 
melnikov   (2007-01-09 02:50) [0]

Здравствуйте!
У меня возник такой вопрос, при использовании функции TextOut и кисти со стилем bsClear, при выводе строки изображение "наслаивается" на предыдущее, как этого можно избежать? Если используется стиль кисти bsSolid, то всё нормально, но тогда под текстом выводится фон, который вовсе не нужен :( Вот мой код, если кто-то сможет, помогите пожалуйста. Заранее благодарен за помощь!

procedure TForm1.Timer1Timer(Sender: TObject);
var
 hCanvas: TCanvas;
begin
 hCanvas := TCanvas.Create;
 hCanvas.Handle := GetDC(HWND_DESKTOP);

 hCanvas.Font.Size   := 10;
 hCanvas.Font.Name   := "Tahoma";
 hCanvas.Font.Color  := clYellow;
//  hCanvas.Brush.Style := bsSolid;
 hCanvas.Brush.Style := bsClear;

 hCanvas.TextOut(20, 20, TimeToStr(Time));
 ReleaseDC(HWND_DESKTOP, hCanvas.Handle);
end;


 
Джо ©   (2007-01-09 02:51) [1]

Ничего не понял.


 
melnikov   (2007-01-09 02:56) [2]

Здесь время просто выводится на Рабочий стол. Когда изменяются секунды, то предыдущая цифра не перерисовывается, а поверх неё выводится новая, в результате через некоторое время вместо цифр получаются закрашеные квадратики.


 
Германн ©   (2007-01-09 02:57) [3]


> TextOut и кисть bsClear, как вывести текст без фона? [D7,
>  XP]

Кисти присваивается некий стиль, но сама кисть нигде не пользуется. Шрифту тоже что-то присваивается, но он-то хоть используется в hCanvas.TextOut.
Но и я тоже не понял вопроса :(


 
Palladin ©   (2007-01-09 02:59) [4]


> при выводе строки изображение "наслаивается" на предыдущее,
> как этого можно избежать?

наслаивается понятно, а избежать ты куда этого хочешь? все затереть? тогда будет фон который тебе не нужен, если не нужен фон, тогда изображение наслаивается, что тоже тебе не нужно... может сходишь в магазин? там такие шесты продаются классные... к одному из концов у них привязанны весенние тоненькие веточки... чем привязаны не знаю, но все вместе называется - метла


 
Джо ©   (2007-01-09 03:00) [5]

> [2] melnikov   (09.01.07 02:56)
> Здесь время просто выводится на Рабочий стол. Когда изменяются
> секунды, то предыдущая цифра не перерисовывается, а поверх
> неё выводится новая, в результате через некоторое время
> вместо цифр получаются закрашеные квадратики.

Так а чего ты хочешь-то? С фоном тебе не нравится, без фона — тоже нет :)


 
melnikov   (2007-01-09 03:03) [6]

Кисть влияет на вывод функции TextOut, если используется

hCanvas.Brush.Style := bsClear;

то текст выводится без фона, на Рабочий стол Windows, но предыдущий самостоятельно не затирается, т.е. нужно сначала восстановить фон под тем местом, на которое будет выведено следующее значение времени. Если используется стиль

hCanvas.Brush.Style := bsSolid;

то текст выводится нормально, т.е. старый текст "затирается", но текст выводится с фоном, а хотелось бы без фона.


 
melnikov   (2007-01-09 03:07) [7]

Хочется использовать стиль bsClear, но нужно как-то сделать, чтобы текст отображался правильно, т.е. не наслаивался на предыдущий.


 
melnikov   (2007-01-09 03:09) [8]


> наслаивается понятно, а избежать ты куда этого хочешь? все
> затереть?

Нет, всё затирать не хочу, хочется чтобы под текстом не было фона от кисти.


 
RASkov   (2007-01-09 05:52) [9]


> [0] melnikov   (09.01.07 02:50)

Попробуй так, не совсем красиво, но так... для примера.

var
 Form1: TForm1;
 Bm: TBitMap;
 hCanvas: TCanvas;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 hCanvas := TCanvas.Create;
 hCanvas.Handle := GetDC(HWND_DESKTOP);
 Bm:=TbitMap.Create;
 Bm.Width:=60;
 Bm.Height:=20;
 Bm.Canvas.CopyRect(Bm.Canvas.ClipRect, hCanvas, Rect(100, 100, 160, 120));
 hCanvas.Font.Size   := 10;
 hCanvas.Font.Name   := "Tahoma";
 hCanvas.Font.Color  := clYellow;
 hCanvas.Brush.Style:=bsClear;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 BM.Free;
 ReleaseDC(HWND_DESKTOP, hCanvas.Handle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 hCanvas.CopyRect(Rect(100, 100, 160, 120), Bm.Canvas, Bm.Canvas.ClipRect);
 hCanvas.TextRect(Rect(100, 100, 160, 120), 100, 100, TimeToStr(Time));
end;


 
melnikov   (2007-01-09 06:19) [10]


> RASkov   (09.01.07 05:52) [9]
> Попробуй так, не совсем красиво, но так... для примера.

О, спасибо Вам ОГРОМНОЕ за код! Вроде всё работает отлично, именно так, как и хотелось! :))



Страницы: 1 вся ветка

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
1-1164973182
LexusU
2006-12-01 14:39
2007.01.28
Подключение DLL написаной на VC++ в проекте Delphi


15-1167913019
xayam
2007-01-04 15:16
2007.01.28
Интеграция Delphi 2006 с sourceforge.net


3-1162984122
topperz
2006-11-08 14:08
2007.01.28
разное содержимое комобобокса в одном столбце DbGridEh


6-1156611573
1519
2006-08-26 20:59
2007.01.28
Подключение к интернету


2-1168261997
Lamer666
2007-01-08 16:13
2007.01.28
DbGridEh