【发布时间】:2014-12-25 12:31:10
【问题描述】:
我已经看到here,您可以创建具有透明度的图像列表。它工作......有点。
我用它为列表控件创建了一个图像列表。结果有点令人失望:
左边是它的外观。右侧是列表控件的显示方式。看起来它只是试图将 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 实现的源代码,请查看 here。
@Barmak 尝试使用不同的图像,它看起来不错。我认为这是因为透明度靠近边缘而不位于图像内。见这里:
【问题讨论】:
-
您绝对可以在工具栏上使用透明按钮。我对
CGdiPlusBitmapResource不熟悉,但对GetHBITMAP的调用看起来很可疑。提供颜色键意味着正在移除透明度。 -
好的,那么我如何读取
PNG并将其提供给CListCtrl,同时保持它的alpha 通道? -
对不起,我刚刚尝试过 GetHBITMAP,但这不是问题:它似乎可以根据需要保持透明度。您可能需要预乘 alpha,但我现在没有时间尝试。
-
您是否考虑过使用 www.smalleranimals.com 的 ImgSource 库?它支持 32 位透明图像,并且可以将它们从一种格式复制到另一种格式。它可能会帮助您解决这个问题。
-
我无法复制该显示错误。你确定那是使用的 *.png 图像吗?