C ++ CButton仅显示位图图标

时间:2016-05-05 13:41:53

标签: c++ visual-studio button bitmap mfc

我在Visual Studio 2012更新4上使用C ++,我有一个Dialog,我想显示一个显示位图(.bmp文件)的按钮,没有边框help icon

我已扩展CButton以添加我的工具提示,依此类推。

使用资源视图打开对话框.rc文件,我将属性Bitmap设置为true。然后,从Dialog OnInitDialog函数中,我使用此代码设置位图,标识为IDB_HELP

myButton.SetBitmap((HBITMAP)LoadImage(AfxGetApp()->m_hInstance,
    MAKEINTRESOURCE(IDB_HELP), IMAGE_BITMAP, 16, 16, LR_COLOR));

但它显示了这个ugly button,我不想要那个半边界。

我尝试在资源视图中将其设为FlatTransparent,但它只会变得更加丑陋。

然后我尝试通过将Owner Draw设置为true然后在我的按钮类中重新定义DrawItem来绘制图像,但我也无法解决这个问题。

制作纯图标按钮的简单方法是什么?

2 个答案:

答案 0 :(得分:1)

如果您使用CMFCButton并且使用ICO文件而不是BMP,则不需要执行自己的图标绘制算法。虽然您可以在资源文件中直接说出这种类型的按钮,但我不推荐它,因为它在rc文件中添加了一个不可维护的十六进制文本。如果你使用几个rc文件,每种语言一个,它真的很恶魔!

那就放手吧。在表单类中,声明成员

CMFCButton m_button1;

DoDataExchange应如下所示:

void MyDialog::DoDataExchange(CDataExchange* pDX)
{
    __super::DoDataExchange(pDX);

    DDX_Control(pDX, IDC_BUTTON1, m_button1);

    // ...
}

然后OnInitDialog应该是这样的:

BOOL CMyDialog::OnInitDialog()
{
    if(!__super::OnInitDialog())
         return FALSE;

    m_button1.m_nFlatStyle= CMFCButton::BUTTONSTYLE_NOBORDERS;
    m_button1.SetIcon(IDI_HELP);

    return TRUE;
}

答案 1 :(得分:0)

您必须使用所有者绘制按钮或自定义绘图。下面是一个简单的例子,它使用图标而不是位图(它更容易为它分配透明背景)

class CMyButton:public CButton
{
    void OnPaint()
    {
        CPaintDC dc(this);
        CRect rc = dc.m_ps.rcPaint;
        dc.FillSolidRect(&rc, GetSysColor(COLOR_3DFACE));
        BOOL offset = (BST_PUSHED & GetState()) ? 1 : 0;
        int w = 24;
        int h = 24;
        HICON hicon = (HICON)LoadImage(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_ICON),
                    IMAGE_ICON, w, h, LR_DEFAULTCOLOR);
        DrawIconEx(dc, offset, offset, hicon, w, h, 0, 0, DI_NORMAL);
        DestroyIcon(hicon);
    }

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMyButton, CButton)
    ON_WM_PAINT()
END_MESSAGE_MAP()

用法:

BOOL CMyDialog::OnInitDialog()
{
    BOOL res = CDialogEx::OnInitDialog();
    static CMyButton bn;
    bn.SubclassDlgItem(IDC_BUTTON1, this);
    return res;
}