【问题标题】: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;

但这似乎不起作用:(任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: winapi gdi win32gui


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多