gpt4 book ai didi

c++ - 具有透明度的 MFC 图像按钮

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:18 24 4
gpt4 key购买 nike

我正在更新一个带有多个按钮的 MFC 对话框。

目前,对话框有一个覆盖整个对话框的图片控件,提供图案背景。最重要的是,每个按钮都是一个 CBitmapButton,使用精心生成的(不透明)图像来匹配它们覆盖的背景区域。

如果可以将图像创建为大部分透明,那么背景会自动显示出来,这显然会容易得多。但是,在这种情况下,我不知道如何让 MFC 正确渲染透明图像。

我知道我可能想要一个不同于 CBitmapButton 的类,或者需要编写一个自定义子类;很好,但我不知道从哪里开始。支持 32 位 BMP 或带 alpha channel 的 PNG 会很好,但我会接受“指定的颜色应该是透明的”类型。

最佳答案

这可能不是最好的方法,但我要做的是创建一个自定义 CButton 派生类(假设您实际上正在使用 CButton 的其余功能),然后覆盖 DrawItem 函数以将您的自定义绘制代码。

对于图像本身,我会使用位图 GDI+ 对象(这将允许您加载具有 alpha channel 的 BMP 或 PNG),然后使用常规的 DrawImage 函数绘制位图。

如果您要将 PNG 文件放入资源文件中,则需要将它们作为“PNG”类型放入。确保当您查看资源文件代码时条目看起来像

IDB_PNG1 PNG "C:\temp\test.png"

并且不要尝试将其视为 BITMAP 资源,否则您将无法加载它们。

编辑

将我的回复放在这里,以便我可以发布代码。是的,我的意思是从 CButton 派生一个自定义类,然后添加一个 Gdiplus::Bitmap 成员变量。下面是你需要做的大致的事情来让它工作,虽然我没有检查代码是否实际编译和工作,但希望你会明白这个想法。这不是最有效的方法,但如果您之前没有做过太多自定义绘图,那么它确实具有简单的优点!

void CMyButton::LoadImage(const int resourceID)
{
m_pBitmap = Gdiplus::Bitmap::FromResource(NULL, MAKEINTRESOURCE(resourceID));
ASSERT(m_pBitmap);
}

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON);

CRect rcClient;
GetClientRect(&rcClient);
if (lpDrawItemStruct->itemState & ODS_SELECTED)
{
// If you want to do anything special when the button is pressed, do it here
// Maybe offset the rect to give the impression of the button being pressed?
rcClient.OffsetRect(1,1);
}
Graphics gr(lpDrawItemStruct->hDC);
gr.DrawImage(m_pBitmap, rcClient.left, rcClient.top);
}

关于c++ - 具有透明度的 MFC 图像按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9293298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com