像拖放一样使用鼠标移动位图图像

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。

【讨论】:

以上是关于像拖放一样使用鼠标移动位图图像的主要内容,如果未能解决你的问题,请参考以下文章

我们如何将位图图像存储到移动内存中?

使用 createJS 和 Canvas 拖动以调整位图大小

如何在android中结合覆盖位图和捕获的图像?

通过倒置矩阵移动位图,位图移动后消失

MFC 对话框 位图按钮 失去焦点

为啥在 glfw 窗口上没有使用 opengl 显示位图图像?在 C++ 中读取位图图像文件时出现问题