Форум — Ответы     (  К темам )
 ?  Dr.Phoenix: как сделать компонент прозрачным? (04-03-2003 20:49:20)
Допустим есть button и edit, а на фоне за ними лежит картинка. как сделать,
чтоб эта картинка под кнопкой и эдитом была видна?
 Devnvd (10-03-2003 17:24:19)
Если вам необходимо видеть, то что под окном, то необходимо чтобы верхнее окно исчезло. Уберите кнопки и едиты.
Если вам необходимо также присутствие полнофункционального верхнего окна, то рисуйте картинку на нём.

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

С кнопкой проще, отслеживая положение курсора мыши, вы можете сказать себе: если X в пределах Xmin..Xmax, и Y в пределах Ymin..Ymax, то мышка находится в области вашей "кнопки", кликнув в которую вы можете сделать тоже что самое, если бы в этом месте была бы расположена реальная кнопка.
С едитом сложнее, так как он рисует помимо фона ещё и текст, то заменить его также поможет TPaintBox. Чтобы было удобнее работать, необходимо расписать компонент на базе TGraphicControl или TPaintBox, в котором выполнять те же функции отображения, что и едит контрол. Но события клавиатуры придётся ловить тем окном на которое вы положите свой "едит".
 Dr.Phoenix (11-03-2003 01:16:58)
2 Devnvd:
Вообще идея вот какая: на форме есть фоновый рисунок и пара кнопок,которые должны быть полупрозрачными, чтоб под ними частично видна была картинка фона формы. в принципе такое можно сделать, если вместо кнопки положить несколько картинок, и просто обрабатывать события, но (идея взята из инсталлятора MP3 плеера Sonique2) после нажатия кнопки она должна уехать в сторону (ну мож не только кнопка, а и Edit'ы) и тут простая картинка не подходит. Т.е Сам вопрос заключался (заключается) в следующем: Как к контролу добавить свойство AlphaBlend (типа того, что есть у формы) наиболее простым способом?
 Devnvd (11-03-2003 12:43:10)
Интерфейсы подобного рода являются обычной картинкой.
В отработчике WM_PAINT рисуется фоновая картинка, затем рисуются элементы управления. Никаких дополнительных окон нет.
Но, если всё же положен дополнительно контрол на окно, то можно после отработки стандартных сообщений, приводящих к изменению картинки внутри контрола, нарисовать всё по своему.
Готового решения в этом случае у меня нет, но примерно это будет для Button выглядеть так:
Graphics::TBitmap *BrushBmp=NULL; //Фоновая картинка
TWndMethod OldButtonWindowProc; //Подменяете функцию отработки кнопки
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
OldButtonWindowProc=Button1->WindowProc;
Button1->WindowProc=ButtonWindowProc;

BrushBmp = new Graphics::TBitmap;
BrushBmp->LoadFromFile("sample.bmp");

}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete BrushBmp;
BrushBmp=NULL;
}
//------------------------------------------------
void __fastcall TForm1::WndProc(TMessage &msg)
{
if(msg.Msg==WM_ERASEBKGND)
{
if(BrushBmp)
{
Canvas->StretchDraw(ClientRect,BrushBmp);
msg.Result=1;
return;
}
}
TForm::WndProc(msg);
}
// Ваша отработка, в BrushBmp — фоновая картинка для Form1.
void __fastcall TForm1::ButtonWindowProc(Messages::TMessage &msg)
{
OldButtonWindowProc(msg);
if(BrushBmp)
if(msg.Msg==WM_ERASEBKGND || msg.Msg==BM_SETSTATE
||msg.Msg==WM_PAINT)
{

// HDC hdc=(HDC)msg.WParam;
HDC hdc=GetDC(Button1->Handle);
//Положение угла в координатах формы
int x0=Button1->Left+2;
int y0=Button1->Top+2;
int width=Button1->Width-4;
int height=Button1->Height-4;
double dx=(double)BrushBmp->Width/Form1->ClientWidth;
double dy=(double)BrushBmp->Height/Form1->ClientHeight;
x0 *=dx; y0 *=dy;
width *=dx; height*=dy;
StretchBlt(hdc,2,2,Button1->Width-4,Button1->Height-4,
BrushBmp->Canvas->Handle,x0,y0,width,height,SRCCOPY); //SRCAND
//Далее вы можете нарисовать текст внутри контрола
ReleaseDC(Button1->Handle,hdc);
// msg.Result=true;
return;
}
}