Как сделать фон в MFC полупрозрачным?

0

Я импортирую изображение (.bmp или.jpeg) в качестве фона представления клиента в MFC.

Когда я нажимаю " Open, функция CDrawToolView::OnFileOpen() открывает окно для выбора изображения, затем я использую ShowBitmap(CDC* pDC,CString strPicPath) и ShowPic(CDC* pDC,CString strPicPath) для загрузки изображения в качестве backgroud и настройки размер представления клиента для соответствия рисунку.

Я хочу, чтобы изображение было полупрозрачным, поэтому фон выглядит мягче. Может ли кто-нибудь помочь мне или дать какое-то предложение, спасибо.

Вот мой код:

void CDrawToolView::ShowBitmap(CDC* pDC,CString strPicPath)
{        
    HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strPicPath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    m_bitmap.Detach();
    m_bitmap.Attach(hBitmap);

    CRect rect;
    GetClientRect(&rect);

    CDC dcImage;
    if (!dcImage.CreateCompatibleDC(pDC))
    {
        return;
    }

    BITMAP bm;
    m_bitmap.GetBitmap(&bm);
    dcImage.SelectObject(&m_bitmap);
    pDC->StretchBlt(0,0,rect.right,rect.bottom,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 
}


void CDrawToolView::ShowPic(CDC* pDC,CString strPicPath)
{        
    if(!m_MyImage.IsNull())
        m_MyImage.Destroy();
    HRESULT hResult=m_MyImage.Load(strPicPath);
    int iWidth=m_MyImage.GetWidth();
    int iHeight=m_MyImage.GetHeight();
    m_MyImage.Draw(pDC->m_hDC,0,0,iWidth,iHeight);
    CRect client(0, 0, iWidth, iHeight);
    client.bottom=client.bottom+::GetSystemMetrics(SM_CYMENU)+::GetSystemMetrics(SM_CYEDGE)*2;
    client.right=client.right+::GetSystemMetrics(SM_CXEDGE)*2;
    CFrameWnd* pFrame = GetParentFrame(); 
    pFrame->CalcWindowRect(&client);
    int width  = client.Width();
    int height = client.Height();
    int y  = (::GetSystemMetrics(SM_CYSCREEN) - height) / 2 + 100;
    int x  = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2;
    pFrame->SetWindowPos( NULL, x, y, width, height, SWP_NOACTIVATE | SWP_NOZORDER );
}
Теги:
mfc

1 ответ

3
Лучший ответ

Используйте AlphaBlend вместо StretchBlt

CDC :: AlphaBlend

Установите SourceConstantAlpha в вашей структуре BLENDFUNCTION примерно на 128 (на полпути между прозрачным и непрозрачным), а затем настройте, пока он не будет выглядеть хорошо.

AlphaFormat должен быть равен нулю, если у вас нет 32-битного растрового изображения с альфа-каналом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню