在WM_MOUSEMOVE中拖动和绘制边框?

时间:2017-05-06 01:39:22

标签: c++ winapi

我正在尝试实现一个功能,用户按下鼠标左键,在某处拖动鼠标,然后绘制一个“有边框的矩形”(没有任何填充的矩形显示下面的内容,所以基本上只是一个边框)

我有某些使用此代码:

         case WM_MOUSEMOVE:
              if (draw) {
                  endX = GET_X_LPARAM(lParam);
                  endY = GET_Y_LPARAM(lParam);
                  hdc = GetDC(hwnd);
                  SelectObject(hdc, GetStockObject(NULL_BRUSH));
                  Rectangle(hdc, startX, startY, endX, endY);
                  ReleaseDC(hwnd, hdc);
              }
            break;

(当触发WM_LBUTTONDOWN时,draw设置为true,当触发WM_LBUTTONUP时设置为false)。

这就是它的样子。我基本上想要这个,里面没有黑线,可能还有更厚的边框。 enter image description here

我遇到的问题是我无法弄清楚如何重绘矩形区域内“丢失”的内容。我想我应该使用InvalidateRect而不是Rectangle但是再次确定如何在WM_PAINT中重绘。也许我应该以完全不同的方式接近这个?这是我第一次使用Winapi。

1 个答案:

答案 0 :(得分:0)

感谢David Heffernan,我有一个解决方案:

case WM_MOUSEMOVE:
      if (draw) {
          // Get current mouse position
          endX = GET_X_LPARAM(lParam);
          endY = GET_Y_LPARAM(lParam);

          // Paint over previous rectangle
          hdc = GetDC(hwnd);
          hdcMem = CreateCompatibleDC(hdc);
          hbmOld = (HBITMAP) SelectObject(hdcMem, screenshot);
          BitBlt(hdc, 0, 0, fullW, fullH, hdcMem, 0, 0, SRCCOPY);
          SelectObject(hdcMem, hbmOld);

          // Change to NULL_BRUSH (no fill)
          hBrush = (HBRUSH) GetStockObject(NULL_BRUSH);
          hOldBrush = (HBRUSH) SelectObject(hdc, hBrush);

          // Change to red pen
          hPen = GetStockObject(DC_PEN);
          hOldPen = SelectObject(hdc, hPen);
          SetDCPenColor(hdc, RGB(255,0,0));

          // Draw new rectangle
          Rectangle(hdc, startX, startY, endX, endY);

          // Restore original brush and brush
          SelectObject(hdc, hOldBrush);
          SelectObject(hdc, hOldPen);

          ReleaseDC(hwnd, hdc);
          DeleteDC(hdcMem);
      }
    break;

基本上我在绘图开始前(在一个名为屏幕截图的位图中)保存窗口的屏幕截图,并在每次鼠标移动时绘制整个屏幕。触发WM_LBUTTONDOWN时,startX和startY设置一次。我认为重绘整个屏幕效率非常低,但是如果我只是部分画了需要重绘的区域,我就无法工作。如果我觉得性能是一个问题,我可能会回到这里,但从我的测试来看,它看起来非常顺利。