|
96 Как реализовать прозрачный контрол EDIT, чтобы битмап нарисованный на форме, всегда был виден под этим EDIT-ом, даже при вводе текста?
Разобъём задачу на две части. Первую -- как сделать Edit пропустим, в силу тривиальности и неинтересности. Остановимся на второй -- как получить полупрозрачность.
Возьмём например, форму и сделаем её полупрозрачной. Для этого заведём битмап, на котором будем сохранять фон под формой. Ещё заведём функцию showForm() которая перед показом формы будет копировать фон в битмап и вызывать Show() для формы.
Hу, а теперь, собственно реализация:
=== Cut ===
void MyForm::showForm()
{
int transparency=15;
TColor transpcolor=(TColor)RGB(100,105,110);
baseBitmap->Width=Width;
baseBitmap->Height=Height;
HDC dc=GetDC(0);
BitBlt(baseBitmap->Canvas->Handle,0,0,Width,Height,dc,Left,Top,SRCCOPY);
ReleaseDC(0,dc);
TRGBTriple* pRGBTriple;
for(int y=0;y<baseBitmap->Height;y++) {
pRGBTriple=(TRGBTriple*)baseBitmap->ScanLine[y];
for(int x=0;x<baseBitmap->Width;x++) {
pRGBTriple[x].rgbtRed=(pRGBTriple[x].rgbtRed*transparency+
(100-transparency)*GetRValue(transpcolor))/100;
pRGBTriple[x].rgbtGreen=(pRGBTriple[x].rgbtGreen*transparency+
(100-transparency)*GetGValue(transpcolor))/100;
pRGBTriple[x].rgbtBlue=(pRGBTriple[x].rgbtBlue*transparency+
(100-transparency)*GetBValue(transpcolor))/100;
}
}
Show();
}
=== Cut ===
В конструкторе формы прописываем:
=== Cut ===
baseBitmap=new Graphics::TBitmap;
baseBitmap->PixelFormat=pf24bit;
=== Cut ===
В деструкторе надо будет удалить битмап. Его приводить не буду. В четырёх словах о том, что здесь происходит: здесь мы смешиваем цвета.
А теперь OnPaint:
=== Cut ===
PAINTSTRUCT paint;
HDC hdc=BeginPaint(Handle,&paint);
BitBlt(hdc,0,0,Width,Height,baseBitmap->Canvas->Handle,0,0,SRCCOPY);
EndPaint(Handle,&paint);
=== Cut ===
Теперь применительно к вашему вопросу. Вам вместо формы надо завести наследника от TWinControl, который вы будете "класть" куда надо. DrawText'ом будете выводить текстовый буфер, содержащий введённую строку. Для того чтобы у текста фон был прозрачный, надо сделать:
SetBkMode(hdc,TRANSPARENT);
Можно было бы конечно, не парится этим, а непосредственно буковки на канву битмапа вашего выводить используя SetBkMode(), но это не спортивно ;) лучше создать полнофункциональный Edit, transparency которого можно менять.
Alexander Sidorov 2:5022/23.10
Предыдущий вопрос
|
|
Следующий вопрос
источник
by jenyok
|
|
|