MFC中清除Picture Control控件绘制的图片

解决MFC项目中PictureControl控件随窗口大小变化自动调整位置的问题,通过RedrawWindow()方法重绘指定区域,避免图片重影。
部署运行你感兴趣的模型镜像

需求,图片随窗口大小变化而移动

有个MFC项目,想让Picture Control控件随着窗口尺寸大小自动调整位置。
直接在窗口的OnSize()事件中使用MoveWindow()调整Picture Control控件的位置就实现了图片随窗口移动。可这效果…

默认效果居然是这样

在这里插入图片描述
图片是随着窗口移动了,可之前绘制的图片并没有被清除。又直接绘制新的图片。然后就有重影了。
在网上找了一圈,发现这个Picture Control控件并没有清除之前绘制内容的方法,有说采用禁用Picture Control控件再启用的方法,试了下效果也不理想。
这里实际是要让窗口刷新旧图片所在区域,然后再绘制新图片。于是我尝试使用 RedrawWindow()先重绘指定区域。

	CRect rectDlg;
	int w2;
	GetClientRect(rectDlg);//获得窗体的大小
	w2 = rectDlg.Width();//取窗口宽度
	RedrawWindow(CRect(0, 0, w2, 200));//重绘指定区域

我这个图片只出现在指定区域,所以我直接对窗口上边200像素的全部区域重绘了。
如果还要减少重绘区域,可以在绘制图片时记录图片所在区域。重绘时先把上一图片的区域重绘。

处理后的效果如下

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

<think>根据用户的问题,用户希望了解MFC中如何对Picture Control控件进行子类化,以及如何在多个对话框中使用这个子类化的控件。结合提供的引用内容,我们可以提取相关信息: 1. 引用[1]提到ControlWizard配置选项,包括使控件可见、激活等,这间接说明子类化控件时需要关注这些属性。 2. 引用[2]提到了对话框资源ID(如IDD_ABOUTBOX)和如何在代码中调用对话框,这为在多个对话框中使用控件提供了参考。 3. 引用[3]展示了获取控件矩形并转换为父窗口坐标的代码片段,这可能用于子类化控件时处理绘图或位置计算。 4. 引用[4]是无关内容(作者说明),可忽略。 针对用户需求,回答应包含: 1. 子类化Picture Control的步骤:创建自定义控件类,重载关键函数(如OnPaint)。 2. 在单个对话框中使用子类化控件的方法:替换原有Picture Control控件为自定义类。 3. 在多个对话框中使用的方法:在不同对话框中重复步骤2,注意资源ID管理。 由于引用内容有限,我们将补充标准MFC子类化实现方法: - 子类化:通过继承CStatic或CWnd创建自定义类,重写DrawItem或OnPaint实现自定义绘制。 - 多对话框使用:在资源编辑器中为每个对话框添加Picture Control,然后通过DDX_Control或SubclassDlgItem将自定义类绑定到控件。 具体步骤: </think>### MFC子类化Picture Control控件及在多个对话框中使用的方法 #### 一、Picture Control子类化步骤 1. **创建自定义控件类** 新建继承自`CStatic`的类(如`CMyPictureCtrl`),重写以下关键函数: ```cpp // MyPictureCtrl.h class CMyPictureCtrl : public CStatic { public: DECLARE_DYNAMIC(CMyPictureCtrl) virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); // 重写绘制函数 BOOL LoadImage(UINT nIDResource); // 自定义图像加载方法 }; // MyPictureCtrl.cpp void CMyPictureCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect = lpDrawItemStruct->rcItem; // 自定义绘制逻辑(示例:绘制红色边框) pDC->Rectangle(rect); pDC->TextOut(10, 10, _T("子类化控件")); } BOOL CMyPictureCtrl::LoadImage(UINT nIDResource) { // 实现图像加载逻辑 return TRUE; } ``` 2. **资源文件配置** 在对话框资源编辑器中: - 添加Picture Control控件 - 设置属性:`Type = Rectangle`,`ID = IDC_MY_PICTURE`[^1] 3. **控件绑定(单对话框)** 在对话框类中使用`DDX_Control`绑定: ```cpp // MyDialog.h CMyPictureCtrl m_wndPicture; // MyDialog.cpp void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_MY_PICTURE, m_wndPicture); // 绑定自定义控件 } ``` #### 二、多对话框复用方法 1. **动态子类化技术** 在目标对话框的`OnInitDialog()`中调用: ```cpp BOOL CAnotherDialog::OnInitDialog() { CDialog::OnInitDialog(); m_wndPicture.SubclassDlgItem(IDC_PICTURE_IN_DIALOG2, this); // 动态绑定 m_wndPicture.LoadImage(IDB_BITMAP1); // 调用自定义方法 return TRUE; } ``` 2. **控件复用关键点** - **资源ID管理**:不同对话框使用独立控件ID(如`IDC_PIC_DLG1`, `IDC_PIC_DLG2`) - **通用功能封装**: ```cpp // 在自定义控件类中添加通用方法 void CMyPictureCtrl::SetBorderColor(COLORREF clr) { m_borderColor = clr; // 存储颜色值 Invalidate(); // 触发重绘 } ``` 3. **坐标转换处理** 当需要跨窗口坐标转换时(如获取相对位置)[^3]: ```cpp CRect rc; GetWindowRect(&rc); // 获取屏幕坐标 ScreenToClient(GetParent()->GetSafeHwnd(), (LPPOINT)&rc); // 转父窗口坐标 ``` #### 三、注意事项 1. **内存管理** 在多对话框中使用时,需在对话框的`OnDestroy()`中释放图像资源: ```cpp void CMyDialog::OnDestroy() { m_wndPicture.FreeResources(); // 自定义资源释放方法 CDialog::OnDestroy(); } ``` 2. **消息处理** 重写`PreTranslateMessage()`处理特定消息: ```cpp BOOL CMyPictureCtrl::PreTranslateMessage(MSG* pMsg) { if (pMsg->message == WM_LBUTTONDOWN) { // 处理点击事件 return TRUE; } return CStatic::PreTranslateMessage(pMsg); } ``` 3. **设计时支持** 为控件添加ActiveX容器的插入支持(参考引用[1]): - 在控件属性中启用`Activates when visible` - 实现`About Box`(参考`IDD_ABOUTBOX`设计[^2]) > **示例项目结构**: > `MyPictureCtrl.h/cpp` - 自定义控件类 > `Dialog1.h/cpp` - 对话框1绑定`IDC_PIC1` > `Dialog2.h/cpp` - 对话框2绑定`IDC_PIC2` > 资源文件中定义多个Picture Control资源 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值