link6912 link6913 link6914 link6915 link6916 link6917 link6918 link6919 link6920 link6921 link6922 link6923 link6924 link6925 link6926 link6927 link6928 link6929 link6930 link6931 link6932 link6933 link6934 link6935 link6936 link6937 link6938 link6939 link6940 link6941 link6942 link6943 link6944 link6945 link6946 link6947 link6948 link6949 link6950 link6951 link6952 link6953 link6954 link6955 link6956 link6957 link6958 link6959 link6960 link6961 link6962 link6963 link6964 link6965 link6966 link6967 link6968 link6969 link6970 link6971 link6972 link6973 link6974 link6975 link6976 link6977 link6978 link6979 link6980 link6981 link6982 link6983 link6984 link6985 link6986 link6987 link6988 link6989 link6990 link6991 link6992 link6993 link6994 link6995 link6996 link6997 link6998 link6999 link7000 link7001 link7002 link7003 link7004 link7005 link7006 link7007 link7008 link7009 link7010 link7011 link7012 link7013 link7014 link7015 link7016 link7017 link7018 link7019 link7020 link7021 link7022 link7023 link7024 link7025 link7026 link7027 link7028 link7029 link7030 link7031 link7032 link7033 link7034 link7035 link7036 link7037 link7038 link7039 link7040 link7041 link7042 link7043 link7044 link7045 link7046 link7047 link7048 link7049 link7050 link7051 link7052 link7053 link7054 link7055

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