我在这里看到你可以创建一个透明的图像列表.它的工作......有点儿.
我用它来创建列表控件的图像列表.结果有点令人失望:

左边的那个是它应该看起来的样子.右边的那个是列表控件如何显示它.看起来它只是试图使用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);
}
Run Code Online (Sandbox Code Playgroud)
有关CGdiPlusBitmapResource实现的来源,请查看此处.
@Barmak尝试使用不同的图像,看起来很好.我认为这是因为透明度靠近边缘而不是位于图像内.看这里:
编辑----------
Gdiplus :: GetHBITMAP中的第一个参数应为背景色。使用RGB(0, 0, 0)作为背景颜色使半透明像素以配合黑色。
使用Gdiplus::Color(255,255,255,255)(白色)可以改善外观(因为ListView背景也是白色的)。但是最好将背景更改为Gdiplus::Color(0,255,255,255)(透明)以匹配任何背景。
{
CGdiPlusBitmapResource gdibmp;
if (gdibmp.Load(IDB_RIBBON_HOMELARGE, _T("PNG"), AfxGetResourceHandle()))
{
HBITMAP hBitmap;
gdibmp.m_pBitmap->GetHBITMAP(Gdiplus::Color::Transparent, &hBitmap);
ImageList_AddMasked(*pList, hBitmap, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
假定图像均为32x32像素。如果图像大小不同,则必须先调整大小,然后再添加到图像列表中。
{
CGdiPlusBitmapResource gdibmp;
if (gdibmp.Load(id, _T("PNG"), AfxGetResourceHandle()))
{
//resize image to 32x32 pixels
Gdiplus::Bitmap newBmp(32, 32, PixelFormat32bppPARGB);
double oldh = (double)gdibmp.m_pBitmap->GetHeight();
double oldw = (double)gdibmp.m_pBitmap->GetWidth();
double neww = 32;
double newh = 32;
double ratio = oldw / oldh;
if (oldw > oldh)
newh = neww / ratio;
else
neww = newh * ratio;
Gdiplus::Graphics graphics(&newBmp);
graphics.SetInterpolationMode(Gdiplus::InterpolationMode::InterpolationModeHighQualityBicubic);
graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
graphics.DrawImage(gdibmp.m_pBitmap, 0, 0, (int)neww, (int)newh);
//add `newBmp` to image list
HBITMAP hBitmap;
newBmp.GetHBITMAP(Gdiplus::Color::Transparent, &hBitmap);
ImageList_AddMasked(m_ImageList, hBitmap, 0);
}
}
Run Code Online (Sandbox Code Playgroud)
GdiPlus::GetHICON得到的图标手柄...随着CGdiPlusBitmapResource类,它应该可以使用以下命令:
HICON hicon;
m_pBitmap.Load(IDB_RIBBON_HOMELARGE, _T("PNG"), AfxGetResourceHandle());
m_pBitmap.m_pBitmap->GetHICON(&hicon);
pList->Add(hicon);
Run Code Online (Sandbox Code Playgroud)
或使用 GetHBITMAP
还要确保启用了视觉样式以改善ListView图标的外观。
测试具有透明背景的图像:
| 归档时间: |
|
| 查看次数: |
1924 次 |
| 最近记录: |