Большой Воронежский Форум
» Программирование>События при создании формы Delphi
Арсений 01:09 05.03.2005
Возник следующий вопрос: в дельфях седьмых хочется сделать, чтобы форма появлялась не сразу, а постепенно, как Чеширский Кот
Очевидный порыв использовать alphaBlend (благо W2K есть уже почти везде) наталкивается вот на что - если сажать блендинг на OnCreate - OnPaint, то отрисовывается только форма, а картинки и кнопки на ней появляются уже ПОСЛЕ отработки; попытки принудительно отрисовать картинку в OnPaint тоже ни к чему не привели
Можно ли как-нибудь привязаться не к началу, а к концу отрисовки формы - или еще другой какой-нибудь путь существует?.. [Ответ]
Necromant 23:11 09.03.2005
Не знаю... А что такое alphaBlend? Первое, что приходит в голову (криво, правда, но гарантированно заработает) - заведи на OnCreate таймер эдак на полсекунды, а как тикнет - форма уже отрисовалась, власть тебе полная... А вообще проблема эта у меня уже была, давно, правда, не помню, как решил. Действительно, неясно, как отловить окончание отрисовки. Посмотрю завтра на работе, ежели получится сделать "прямо" - напишу. [Ответ]
Necromant 23:14 09.03.2005
А про постепенное появление - можно поиграться с CreateRgn, CombineRgn и SetWindowRgn. Можно сделать, чтобы форма появлялась из разезжающегося круга, например... [Ответ]
DimmaN 08:52 10.03.2005
Арсений ну я на BCpp использовал альфаБленд. у меня вот так написано - все работает нормально

Сообщение от :
//---------------------------------------------------------------------------

void __fastcall Tform_main::ApplicationEvents1Deactivate(TObject *Sender)
{
for (int sch = 255; sch >= 150; sch--)
{
form_main->AlphaBlendValue = sch;
};
}
//---------------------------------------------------------------------------

void __fastcall Tform_main::ApplicationEvents1Activate(TObject *Sender)
{
form_main->AlphaBlendValue = 255;
}
//---------------------------------------------------------------------------

Тока надо это в паскакаль переделать

ЗЫ мсье, Захаров? [Ответ]
zss_vrn 09:50 10.03.2005
Вот - модуль, который заставляет пульсировать форму вместе с картинкой.
------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "About.h"
#include "Main.h"
//---------------------------------------------------------------------
#pragma resource "*.dfm"
TAboutBox *AboutBox;
//---------------------------------------------------------------------
__fastcall TAboutBox::TAboutBox(TComponent *Owner)
: TForm(Owner)
{
AnsiString var = Label4->Caption +
MainForm->getVersionInfo(Application->ExeName);
Label4->Caption = var;
grad = 1;
Timer1->Enabled = true;

}
//---------------------------------------------------------------------
void __fastcall TAboutBox::Timer1Timer(TObject *Sender)
{
AlphaBlendValue += grad;
if (AlphaBlendValue > 250)
grad = -1;
if (AlphaBlendValue < 20)
grad = 1;
Update();
}
//---------------------------------------------------------------------------

void __fastcall TAboutBox::FormClose(TObject *Sender, TCloseAction &Action)
{
Timer1->Enabled = false;

}
//--------------------------------------------------------------------------- [Ответ]
Necromant 22:34 10.03.2005
Эх, судари... Развращает вас Borland, AlphaBlendValue юзаете какие-то непонятные... Api надо пользовать, а именно:

BOOL AlphaBlend(
HDC hdcDest, // handle to destination DC
int nXOriginDest, // x-coord of upper-left corner
int nYOriginDest, // y-coord of upper-left corner
int nWidthDest, // destination width
int nHeightDest, // destination height
HDC hdcSrc, // handle to source DC
int nXOriginSrc, // x-coord of upper-left corner
int nYOriginSrc, // y-coord of upper-left corner
int nWidthSrc, // source width
int nHeightSrc, // source height
BLENDFUNCTION blendFunction // alpha-blending function
);

Вот это я понимаю, Блендинг... [Ответ]
Арсений 00:19 11.03.2005
To DimmaN Он самый...

To Necromant Хм, забавно... Попробую.

To All
Пока пользую такой вот интересный предложенный вариант с API:

procedure TSplashWindow.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
begin
ShowWindow(self.Handle,sw_show);
for i := 0 to 255 do
begin
Application.ProcessMessages;
self.AlphaBlendValue:=i;
end;
end;
[Ответ]
Вверх