Форум — Ответы ( К темам )
? | 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; } } |