使用鼠标移动位图图像,如拖动;下降

时间:2014-03-26 12:04:35

标签: winapi gdi win32gui

这就是我想做的事情。我在WM_CREATE

上加载了这样的Bitmap图像
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 个答案:

答案 0 :(得分:2)

在您的代码执行大小写WM_LBUTTONDOWN时,不会发生WM_MOUSEMOVE。您需要将操作分为3个步骤。

(1)如果点击在图像限制范围内,则调用SetCapture。这样可以确保您获得所有后续WM_MOUSEMOVE消息,即使鼠标移动到窗口外也是如此。从WM_LBUTTONDOWN处理程序返回。

(2)在WM_MOUSEMOVE处理程序中,如果GetCapture指示您已捕获鼠标,则执行绘制。或者,简单地使用InvalidateRect可能更容易也更好,然后让后续的WM_PAINT绘制对象。

(3)在WM_LBUTTONUP执行ReleaseCapture。