Я видел здесь, что вы можете создать список изображений с прозрачностью. Он работает... вроде.
Я использовал это, чтобы создать список изображений для элемента управления списком. Результаты были немного разочаровывающими:
Слева - как он должен выглядеть. Справа видно, как отображает его элемент управления списком. Похоже, что он просто пытался использовать альфу в качестве маски, и любая смешанная область пыталась аппроксимироваться сглаживанием. Есть ли способ получить это лучше, чтобы получить фактическое альфа-смешанное изображение?
Вот источник, если это имеет значение:
class CDlg : public CDialog
{
DECLARE_DYNCREATE(CDlg)
public:
CDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CDlg();
// Dialog Data
enum { IDD = IDD_BS_PRINT };
CGdiPlusBitmapResource m_pBitmap;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_printOptions;
};
BOOL CDlg::OnInitDialog()
{
__super::OnInitDialog();
m_pBitmap.Load(IDB_RIBBON_HOMELARGE, _T("PNG"), AfxGetResourceHandle());
HBITMAP hBitmap;
m_pBitmap.m_pBitmap->GetHBITMAP(RGB(0, 0, 0), &hBitmap);
CImageList *pList = new CImageList;
CBitmap bm;
bm.Attach(hBitmap);
pList->Create(32, 32, ILC_COLOR32, 0, 4);
pList->Add(&bm, RGB(255, 0, 255));
m_printOptions.SetImageList(pList, LVSIL_NORMAL);
//...
return TRUE;
}
IMPLEMENT_DYNCREATE(CDlg, CDialog)
CBSPrintDlg::CBSPrintDlg(CWnd* pParent /*=NULL*/)
: CBCGPDialog(CBSPrintDlg::IDD, pParent)
{
}
CBSPrintDlg::~CBSPrintDlg()
{
}
void CBSPrintDlg::DoDataExchange(CDataExchange* pDX)
{
CBCGPDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_PRINT_OPTIONS, m_printOptions);
}
Для источника реализации CGdiPlusBitmapResource посмотрите здесь.
Исходное изображение с прозрачностью:
@Barmak попробовал с другим изображением, и все выглядит отлично. Я думаю, это потому, что прозрачность находится рядом с краем и не находится внутри изображения. См. Здесь: