使用picture控件动态显示图片方法

### 使用Picture控件动态显示图片方法 #### 一、控件适应于图片尺寸 在C++ MFC环境中,为了使Picture控件能够根据所显示图片的实际尺寸进行自适应调整,可以采用以下步骤: 1. **添加Picture控件及成员变量**: - 在资源视图中添加一个Picture控件,并将其ID修改为`IDC_PICTURE`。 - 在类中声明一个`CBitmap`类型的成员变量`m_bmp`,用于存储要显示的图片。 2. **加载图片并获取信息**: - 在`OnInitDialog()`函数中检查`m_bmp`是否已存在对象,如果存在则先删除对象。 - 使用`::LoadImage()`函数以绝对路径加载一张BMP格式的图片。 - 如果图片加载成功,则通过调用`m_bmp.Attach(hbmp)`将位图对象附加到`m_bmp`。 - 获取加载的位图信息,包括宽度和高度。 3. **调整控件大小以适应图片**: - 获取`IDC_PICTURE`控件的当前矩形区域。 - 调整控件的大小以适应图片的宽度和高度。 4. **在OnPaint()函数中绘制图片**: - 创建一个`CPaintDC`对象来获取控件的设备上下文。 - 创建兼容设备上下文`CDC memdc`,以及与之兼容的位图对象。 - 将创建的位图对象选入`memdc`中。 - 使用`BitBlt`函数将位图绘制到`memdc`上。 - 创建模式刷`CBrush brush`,并填充背景。 - 最后使用`BitBlt`再次绘制,完成图片的显示。 #### 二、图片适用于控件尺寸 当需要确保图片始终适合Picture控件的大小时,可以采用如下方法: 1. **获取控件信息**: - 获取`IDC_PICTURE`控件的窗口句柄。 - 获取控件的客户端矩形区域。 2. **加载并显示图片**: - 定义`IPicture* pPic`接口用于显示图片。 - 设置要显示的图片路径。 - 打开图片文件并获取文件大小。 - 使用`LoadPicture`函数加载图片至`IPicture`接口。 3. **绘制图片**: - 在`OnPaint()`函数中,获取控件的设备上下文。 - 使用`DrawPicture`函数将图片绘制到控件上。 ### 代码示例 接下来提供更为详细的代码实现细节: #### 控件适应于图片尺寸 ```cpp void CMyDlg::OnInitDialog() { CDialogEx::OnInitDialog(); if (m_bmp.m_hObject != NULL) m_bmp.DeleteObject(); // 加载图片 HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), "1.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE); if (hbmp == NULL) return false; m_bmp.Attach(hbmp); DIBSECTION ds; BITMAPINFOHEADER& bminfo = ds.dsBmih; m_bmp.GetObject(sizeof(ds), &ds); int cx = bminfo.biWidth; int cy = bminfo.biHeight; // 调整控件大小 CRect rect; GetDlgItem(IDC_PICTURE)->GetWindowRect(&rect); ScreenToClient(&rect); GetDlgItem(IDC_PICTURE)->MoveWindow(rect.left, rect.top, cx, cy, TRUE); } void CMyDlg::OnPaint() { CPaintDC dc(GetDlgItem(IDC_PICTURE)); CRect rcClient; GetDlgItem(IDC_PICTURE)->GetClientRect(&rcClient); CDC memdc; memdc.CreateCompatibleDC(&dc); CBitmap bitmap; bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()); memdc.SelectObject(&bitmap); CWnd::DefWindowProc(WM_PAINT, (WPARAM)memdc.m_hDC, 0); CDC maskdc; maskdc.CreateCompatibleDC(&dc); CBitmap maskbitmap; maskbitmap.CreateBitmap(rcClient.Width(), rcClient.Height(), 1, 1, NULL); maskdc.SelectObject(&maskbitmap); maskdc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &memdc, rcClient.left, rcClient.top, SRCCOPY); CBrush brush; brush.CreatePatternBrush(&m_bmp); dc.FillRect(rcClient, &brush); dc.BitBlt(rcClient.left, rcClient.top, rcClient.Width(), rcClient.Height(), &memdc, rcClient.left, rcClient.top, SRCPAINT); brush.DeleteObject(); } ``` #### 图片适用于控件尺寸 ```cpp void CMyDlg::OnPaint() { CPaintDC dc(GetDlgItem(IDC_PICTURE)); CWnd* pWnd = GetDlgItem(IDC_PICTURE); CRect rect; pWnd->GetClientRect(&rect); // 加载并显示图片 IPicture* pPic; // 假设这里已经实现了加载图片至pPic的过程 // 绘制图片 OleDraw(pPic, OleWHDC(dc.m_hDC), rect.left, rect.top, rect.right, rect.bottom, NULL, NULL, OLE_INPLACE_FRAME | OLE_INPLACE_ACTIVE); } ``` 以上是基于C++ MFC环境下的动态显示图片的方法。这些方法不仅能够有效地处理不同尺寸的图片,还能够根据需求选择不同的显示策略,确保图片能够在界面上得到良好的展示。














- vicxiaoyun2013-06-25适合初学者学习,正好要做显示,资源对我有点用处。
- lisiyin8811022013-08-07用途比较单一,但是能用就不错了
- hanfeng0904050042012-11-29程序还行,对于初学者还不错

- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 科技成果转化新范式:技术经理人的能力升级路径.docx
- 科技成果转化新引擎:数智平台赋能高效对接.docx
- 科技园区成果转化升级之道.docx
- 科技转化瓶颈待解,区域创新体系如何破局.docx
- 科技转化新范式:节点赋能与生态协同.docx
- 破局转化困局,重塑技术经纪新范式.docx
- 区域科技成果转化服务:创新驱动区域经济发展的新引擎.docx
- 区域科技成果转化服务:构建高效协同创新生态.docx
- 区域科技成果转化服务:园区运营效率新引擎.docx
- 区域科技成果转化服务:提升园区运营效率的新引擎.docx
- 区域科技成果转化服务创新实践.docx
- 区域科技成果转化服务新模式:提升效率与协同创新.docx
- 区域科技成果转化服务新模式探索.docx
- 区域科技成果转化服务新模式探索与实践.docx
- 区域科技成果转化服务新模式探索与实践_1.docx
- 数智赋能:高校院所科技成果转化新路径.docx


