Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.064 c
15-1168283686
Prohodil Mimo
2007-01-08 22:14
2007.01.28
что такое CD/MD управление


2-1168104252
Footballer
2007-01-06 20:24
2007.01.28
Микрофон


2-1168179097
Михаил_
2007-01-07 17:11
2007.01.28
Разблокировка файла


15-1168127114
AntiUser
2007-01-07 02:45
2007.01.28
Великая тайна воды


2-1168433997
NovaC
2007-01-10 15:59
2007.01.28
WinToDos & CopyFile





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский