1. 通过GDI+加载(加载图片 + 显示图片)
(1)先加载图片方法:
//方法I //CString转WCHAR(因为Image构造函数参数为宽字符) int l = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)sFile, -1, NULL, 0); wchar_t *w = new wchar_t[l]; memset(w, 0, l); INT N = MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)sFile, -1, w, l); Image image(w); delete[]w; //方法II CT2CW strFileName(sFile); Image image(strFileName); //方法III CT2CW strFileName(sFile); Image *pImage = Image::FromFile(strFileName);
(2)显示图片方法 --- 通常需要在重载方法 OnEraseBkgnd() 中来画图片
//方法I..图片直接显示到窗体上 HDC hDC = ::GetDC(m_hWnd); Graphics graphics(hDC); graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight()); //或graphics.DrawImage(pImage, 0, 0, pImage->GetWidth(), pImage->GetHeight()); //方法II..图片直接显示到窗体上 CDC *pDC = GetDC(); Graphics graphics(pDC->m_hDC); graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight()); //方法III..图片直接显示到窗体上 CClientDC dc(this); Graphics graphics(dc.m_hDC); //通过设备描述表句柄实例化一个 gdi+ Graphics 类成员 graphics.DrawImage(pImgBmp, 0, 0) //方法IV..图片显示到PictureCtrl控件上 CClientDC *pDC = new CClientDC(GetDlgItem(IDC_STATIC_PIC)); //注意CWindowDC,CClientDC,CPaintDC的区别 Graphics graphics(pDC->m_hDC); graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight()); delete pDC;
例如:
void CTestDlg::LoadPng() { CDC *pDC = GetDC(); Graphics graphics(pDC->m_hDC); CT2CW strFileName(sFile); Image image(strFileName); graphics.DrawImage(&image, 10,10, image.GetWidth(), image.GetHeight()); }
2. 通过CBitmap加载窗体背景
//先添加并初始化成员变量 CBitmap m_BackBmp; m_BackBmp.LoadBitmap(IDB_BITMAP1); //再背景窗体重绘 BOOL CConnectDlg::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 CDialogEx::OnEraseBkgnd(pDC); //窗体背景图片 CRect rcClient; GetClientRect(&rcClient); BITMAP bm; m_BackBmp.GetBitmap(&bm); CDC memDC; memDC.CreateCompatibleDC(pDC); CBitmap *pOldBmp = memDC.SelectObject(&m_BackBmp); pDC->StretchBlt(0, 0, rcClient.Width(), rcClient.Height(), &memDC, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); memDC.SelectObject(pOldBmp); memDC.DeleteDC(); return TRUE; }
2. 通过Cimage加载图片
//用于擦出背景 (场景:OnTimer()中定时擦出背景,OnEraseBkgnd()重绘背景,可实现图片的移动动画效果)
<span style="font-family: Arial, Helvetica, sans-serif;">HWND hwnd = GetSafeHwnd(); //获取窗口的HWND</span>
<span style="font-family: Arial, Helvetica, sans-serif;">::InvalidateRect( hwnd, NULL, true ); //或者 ::InvalidateRect( hwnd, NULL, false );</span>
<span style="font-family: Arial, Helvetica, sans-serif;">::UpdateWindow(hwnd);</span>
CDC *pDC = GetDC(); CImage Image; Image.Load(strPath); if (Image.IsNull()) { MessageBox(_T("没加载成功")); return -1; } if (Image.GetBPP() == 32) //确认该图像包含Alpha通道 { int i; int j; for (i=0; i<Image.GetWidth(); i++) { for (j=0; j<Image.GetHeight(); j++) { byte *pByte = (byte *)Image.GetPixelAddress(i, j); pByte[0] = pByte[0] * pByte[3] / 255; pByte[1] = pByte[1] * pByte[3] / 255; pByte[2] = pByte[2] * pByte[3] / 255; } } } Image.Draw(pDC->m_hDC,0,0); Image.Destroy(); ReleaseDC(pDC);
3. 加载.ico
(1).使用函数 LoadIcon() 载入图标。因为LoadIcon() 是类 CWinApp 的成员函数,同时函数 LoadIcon() 返回所载入图标的句柄。所以我们采用以下方法来调用函数 LoadIcon():
//加载ICO图片 HICON hIcon = AfxGetApp()->LoadIcon(IDI_ICON2); m_btnCannel.SetIcon(hIcon); //或 ((CButton*)GetDlgItem(IDC_BUTTON1))->SetIcon(m_hicn1);
但是这种方法并不能加载系统预定义图标,在CWinApp中还有个装载图标的函数,
(2)全局::LoadIcon(), ::SetIcon()
当然在MFC中可以调用全局函数来加载图标,但是如果要装载自己添加的图标资源,要注意下面几种写法:
HICON hIcon = ::LoadIcon(AfxGetApp()->m_hInstance,(LPCTSTR)IDI_ICON1); HICON hIcon = ::LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(ICON1)); HICON hIcon = ::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(ICON1)); ::SetIcon(hIcon, FALSE); 或 ::SetIcon(::LoadIcon(NULL, MAKEINTRESOURCE(ICON1)), FALSE);
以上都是正确的.由于添加的图标资源ID不是字符型的(在resource.h定义),所以要转换:
在前面加上LPCTSTR强制转换
用MAKEINTRESOURCE转换
它的定义如下:
#define MAKEINTRESOURCE(i) (LPCTSTR)((DWORD)((WORD)(i))),它的作用就是将资源标识转换为名称字符串
(3). 全局::LoadImage()
// Find correct resource handle HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(IDI_ICON1), RT_GROUP_ICON); // Set icon when the mouse is IN the button HICON hIconIn = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 0, 0, 0);
(4). 从文件加载
HICON hIconIn = (HICON)::LoadImage(NULL,"MyButtonBG.ico",IMAGE_ICON,100,150,LR_LOADFROMFILE);
4. 加载.bmp
//加载BMP图片 CBitmap Bitmap; Bitmap.LoadBitmap(IDB_BITMAP1); HBITMAP hBitmap = (HBITMAP)Bitmap.Detach(); m_btnCannel.SetBitmaps(hBitmap, RGB(255, 255, 255));