MFC绘制bmp图片背景

参考:https://blog.csdn.net/thanklife/article/details/80305285

一、添加OnEraseBkgnd函数(或OnDraw、OnPaint函数)

该方法是在指定位置加载位图

BOOL CbitmapDlg::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CBitmap bitmap;
    bitmap.LoadBitmap(IDB_BITMAP2); //从资源中加载图片
    BITMAP bmp;
    bitmap.GetBitmap(&bmp); //获取图片大小信息
    CDC dcCompatible;
    dcCompatible.CreateCompatibleDC(pDC);
    dcCompatible.SelectObject(bitmap);
    
    CRect rect;
    GetClientRect(&rect);
    //pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
    pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,
                    bmp.bmWidth,bmp.bmHeight,SRCCOPY);
    return TRUE;
}  

对话框OnPaint函数绘制

//CBitmap bmp_bkg;
//bmp_bkg.LoadBitmap(IDB_BITMAP1);  //载入背景图片
void CMyMusicPlayerDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		//绘制背景图片
		BITMAP bmp;
		bmp_bkg.GetBitmap(&bmp); //获取图片大小信息
		CDC dcCompatible;
		dcCompatible.CreateCompatibleDC(&dc);
		dcCompatible.SelectObject(bmp_bkg);
		CRect rect;
		GetClientRect(&rect); //735 472
		dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

		CBrush mybrush;
		mybrush.CreateSolidBrush(RGB(177,161,148));
		CRect myrect(0, 390, 735, 472);
		dc.FillRect(myrect, &mybrush); //底部灰色控制栏

		CDialogEx::OnPaint();
	}
}

二、利用控件加载位图

添加一个静态文本控件/按钮,设置BITMAP属性,再SetBitmap

//CBitmap restart;
BOOL CMFC_DrawView::PreCreateWindow(CREATESTRUCT& cs)
{
	restart.LoadBitmap((LPCTSTR)IDB_BITMAP1)  //从资源中加载图片
	return CView::PreCreateWindow(cs);
}

int CMFC_DrawView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	CButton* pButton=new CButton;
	pButton->Create(L"restart",WS_CHILD|WS_VISIBLE|BS_BITMAP,CRect(365, 20, 425, 80),this,ID_RESTART_BUTTON);
	//pButton->ModifyStyle(0,BS_BITMAP); //设置BS_BITMAP属性
	pButton->SetBitmap((HBITMAP)restart);  //设置控件bmp图片

	SetTimer(MY_TIMEER, 1000, NULL);
	
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	return 0;
}

三、补充-几种加载位图资源的方法

1、加载图标

LoadIcon函数要加载位图,要使用CWinApp的成员函数LoadIcon才行。当你查看MSDN的时候,会发现,LoadIcon可以是CWinApp的Class member函数,也可以是windows api函数。说实话,windows api函数我不知道怎么使用,呵呵,大家可以自己去验证下能不能加载。这里既然说了是CWinApp函数,我们的MFC程序都有一个全局的变量,theApp。这个变量就是CWinApp类的对象,只需要使用theApp.LoadIcon()就可以了。当然,也可以使用AfxGetApp()获得CWinApp指针,比如AfxGetApp()->LoadIcon();

函数原型:
CWinApp::LoadIcon
HICON LoadIcon( LPCTSTR lpszResourceName ) const;   //这一种是从硬盘上加载ICON,传入的参数是文件路径,比如“F:\\123.ico”;

HICON LoadIcon( UINT nIDResource ) const;                        //这种是从工程资源中加载ICON,传入参数是资源ID,比如IDC_ICON1.

简单举例:

(1)从硬盘加载

HICON hIcon = NULL;

hIcon  = theApp.LoadIcon("F:\\123.ico");

或者

hIcon  = AfxGetApp()->LoadIcon("F:\\123.ico");

(2)从资源加载

HICON hIcon = NULL;

hIcon = AfxGetApp()->LoadIcon(IDC_ICON1);

是不是很简单,这样就完成了图标的加载了。

2、位图的加载(从资源中加载)

位图的加载也很简单,我们使用CBItmap的成员函数LoadBitMap();

函数声明:
CBitmap::LoadBitmap
BOOL LoadBitmap( LPCTSTR lpszResourceName );     //从硬盘加载位图

BOOL LoadBitmap( UINT nIDResource );                           //从资源加载位图

举例:

CBitmap bitmap;

bitmap.LoadBitmap("F:\\a.bmp");

或者

bitmap.LoadBitmap(IDB_BITMA1);

3、通用加载图片方式(从文件中加载)

这种方式,使用LoadImage来加载,这种方式可以去试试。

举例:

HBITMP hBitmap=(HBITMAP)::LoadImage(NULL,pszFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//

pszFileName

是文件路径。 LR_LOADFROMFILE表示从文件中加载。
或者

HICON hIcon = (HICON)::LoadImage(NULL,pszFileName,IMAGE_ICON,0,0,LP_LOADFROMFILE);

你可能感兴趣的:(MFC)