首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅显示位图图标的C++ CButton

仅显示位图图标的C++ CButton
EN

Stack Overflow用户
提问于 2016-05-05 21:41:53
回答 3查看 1.6K关注 0票数 1

我在Visual Studio2012更新4上使用C++,我有一个对话框,我想在对话框中显示一个按钮,显示一个没有边框的位图(.bmp文件

我已经扩展了CButton来添加我的工具提示,等等。

使用Resource View打开对话框.rc文件,我将按钮属性Bitmap设置为true。然后,在对话框OnInitDialog函数中,我使用以下代码设置了标识为IDB_HELP的位图

代码语言:javascript
复制
myButton.SetBitmap((HBITMAP)LoadImage(AfxGetApp()->m_hInstance,
    MAKEINTRESOURCE(IDB_HELP), IMAGE_BITMAP, 16, 16, LR_COLOR));

但它会显示以下内容

我不想要那一半的边界。

我在资源视图中尝试将其设置为FlatTransparent,但它只会变得更难看。

然后,我尝试通过将Owner Draw设置为true,然后在我的按钮类中重新定义DrawItem来仅绘制图像,但我也不能完全理解这一点。

有什么简单的方法来制作一个只有图标的按钮吗?

EN

回答 3

Stack Overflow用户

发布于 2016-05-06 05:15:11

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

代码语言:javascript
复制
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()

用法:

代码语言:javascript
复制
BOOL CMyDialog::OnInitDialog()
{
    BOOL res = CDialogEx::OnInitDialog();
    static CMyButton bn;
    bn.SubclassDlgItem(IDC_BUTTON1, this);
    return res;
}
票数 1
EN

Stack Overflow用户

发布于 2016-05-06 08:38:07

如果您使用的是CMFCButton,并且您习惯于使用ICO文件而不是BMP,那么您就不需要做自己的图标绘制算法。尽管您可以在资源文件中直接说明按钮属于这种类型,但我不建议这样做,因为它会在rc文件中添加一个不可维护的十六进制文本。如果你使用几个rc文件,每种语言一个,那就太可怕了!

所以我们走吧。在窗体类中,声明一个成员

代码语言:javascript
复制
CMFCButton m_button1;

DoDataExchange应如下所示:

代码语言:javascript
复制
void MyDialog::DoDataExchange(CDataExchange* pDX)
{
    __super::DoDataExchange(pDX);

    DDX_Control(pDX, IDC_BUTTON1, m_button1);

    // ...
}

那么OnInitDialog应该是这样的:

代码语言:javascript
复制
BOOL CMyDialog::OnInitDialog()
{
    if(!__super::OnInitDialog())
         return FALSE;

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

    return TRUE;
}
票数 1
EN

Stack Overflow用户

发布于 2021-11-12 08:55:50

使用CMFCbutton并将边框样式设置为BUTTONSTYLE_NOBORDERS;

对于图片使用.ico而不是png。

还指出了

  1. 加载带有图标的库或exe。
  2. 将加载的dll/exe句柄传递给loadicon。
  3. 使用MFC按钮句柄将图标的属性设置为无序。

示例代码

代码语言:javascript
复制
m_HResdll = LoadLibrary("C:\\Repos\\iFIX\\SCADABin\\en\\UAAClientConfigurationRes.dll");
//m_hTrustIcon = LoadIcon(m_HResdll, MAKEINTRESOURCE(IDI_ICON1));
m_hTrustIcon = (HICON)LoadImage(m_HResdll, MAKEINTRESOURCE(IDI_ICON2),1,18,22, LR_DEFAULTCOLOR);
unsigned int  err = GetLastError();
m_btnTrustIcon.SetIcon(m_hTrustIcon);
this->m_btnTrustIcon.EnableWindow(true);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37052222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档