Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > прозрачный фон


Автор: vinter 8.2.2007, 15:18
почитал похожие топики, ничем не помогло..
проблема : рисую свою кнопку, фон у окна картинка с градиентной заливкой, поэтому задний фон у кнопки поставить не могу(всегда разный будет), рисую в памяти потом кидаю BitBlt'ом, так вот вопрос как мне у битмапа в памяти сделать фон как у картинки, причем чтобы этот фон менялся в зависимости от положения кнопки на окне, надеюсь понятно изьяснился smile 

Автор: _hunter 8.2.2007, 15:50
не совсем понятно...
т.е. ты хочеш иметь битмап картинки "под кнопкой"? -- тогда самый простой способ (AFAIK) -- сделать функцию, принимающую этот битмап от парента (в OnEraseBkgnd сохраняй фон и передавай его)

Автор: vinter 8.2.2007, 17:39
попробую объяснит яснее, битмап в памяти имеет прямоугольную форму, а я допустим рисую круглую кнопку, так вот круглая кнопка занимает не весь битмап, а только его часть, так вот мне нужно, чтобы часть битмапа которая к кнопке отношения не имеет была цвета заднего фона..

Автор: _hunter 8.2.2007, 17:55
ну так делай как я сказал, а rect == описанному вокруг кнопки прямоугольнику...

Автор: vinter 8.2.2007, 18:07
т.е мне сохранить кусок фона, на который ложится кнопка, а потом запихать ее в битмап?? я правильно понял?? если правильно то возникает вопрос, как сохранить этот кусок фона..??

Автор: _hunter 8.2.2007, 19:50
правильно.
сохранять примерно так:
Код

void CCustomPicture::SaveBackground(CDC* dc, const CRect& rect)
{
    if (_background)
    {
        DeleteObject(_background);
        _background = NULL;
    }

    HBITMAP bitmap = CreateCompatibleBitmap(dc->m_hDC, rect.Width(), rect.Height());
    if (bitmap)
    {
        HDC compatibleDC = CreateCompatibleDC(dc->m_hDC);
        if (compatibleDC)
        {
            HGDIOBJ oldBitmap = SelectObject(compatibleDC, bitmap);
            if (oldBitmap) 
            {
                if (BitBlt(compatibleDC, 0, 0, rect.Width(), rect.Height(), dc->m_hDC, rect.left, rect.top, SRCCOPY)) 
                {
                    _background = bitmap;
                }

                SelectObject(compatibleDC, oldBitmap);
            }

            DeleteDC(compatibleDC);
        }
    }
}

(_background -- член класса типа HBITMAP).
предок вызывает эту функцию в самом конце OnEraseBkgnd() (когда весь фон гарантированно отрисован)

Автор: vinter 8.2.2007, 20:13
_hunter, спасибо, попробую отпишусь

Автор: vinter 11.2.2007, 15:58
_hunter, создал эту ф-ию она у меня член класса кнопки, но она не вызывается, т.е никогда в нее не заходит, почему такое может быть??, может я че не так понял..да и в MSDN такой ф-ии не нашел..

Автор: FelikZ 11.2.2007, 16:41
OnEraseBkgnd() - определил?

Автор: vinter 11.2.2007, 17:08
да и оставил, его пустым

Автор: FelikZ 11.2.2007, 17:25
Цитата(_hunter писал: )

предок вызывает эту функцию в самом конце OnEraseBkgnd() (когда весь фон гарантированно отрисован)

имелось ввиду что "CCustomPicture::SaveBackground" вызывается в конце тобою определенной
ф-и OnEraseBkgnd() .

Автор: vinter 11.2.2007, 17:49
FelikZ, спасибо, и последний вопрос как мне этот битмап теперь нарисовать в памяти?? BitBlt?? как??

Автор: vinter 11.2.2007, 18:13
нарисовал через DrawState, всем спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)