mfc 选择文件并显示

void CtestSendDlg::FillBitmapInfo(BITMAPINFO* bmi, int width, int height, int bpp)
{
	ASSERT(bmi && width>0 && height>0 && (bpp==8 || bpp==24 || bpp==32));


	BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);

	memset((void *)bmih, 0x00, sizeof(BITMAPINFOHEADER));
	bmih->biSize = sizeof(BITMAPINFOHEADER);
	bmih->biWidth = width;
	bmih->biHeight = -abs(height);
	bmih->biPlanes = 1;
	bmih->biBitCount = bpp;
	bmih->biCompression = BI_RGB;

	if (8 == bpp)	{
		RGBQUAD* palette = bmi->bmiColors;
		for (int i = 0; i < 256; i++)	{
			palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
			palette[i].rgbReserved = 0;
		}
	}
}


void CtestSendDlg::DisplayOpencvImg(IplImage *pImg, HDC hdc, CRect& rect )
{
	 BITMAPINFO bmi;

	FillBitmapInfo( &bmi, pImg->width, pImg->height, 24 );

	if(bmi.bmiHeader.biBitCount== 8)
	{
		HPALETTE hpal=NULL;
		HPALETTE hOldPal=NULL;
		::SetPaletteEntries(hpal,0,256,(LPPALETTEENTRY)bmi.bmiColors);
		hOldPal = ::SelectPalette(hdc, hpal, TRUE);
	}

	::SetStretchBltMode(hdc, COLORONCOLOR);
	::StretchDIBits(hdc,rect.left,rect.top,rect.Width(),rect.Height(),0,0,
		pImg->width,pImg->height,pImg->imageData,&bmi,DIB_RGB_COLORS,SRCCOPY); 
}


 
void CtestSendDlg::OnBnClickedButtonImg()
{
	// TODO: 在此添加控件通知处理程序代码


	CString FilePathName;
	CFileDialog filedlg(true); //显示打开对话框


	filedlg.m_ofn.lpstrTitle="打开";
	filedlg.m_ofn.lpstrFilter="所有图片文件(*.bmp;*.jpg;*.jpeg;*.png)|*.bmp;*.jpg;*.jpeg;*.png|位图文件(*.bmp)|*.bmp|JPEG(*.jpg;*.jpeg)|*.jpg;*.jpeg|PNG(*.png)|*.png";


	if(IDOK == filedlg.DoModal())
    {
		FilePathName=filedlg.GetPathName();
		IplImage* srcImg = cvLoadImage( FilePathName );
		if( !srcImg )
		{
			AfxMessageBox( "你选择的不是照片" );
			return;
		}


		GetDlgItem(IDC_EDIT_PATH)->SetWindowTextA(FilePathName.GetBuffer());


		//取出文件路径,将文件的路径放入FilePath 
		UpdateData(FALSE);


		CRect   rect;


		CWnd *pWnd = NULL;
		pWnd = GetDlgItem(IDC_SHOW_IMG);//获取控件句柄   
		pWnd->GetClientRect(&rect);//获取句柄指向控件区域的大小   


		CDC *pDc = NULL;
		pDc = pWnd->GetDC();//获取picture的DC


		GetDlgItem(IDC_EDIT_PATH)->GetWindowTextA(FilePathName);
		IplImage* dstImg = cvCreateImage( cvSize( rect.right, rect.bottom ), srcImg->depth, srcImg->nChannels );


		cvResize( srcImg, dstImg );
		DisplayOpencvImg( dstImg, *pDc, rect );


		cvReleaseImage( &srcImg );
		cvReleaseImage( &dstImg );
		ReleaseDC(pDc); 
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MFC中解压ZIP文件显示进度,可以使用Windows API中的ZipArchive类和ZipFile类。以下是一个简单的示例代码,可以在MFC应用程序中使用: ```c++ #include <iostream> #include <fstream> #include <Windows.h> #include <zipapi.h> // 回调函数,用于显示解压进度 BOOL CALLBACK MyProgressCallback(ZIP_PROGRESS_CALLBACK_REASON reason, DWORD64 bytesProcessed, DWORD64 totalBytesToProcess, PVOID userData) { int progress = (int)(bytesProcessed * 100 / totalBytesToProcess); std::cout << "Unzipping: " << progress << "%" << std::endl; return TRUE; } void UnzipFile(LPCTSTR zipFileName, LPCTSTR destFolder) { // 创建ZipArchive对象 ZipArchive zipArchive; if (!zipArchive.Open(zipFileName)) { std::cout << "Failed to open zip file" << std::endl; return; } // 获取ZIP文件中的文件数量 int fileCount = zipArchive.GetFileCount(); // 遍历ZIP文件中的所有文件 for (int i = 0; i < fileCount; i++) { // 获取文件名和文件大小 CString fileName = zipArchive.GetFileName(i); DWORD fileSize = zipArchive.GetFileSize(i); // 创建ZipFile对象 ZipFile zipFile; if (!zipFile.Open(&zipArchive, i)) { std::cout << "Failed to open zip file for reading" << std::endl; continue; } // 创建目标文件 CString destFilePath = destFolder + fileName; std::ofstream destFile(destFilePath, std::ios::out | std::ios::binary); if (!destFile) { std::cout << "Failed to create destination file" << std::endl; continue; } // 解压文件显示进度 if (!zipFile.ExtractFile(&MyProgressCallback, NULL, &destFile)) { std::cout << "Failed to extract file: " << fileName << std::endl; continue; } std::cout << "Extracted file: " << fileName << std::endl; } } int main() { LPCTSTR zipFileName = L"C:\\test.zip"; LPCTSTR destFolder = L"C:\\test\\"; UnzipFile(zipFileName, destFolder); return 0; } ``` 在上面的示例代码中,我们首先通过ZipArchive类打开ZIP文件,然后遍历ZIP文件中的所有文件,并使用ZipFile类将文件解压到目标文件夹中。在解压过程中,我们使用回调函数MyProgressCallback来显示解压进度,该函数在解压每个文件之前都会被调用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值