Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Организация окна заставки, Небольшой Глюк... 
:(
    Опции темы
Zero
Дата 8.11.2004, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Народ, у меня в программе, есть заставка, которая работает следующим образом:
При запуске программы, появляется невидимое окно, на котором есть картинка, а за этой картинкой цифра которая отсчитывается в обратном порядке начиная от 3-ёх, но как раз проблема в том, что цифры наезжают др. на друга, хотя если в не прозрачном окне сделать тоже самое, тогда всё нормально, а переключение цифр происходит так:
Код

Label1.Caption:=IntToStr(i);

Но вот сам код, он сделан в двух модулях:
Для Самого проекта:
Код

 Application.Initialize;
 TitleForm:=TTitleForm.Create(application);  //это форма заставки
 TitleForm.ShowModal;  
 Application.CreateForm(TMain_Desktop, Main_Desktop);  //это форма которая остаётся
 ...
 TitleForm.Hide;   //потом форма окна заставки
 TitleForm.Free;   //удаляется
 Application.Run;


А это модуль формы окна заставки:
Код

var
 TitleForm: TTitleForm;
 i:integer;
 b:TBitMap;
implementation

{$R *.dfm}

procedure TTitleForm.Timer1Timer(Sender: TObject);
begin
 timer1.Enabled:=true;
 if i=2 then
   begin
     ShowWindow(FindWindow(nil,'Program Manager'),SW_HIDE);  // Стереть иконки
   end;
 if i=1 then
   begin
     showwindow(findwindow('Shell_Traywnd',nil),SW_HIDE);  // Стереть панель быстрого запуска
   end;
 if i=0 then
   begin
     timer1.Enabled:=false;
     close;
   end;
 label1.Left:=(TitleForm.ClientWidth div 2)-45;
 label1.Top:=(TitleForm.ClientHeight div 2)-120;
 label1.Caption:=IntToStr(i);   //Вот здесь после второго цикла происходит, слепление цифр
 i:=i-1;
end;

procedure TTitleForm.FormShow(Sender: TObject);
begin
 i:=3; //Начальный интервал заставки
end;

procedure TTitleForm.FormCreate(Sender: TObject);
var
 b:tbitmap;
begin
 b:=tbitmap.Create;
 b.LoadFromFile('BMP&ICO\Image.bmp');
 width:=b.Width;
 height:=b.Height;
 brush.Style:=bsclear;
end;

procedure TTitleForm.FormPaint(Sender: TObject);
var
 bitmap:tbitmap;
begin
 bitmap:=tbitmap.Create;
 bitmap.loadfromfile('BMP&ICO\Image.bmp');
 canvas.Brush.Bitmap:=bitmap;
 bitmap.transparent:=true;
 bitmap.transparentcolor:=clwhite;
 canvas.Draw(0,0,bitmap);
 bitmap.transparentmode:=tmAuto
end;

end.

При этом на формеволяется таймер с интервалом в 3000;
А дополнительные настройки формы:
BorderStyle ─ BsNone;
... остальные не имеет смысла показывать.
А также шрифт Label ─ 200, но он также не на что не влияет...

Замечание: Единственное могу добавить, если сторку
Код

 brush.Style:=bsclear;
убрать, то эта проблема исчезает...

Пожалуйста, если кто знает как сдесь можно что-либо исправить, то напишить что-нибудь. smile
PM MAIL ICQ   Вверх
p0s0l
Дата 9.11.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



На ум приходит такое:

1) Использовать свойство TransparentColor / TransparentColorValue
Это самый правильный способ будет, и самый простой, но работать будет только начиная с Win2k (вроде)...
Для этого установи свойство TransparentColor в True, выставь TransparentColorValue, например, в clWhite.
В OnPaint будет так:
Код
begin
 bitmap:=tbitmap.Create;
 bitmap.loadfromfile('BMP&ICO\Image.bmp');
 bitmap.transparent:=true;
 bitmap.transparentcolor:=clwhite;
 Canvas.Brush.Color := TransparentColorValue;
 Canvas.FillRect(ClientRect);
 Canvas.Draw(0,0,bitmap);
 bitmap.Free;
end;
В OnCreate надо оставить строчку brush.Style:=bsclear; DoubleBuffered должен быть False (если мало ли выставил в True)
Если подумать, то можно упростить так (OnPaint):
Код
begin
 bitmap:=tbitmap.Create;
 bitmap.loadfromfile('BMP&ICO\Image.bmp');
 Canvas.Draw(0,0,bitmap);
 bitmap.Free;
