C++MFC对话框中picture控件加载好的图片,怎样通过鼠标操作使得图片平移和放缩
时间: 2023-10-07 13:10:25 浏览: 210
在 MFC 对话框中,可以通过 CStatic 控件来显示图片,而且 CStatic 控件已经提供了鼠标事件的处理函数,因此可以很方便地实现图片的平移和放缩。
以下是实现方法的大致步骤:
1. 在对话框中添加一个 CStatic 控件,并将其类型设置为“图片”(SS_BITMAP)。
2. 在对话框类的头文件中添加成员变量,用于保存图片的句柄和位置信息:
```
HBITMAP m_hBitmap; // 图片句柄
CPoint m_ptOrigin; // 原点坐标
CSize m_sizeBitmap; // 图片大小
```
3. 在 OnInitDialog 函数中,使用 LoadImage 函数加载图片,并获取图片的大小信息:
```
m_hBitmap = (HBITMAP)LoadImage(NULL, L"image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
BITMAP bm;
GetObject(m_hBitmap, sizeof(BITMAP), &bm);
m_sizeBitmap.cx = bm.bmWidth;
m_sizeBitmap.cy = bm.bmHeight;
```
4. 在 OnPaint 函数中,使用 CDC 类的函数将图片绘制到控件上:
```
CPaintDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap* pOldBitmap = dcMem.SelectObject(CBitmap::FromHandle(m_hBitmap));
dc.BitBlt(m_ptOrigin.x, m_ptOrigin.y, m_sizeBitmap.cx, m_sizeBitmap.cy, &dcMem, 0, 0, SRCCOPY);
dcMem.SelectObject(pOldBitmap);
```
5. 在 OnLButtonDown 函数中,记录鼠标按下时的位置:
```
SetCapture();
m_ptOrigin = point;
```
6. 在 OnMouseMove 函数中,计算鼠标移动的距离,并根据距离调整图片的位置:
```
if (GetCapture() == this) {
CPoint ptOffset = point - m_ptOrigin;
m_ptOrigin = point;
m_ptOrigin.x = max(m_ptOrigin.x, -m_sizeBitmap.cx);
m_ptOrigin.x = min(m_ptOrigin.x, GetSystemMetrics(SM_CXSCREEN));
m_ptOrigin.y = max(m_ptOrigin.y, -m_sizeBitmap.cy);
m_ptOrigin.y = min(m_ptOrigin.y, GetSystemMetrics(SM_CYSCREEN));
Invalidate();
}
```
7. 在 OnLButtonUp 函数中,释放鼠标捕获:
```
ReleaseCapture();
```
8. 在 OnMouseWheel 函数中,根据滚轮的方向调整图片的大小,并根据放缩中心点的位置调整图片的位置:
```
ScreenToClient(&point);
double fScale = (double)(wParam > 0 ? 1.1 : 0.9);
m_sizeBitmap.cx = (int)(m_sizeBitmap.cx * fScale);
m_sizeBitmap.cy = (int)(m_sizeBitmap.cy * fScale);
m_ptOrigin.x = (int)(point.x - fScale * (point.x - m_ptOrigin.x));
m_ptOrigin.y = (int)(point.y - fScale * (point.y - m_ptOrigin.y));
m_ptOrigin.x = max(m_ptOrigin.x, -m_sizeBitmap.cx);
m_ptOrigin.x = min(m_ptOrigin.x, GetSystemMetrics(SM_CXSCREEN));
m_ptOrigin.y = max(m_ptOrigin.y, -m_sizeBitmap.cy);
m_ptOrigin.y = min(m_ptOrigin.y, GetSystemMetrics(SM_CYSCREEN));
Invalidate();
```
需要注意的是,为了避免图片超出屏幕范围,需要对图片的位置进行一些限制。另外,放缩时需要将鼠标坐标转换成相对于控件的坐标。
阅读全文