C ++ - MFC /要添加位图CButton的。 CButton的没有成员setBitm

2019-10-21 10:01发布

这是计算器我第一个问题,我希望我做的一切权利:S

正如我在Titel的描述我的工作与MFC一个Visual Studio(2012年)项目。 我尝试将位图添加到我的CButton的,这是插在设计视图我的对话框。

所有后我读过有关这一点,描述使用setBitmap或SendMessage函数这么做。 我总是试图做到这一点在OnInit() - 我的对话框的功能。 当我(尝试)使用setBitmap()是这样的:

m_backButton.Attach (LoadBitmap (AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BACK_BUTTON))); //m_backButton is a private CBitmap member of my dialog
CButton* pButton = (CButton* )GetDlgItem(IDC_BUTTON1);
pButton->SetBitmap(m_backButton);

它导致的智能感知错误:

智能感知:类“CButton的”没有成员“setBitmap”

另一种尝试是使用的sendMessage:

m_backButton.Attach (LoadBitmap (AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BACK_BUTTON)));
CButton* pButton = (CButton* )GetDlgItem(IDC_BUTTON1);  
HBITMAP hBitmap = (HBITMAP)m_backButton;
pButton->SendMessage(BM_SETIMAGE,(WPARAM)IMAGE_BITMAP,(LPARAM)hBitmap); 

首先,我得到了另一个智能感知错误:

智能感知:标识符“BM_SETIMAGE”未定义

就像我在另一篇文章中读过,我定义的“BM_SETIMAGE”由我自己:

#define BM_SETIMAGE 0x00F7

现在代码能够编译,但按钮依然没有显示出位......由于在互联网各个岗位使用该两种方案我很无奈的一个。 任何人的想法什么是错? 如果没有,也感谢您的阅读:)

Answer 1:

所以,我想我找到了解决办法:)我想我张贴在这里,其他可能使用它了。 此外,我不能让这个问题是unansweared:S

我的解决办法是从http://www.flounder.com/bitmapbutton.htm和调整以适应我的需要。 现在可以与微软一起使用嵌入式紧凑型2013年THX的作者日期!

我的短版看起来是这样的:

ImageButton.h

#include "myApp.h" //check the original article if you are missing dependencies
class CImageButton : public CButton
{

public:
    CImageButton(UINT bitmap);
    // Default constructor (required for MFC compatibility)
    CImageButton() {bitmap = 0; }
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    virtual ~CImageButton();
    void LoadBitmapForButton(UINT bitmap)
          { this->bitmap = bitmap; } 
    void GetBitmaps(UINT &bitmap)
          { bitmap = this->bitmap; }

protected:
    UINT bitmap;

    DECLARE_MESSAGE_MAP()
};

ImageButton.cpp

#include "stdafx.h"
#include "ImageButton.h"

CImageButton::CImageButton(UINT bitmap)
{
 this->bitmap = bitmap;
}

CImageButton::~CImageButton()
{
}


BEGIN_MESSAGE_MAP(CImageButton, CButton)
END_MESSAGE_MAP()

void CImageButton::DrawItem(LPDRAWITEMSTRUCT dis) 
{
     CDC * dc = CDC::FromHandle(dis->hDC);  // Get a CDC we can use
     CRect r(dis->rcItem);                  // Copy the button rectangle
     CBitmap bitmap;                        // Handle to the bitmap we are drawing
     BITMAP bmpval;                         // Parameters of the bitmap

     int saved = dc->SaveDC();              // Save the DC for later restoration

     bitmap.Attach (LoadBitmap (AfxGetInstanceHandle(), MAKEINTRESOURCE(this->bitmap)));

     // Get the bitmap parameters, because we will need width and height
     ::GetObject(bitmap, sizeof(BITMAP), &bmpval);

     // Select the bitmap into a DC
     CDC memDC;
     memDC.CreateCompatibleDC(dc);
     int savemem = memDC.SaveDC();
     memDC.SelectObject(bitmap);

    dc->BitBlt(0, 0,                            // target x, y
           min(bmpval.bmWidth, r.Width() ),     // target width
           min(bmpval.bmHeight, r.Height() ),   // target height
           &memDC,                              // source DC
           0, 0,                                // source x, y
           SRCCOPY);

     memDC.RestoreDC(savemem);

     dc->RestoreDC(saved);
     ::DeleteObject(bitmap);
}

比你可以用的ressource编辑或动态添加一个正常CButton的(我认为,未测试),将它转换为ImageButton的与负载loadBitmapForButton位图。 该CButton的财产所有者绘制必须设置为true。 就这样:)

PS,我没有检查正确的内存释放代码到现在...我会很快这样做,如果我发现某事失踪,我将在我的岗位添加此。 如果别人能在这一点上帮助,请随时教我;)



文章来源: c++ - mfc / want to add bitmap to cbutton. CButton has no member setBitmap and BM_SETIMAGE is also not available for sendMessage