MFC子文档动态显示jpg图片方法
### MFC子文档动态显示JPG图片方法 #### 概述 Microsoft Foundation Classes(MFC)是Microsoft提供的一套用于Windows平台的C++类库,它简化了Windows应用程序的开发过程。本文将详细介绍如何在MFC的应用程序中实现子文档窗口动态加载并显示JPG格式的图片。 #### 前置条件 为了实现这一功能,首先需要确保项目已经包含了必要的MFC头文件,并且已经定义了用于显示图片的控件和相应的成员变量。以下是一些关键的步骤: 1. **包含头文件**:通过`#include <Afxwin.h>`引入MFC的核心库。 2. **定义控件**:在界面设计中添加一个静态控件(例如,ID为`IDC_PICTURE`),用于显示图片。 3. **定义成员变量**:如`HICON m_hIcon`用于保存图片资源的句柄,以及`CString str`用于存储图片路径。 #### 功能实现 实现动态显示图片的功能主要分为两个部分:打开文件对话框选择图片文件和在子文档窗口中渲染显示。 ##### 打开文件对话框 需要创建一个`CFileDialog`对象来让用户选择图片文件。示例代码如下: ```cpp void CMyDlg7::OnBnClickedButton1() { // 创建文件对话框对象 CFileDialog filedialog(TRUE, "jpg", "*.jpg", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "JPEG Files (*.jpg)|*.jpg|BMP Files (*.bmp)|*.bmp||", NULL); if (filedialog.DoModal() == IDOK) // 如果用户点击了“确定”按钮 { str = filedialog.GetPathName(); // 获取图片的完整路径 Invalidate(); // 使窗口无效,触发重绘事件 } } ``` 这里的`TRUE`表示这是一个打开文件的对话框,第二个参数指定默认的文件类型为JPG,第三个参数定义了过滤器,允许用户选择JPG或BMP文件。 ##### 在子文档中显示图片 当用户选择了图片后,需要在子文档窗口中进行显示。这一步骤主要涉及获取设备上下文、读取图片文件以及使用OLE技术渲染图片到控件上。示例代码如下: ```cpp void CMyDlg7::OnPaint() { // 如果窗口最小化,则显示图标 if (IsIconic()) { // 显示图标逻辑... } else { CDialog::OnPaint(); // 调用基类方法 // 如果已选择图片 if (str != "lew") { // 获取显示图片的控件 CWnd* pWnd = GetDlgItem(IDC_PICTURE); // 获取控件的客户区矩形 CRect rect; pWnd->GetClientRect(&rect); // 获取控件的设备上下文 CDC* pDC = pWnd->GetDC(); // 读取文件流 CFile file; IStream* pStm = nullptr; if (file.Open(str, CFile::modeRead) && file.GetStatus(str, fstatus) && ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = nullptr; if (hGlobal != nullptr && (pvData = GlobalLock(hGlobal)) != nullptr) { file.Read(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); } } // 使用OLE技术加载并渲染图片 IPicture* pPic = nullptr; if (SUCCEEDED(OleLoadPicture(pStm, fstatus.m_size, TRUE, IID_IPicture, (LPVOID*)&pPic))) { OLE_XSIZE_HIMETRIC hmWidth, hmHeight; pPic->get_Width(&hmWidth); pPic->get_Height(&hmHeight); // 在控件中渲染图片 pPic->Render(*pDC, 0, 0, rect.Width(), rect.Height(), 0, 0, hmWidth, -hmHeight, NULL); pPic->Release(); } } } } ``` 这段代码首先获取了控件的设备上下文,并通过读取文件流的方式加载图片,最后使用OLE技术渲染图片到指定的控件上。 #### 总结 本文详细介绍了如何在MFC应用程序中实现子文档窗口动态加载并显示JPG格式的图片。通过上述步骤,可以轻松地实现这一功能,提高应用程序的交互性和用户体验。需要注意的是,在实际应用过程中还需要考虑错误处理和资源释放等问题,以保证程序的稳定运行。
2、将picture控件的ID改为IDC_PICTURE
3、为对话框添加HICON m_hIcon变量和CString str,并在构造函数中定义 str = "lew";
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
4、为按钮添加消息函数
代码如下:
void CMyDlg7::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog* filedialog;
filedialog = new CFileDialog(TRUE,"jpg","*.jpg",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"JPEG文件(*.jpg)| *.jpg|BMP文件(*.bmp)|*.bmp||",NULL);
if(filedialog->DoModal()==IDOK)
{
str = filedialog->GetPathName();
Invalidate();
}
delete (filedialog);
}
5、重载OnPaint函数
代码如下:
void CMyDlg7::OnPaint()
{
if(IsIconic())
{
CPaintDC dc(this); //device context for painting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
- 复活的小鳖2014-12-15怎么说呢,代码还是可以学习的
- cgstian2013-07-03不太好,不是例子,只有代码。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助