这是我关于堆栈溢出的第一个问题,我希望我能做好每件事:
正如我的titel中所描述的,我正在使用mfc进行一个visual (2012)项目。我尝试添加一个位图到我的c按钮,它被插入到我的对话框的设计视图中。
我所读过的所有关于这方面的文章,都是用setBitmap或sendMessage来描述的。我总是在对话框的onInit()-function中尝试这样做。当我(尝试)像这样使用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);它会导致智能感知-错误:
IntelliSense:类"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); 首先,我得到了另一个IntelliSense错误:
IntelliSense:标识符"BM_SETIMAGE“未定义
就像我在另一篇文章中看到的那样,我自己定义了"BM_SETIMAGE“:
#define BM_SETIMAGE 0x00F7现在代码可以编译了,但是按钮仍然没有显示位图.由于互联网上的每一篇文章都使用这两种解决方案中的一种,我很无助。有人想出什么主意了吗?如果没有,也感谢你的阅读:)
发布于 2015-01-09 10:39:16
所以我想我找到了一个解决方案:)我想我把它发到这里,其他人也可能会用到它。此外,我也不能让这个问题不被回答。
我的解决方案来自http://www.flounder.com/bitmapbutton.htm,适合我的需要。现在它可以与Microsoft Embedded Compact2013一起使用。给船长!
我的简短版本如下:
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);
}无法使用重新源编辑器或动态添加普通的CButton (我认为没有测试),将其转换为ImageButton并使用loadBitmapForButton加载位图。必须将CButton的属性所有者绘图设置为true。(就这些:)
PS,我直到现在才检查了正确的内存释放代码.我很快就会这么做,如果我发现丢失了什么,我会在我的帖子中添加这个。如果有人能在这一点上有所帮助,请随时教我;)
https://stackoverflow.com/questions/27451274
复制相似问题