你需要定义几个标志变量用来表示鼠标左键按下,鼠标当前位置
比如:
BOOL m_leftMouseDown; // 左键是否按下的标准变量
BOOL m_isMouseInBitmapRound; // 鼠标在当前位图范围内吗
CPoint m_oldMousePosition; // 上一次鼠标所在位置
CPoint m_currentMousePosition; // 当前鼠标所在位置
CPoint m_bmpStartPosition; // 位图起始位置
UINT m_bmpWidth; // 位图宽度
UINT m_bmpHeight; // 位图高度
CBitmap m_bitmap; // 在对话框构造函数中LoadBitmap()加载位图,以后程序中就可以随便引用了
// 在鼠标左键按下的消息响应函数中设置标志粘贴
void OnLeftMouseDown(CPoint pt)
{
m_leftMouseDown = TRUE;
m_isMouseInBitmapRound = IsMouseInBitmapRound(pt);
}
// 在鼠标左键弹起的消息响应函数中设置标志
void OnLeftMouseUp()
{
m_leftMouseDown = FALSE;
}
// 在鼠标左键移动的消息响应函数中编写代码
void OnLeftMouseMove(CPoint pt)
{
// 鼠标在位图上按下左键
if(m_leftMouseDown & m_isMouseInBitmapRound)
{
m_currentMousePosition = pt;
// 计算移动的距离
int offsetX = m_currentMousePosition.x - m_oldMousePosition.x;
int offsetY = m_currentMousePosition.y - m_oldMousePosition.y;
// 更新位图显示的起始位置
int m_bmpStartPosition.x += offsetX;
int m_bmpStartPosition.y += offsetY;
// 调用BitBlt 复制位图 或者Invalidate(TRUE) 然后在OnDraw()中BitBlt,参数是更新后的起始位置
// 将当前位置置为旧, 否则不能连续拖动好几次
m_oldMousePosition = m_currentMousePosition;
// 大概就是这样
}
}
BOOL IsMouseInBitmapRound(CPoint mousePoint)
{
int x = mousePoint.x;
int y = mousePoint.y;
int bmp_x = m_bmpStartPosition.x;
int bmp_y = m_bmpStartPosition.y;
if( x >bmp_x & x bmp_y & y {
return TRUE;
}
return FALSE;
}