Главная страница
    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.036 c
15-1167807193
Slider007
2007-01-03 09:53
2007.01.28
С днем рождения ! 3 января


2-1168434601
Vitaly_799
2007-01-10 16:10
2007.01.28
Минимизация окна программы


1-1165303018
AlexeyT
2006-12-05 10:16
2007.01.28
EM_LINESCROLL не прокручивает RichEdit горизонтально


2-1168515363
nordic3
2007-01-11 14:36
2007.01.28
Блокировка Ctrl


2-1168376056
Евгений Р.
2007-01-09 23:54
2007.01.28
Непонятно в Local SQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский