我在这里看到了可以创建具有透明度的图像列表。它确实有效...但是效果一般。
我使用这个方法为列表控件创建了一个图像列表。结果令人有些失望:
左边的是应该看起来的样子。右边的是列表控件显示的结果。看起来它只试图将 alpha 用作掩模,而任何混合区域都会尝试通过抖动来近似。有没有办法让它更好,以便我获得真正的 alpha 混合图像?
如果有影响,这里是源代码:
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尝试了一张不同的图片,看起来效果不错。我认为这是因为透明度靠近边缘而不在图像内部。请参见此处:
CGdiPlusBitmapResource
,但调用GetHBITMAP
似乎有问题。提供颜色键暗示着正在去除透明度。 - arx