像拖放一样使用鼠标移动位图图像
Posted
技术标签:
【中文标题】像拖放一样使用鼠标移动位图图像【英文标题】:Move a Bitmap image with mouse like drag & drop 【发布时间】:2014-05-04 19:46:35 【问题描述】:所以这就是我想做的。我在 WM_CREATE 上加载这样的位图图像
g_hbmCar = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_CAR));
接下来是捕捉是否按下鼠标左键以及箭头是否在图像上并获取这样的坐标(如果我是对的):
case WM_LBUTTONDOWN:
RECT rcClient;
// check if the cursor is within the image.x limits
if(LOWORD(lParam)>=g_carInfo.x && LOWORD(lParam)<=g_carInfo.x+g_carInfo.width)
//check if the cursor is within the image.y limits
if(HIWORD(lParam)<=g_carInfo.y && HIWORD(lParam) >= g_carInfo.y + g_carInfo.height)
case WM_MOUSEMOVE :
if (wParam & MK_LBUTTON )
HDC hdc = GetDC (hwnd) ;
g_carInfo.x +=LOWORD (lParam);
g_carInfo.y += HIWORD(lParam);
UpdateCar(&rcClient,&g_carInfo);
DrawCar(hdc,&rcClient,hbr, g_hbmCar, g_hbmMask,g_carInfo);
ReleaseDC (hwnd, hdc) ;
break;
break;
但这似乎不起作用:(任何帮助将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:当您的代码正在执行 case WM_LBUTTONDOWN 时,不会发生 case WM_MOUSEMOVE。您需要将操作分为 3 个步骤。
(1) 如果点击在图像范围内,则调用 SetCapture。这确保您将收到所有后续的 WM_MOUSEMOVE 消息,即使鼠标移到窗口外也是如此。从 WM_LBUTTONDOWN 处理程序返回。
(2) 在 WM_MOUSEMOVE 处理程序中,如果 GetCapture 指示您已捕获鼠标,则进行绘画。或者,简单的 InvalidateRect 可能更容易更好,然后让后续的 WM_PAINT 绘制对象。
(3) 在 WM_LBUTTONUP 处执行 ReleaseCapture。
【讨论】:
以上是关于像拖放一样使用鼠标移动位图图像的主要内容,如果未能解决你的问题,请参考以下文章