end;
Только в инспекторе должно быть выставлено у формы: TransparentColorValue := clWhite (это тот цвет, который пишешь в Bitmap.TransparentColor)

2) Способ немного посложнее. Не совсем правильный, но работать будет везде. Для этого запоминай то, что нарисовано на экране на том месте, куда будет выведена форма. А потом рисуй на форме это в качестве фона, и поверх этого выводи картинку...
Будет криво смотреться, если под твоей формой что-нибудь шевелится (кино например смотрится) - оно в пределах формы будет неподвижным...
Делается так:
В OnCreate ставишь:
Код

begin
 DoubleBuffered := True;

 b:=tbitmap.Create;
 b.LoadFromFile('BMP&ICO\Image.bmp');
 clientwidth:=b.Width;
 clientheight:=b.Height;
 b.Free;

 bb := Tbitmap.Create; // bb - глобальная переменная типа TBitmap
 bb.Width := clientwidth;
 bb.height := clientheight;
 BitBlt (bb.Canvas.Handle, 0, 0, clientWidth, clientheight,
           getdc(0), left, top, SRCCOPY); // копируем с экрана
end;
(заметь, строки brush.Style:=bsclear; не надо)
В OnPaint будет так:
Код
procedure TTitleForm.FormPaint(Sender: TObject);
var
 bitmap:tbitmap;
begin
 canvas.Draw(0, 0, bb); // вот, что добавилось!
 bitmap:=tbitmap.Create;
 bitmap.loadfromfile('BMP&ICO\Image.bmp');
 bitmap.transparent:=true;
 bitmap.transparentcolor:=clwhite;
 canvas.Draw(0,0,bitmap);
 bitmap.Free;
end;


PS: совет: 1- грузи картинку лучше один раз и потом её отображай.
2- освобождай память, а то у тебя нет ниодного bitmap.Free (хотя может ты это специально не написал, чтоб меньше кода было тут ?...)
Добавлено @ 15:53
3) Использовать регионы - в FAQ поищи статью по этому поводу...



--------------------
С уважением, г-н Посол.
PM   Вверх
Zero
Дата 9.11.2004, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата
Использовать свойство TransparentColor / TransparentColorValue
Это самый правильный способ будет, и самый простой, но работать будет только начиная с Win2k (вроде)...

Это верно, а вот в Win'9X, такое сво-во не работает, я конечно курсач делаю на XP, но предявлять я его буду, в радике, где стоят совковые компы, и с ОС Windows '98. Конечно 1-ый вариант можно было бы исп. в лучшем случае, но придётся всётаки второй smile
Да кстати спасибо г-н Посол, 2-ой код вполне работает, но теперь появилась др. мелкая проблема, изображение загружаемое, из файла появляется с копией рабочего стола но только в таком размере, какой размер имеет сам мой файл.bmp, а остальная часть рабочего стола остаётся без изменений.
В принципе можно сделать, за место
Код

b:=tbitmap.Create;
b.LoadFromFile('BMP&ICO\Image.bmp');
clientwidth:=b.Width;
clientheight:=b.Height;
b.Free;

т.е. чтобы размер определялся не из изображения, а присваивал размер экрана, но тогда изображение появляется в верхнем левом углу.
PoSol, может ты знаешь как сделать чтобы изображение грузилось именно в центор экрана, или что не будь моумнее можеш предложить, а то я уже целых час, сижу тут химичу, но доконца как надо здесь, не получается.
И ещё из-за этого мне придётся придумывать как получить размер экрана универсальным способом...
PM MAIL ICQ   Вверх
p0s0l
Дата 9.11.2004, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 16
Всего: 112



Что-то не понял о чём речь... smile

Если правильно дошло, то у тебя на форме показывается не та часть экрана ?
Для универсальности можно сделать так (так даже можно форму будет перемещать по экрану):
Создание bb в OnCreate будет таким:
Код

 bb := Tbitmap.Create; // bb - глобальная переменная типа TBitmap
 bb.Width := Screen.Width;
 bb.height := Screen.Height;
 BitBlt (bb.Canvas.Handle, 0, 0, bb.Width, bb.Height,
           getdc(0), 0, 0, SRCCOPY); // копируем с экрана

Вместо Canvas.Draw(0, 0, bb); (в OnPaint) будет такое:
Код
 BitBlt(Canvas.Handle, 0, 0, ClientWidth, ClientHeight,
        bb.Canvas.Handle, Left, Top, SRCCOPY);



--------------------
С уважением, г-н Посол.
PM   Вверх
Zero
Дата 10.11.2004, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Спасибо, то что надо!!! smile
Теперь всё, супер!!!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.