该方法读取的作用?很多情况下我们是使用http协议与后端进行交互的,那么我们MFC如何通过url地址来直接显示图片呢? 准备工作我的后台是使用.NET Core实现的,在这里我提供了图片的地址:http://localhost:5000/images/picture.jpg (当然该地址你们是使用不了的,读者可以找别人网站里面的图片地址来使用),例如:我直接在百度中打开一个图片,然后右键,效果如下: 实现过程1、创建一个MFC项目命名为:ShowImg,之后我们在资源视图中为我们的对话框添加button按钮,将Caption(标题)设置为获取图片,并双击创建button响应函数。 void CShowImgDlg::showimg(char* imgpath) { if (finder.FindFile(imgpath)) { CRect rect; m_picture.GetClientRect(&rect); CImage img; img.Load(imgpath); CDC *pDC = m_picture.GetWindowDC(); img.Draw(pDC->GetSafeHdc(), rect); ReleaseDC(pDC); } } 7、我们回到我们的button响应函数中代码如下:
void CShowImgDlg::OnBnClickedButton() { // TODO: 在此添加控件通知处理程序代码 showimg((LPTSTR)(LPCTSTR)SavePic("http://localhost:5000/images/picture.jpg")); } 8、这里会发现我们还没有实现SavePic这个函数,我们这里显示图片实际上是先将图片保存到了本地然后再显示出来的,之前我尝试过直接显示,好像没成功,希望知道做的兄弟可以跟我说说。 CString CShowImgDlg::SavePic(CString strImgUrl) { DWORD length = 0; BYTE buffer[1024]; memset(buffer, 0, 1024); HINTERNET hInternet; hInternet = InternetOpen(_T("Testing"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if (hInternet == NULL) { return ""; } HINTERNET hUrl; hUrl = InternetOpenUrl(hInternet, strImgUrl, NULL, 0, INTERNET_FLAG_RELOAD, 0); if (hUrl == NULL) { InternetCloseHandle(hInternet); return ""; } BOOL hwrite; DWORD written; HANDLE hFile; CString path = CreateLocalPath(strImgUrl); hFile = CreateFile(path, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(hUrl); InternetCloseHandle(hInternet); return ""; } BOOL read; while (TRUE) { read = InternetReadFile(hUrl, buffer, sizeof(buffer), &length); if(length == 0) break; hwrite = WriteFile(hFile, buffer, sizeof(buffer), &written, NULL); if (hwrite == 0) { CloseHandle(hFile); InternetCloseHandle(hUrl); InternetCloseHandle(hInternet); return ""; } } CloseHandle(hFile); InternetCloseHandle(hUrl); InternetCloseHandle(hInternet); return path; } 创建图片路径函数 CString CShowImgDlg::CreateLocalPath(CString strImgUrl) { CString filename = strImgUrl.Right(strImgUrl.ReverseFind('/')); CString folderpath = "./urlPic"; // 判断文件夹是否存在 if (_access(folderpath, 0) == -1) { int flag = _mkdir(folderpath); if (0 != flag) { return ""; } } CString str = folderpath + "/" + filename; return str; } 到这里我们的代码写完了,运行项目点击获取图片按钮即可显示图片啦! |
|