Окно с фоном родителя..
От: Coocky_II  
Дата: 29.01.06 11:54
Оценка:
Есть залитый градиентом диалог. Нужно нарисовать кнопку, которая прозрачна. Т.е на ней есть изображение, а фон прозрачный
Вот что мне удалось добиться
Создаем список изображения с маской....
MyButton::MyButton()
{
    m_Bmp.LoadBitmap(IDB_BITMAP21);
    m_Bmp2.LoadBitmap(IDB_BITMAP22);
    imgList.Create( 32, 
                    32, 
                    ILC_COLOR24|ILC_MASK, 1, 0);
    imgList.Add(&m_Bmp, RGB(255,255,255));
    imgList.Add(&m_Bmp2, RGB(255,255,255));
}

Вот так рисуем на кнопке прозрачный битмап...

void MyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
        
CDC dc;

dc.Attach(lpDrawItemStruct->hDC);


    if(GetDlgCtrlID()==IDC_BUTTON1)
{
 CPoint pt( 0,0);
    BOOL z=imgList.Draw(&dc, 0, pt, ILD_TRANSPARENT);
}
if(GetDlgCtrlID()==IDC_BUTTON2)
{
CPoint pt( 0,0);
    BOOL z=imgList.Draw(&dc, 1, pt, ILD_TRANSPARENT);
}
    ////////////////////
    dc.Detach();

}

Вот так рисуем битмапы на заголовке

BOOL CEliteDlg::OnEraseBkgnd(CDC* pDC)
{
    // TODO: Add your message handler code here and/or call default
    
    CRect rect;
    GetClientRect(&rect);
    pDC->BitBlt(0,70,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
    bmp2.GetBitmap(&bitmapinfo);
bmp3.GetBitmap(&bitmapinfo2);

int nOldStretchBltMode = pDC->SetStretchBltMode (COLORONCOLOR);

//Градиент разбиваем на две части,левая часть имеет картинки,и потому не должна растягиваться

    pDC->BitBlt(0,0,bitmapinfo.bmWidth,bitmapinfo.bmHeight,&memDC1,0,0,SRCCOPY);

//Правая часть ресайзится.Вообщем на ней и есть кнопки, подкоторыми даже при растягивании
//должен корректно отображаться фон
    pDC->StretchBlt(bitmapinfo.bmWidth,0,rect.right,bitmapinfo2.bmHeight,&memDC2,0,0,bitmapinfo2.bmWidth,bitmapinfo2.bmHeight,SRCCOPY);
    
    pDC->SetStretchBltMode (nOldStretchBltMode);

    

    return TRUE;
}


А вот пытаемся при перерисовке кнопок,поставить градиент

BOOL MyButton::OnEraseBkgnd(CDC* pDC)
{
    CEliteDlg* pDlg = (CEliteDlg*)GetParent();
    
    CRect rBtn; GetWindowRect(rBtn);

    pDlg->ScreenToClient(rBtn);

CDC *d_dc=pDlg->GetDC();

      pDC->BitBlt(0,0,rBtn.Width(),rBtn.Height(),d_dc,rBtn.left,rBtn.top,SRCCOPY);


    // TODO: Add your message handler code here and/or call default

    return TRUE;
}


И все равно есть глюки, то некорректно перерисовывается, то еще что-то.
Что посоветуете -или я не там копаю?
Вообще проблема не только в кнопке, а как научится делать дочернее окно прозрачным по отношению к родительскому фону..
Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.