Главная / FAQ по Builder'у / 96 Как реализовать прозрачный контрол EDIT...

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
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz