我正在尝试实现一个功能,用户按下鼠标左键,在某处拖动鼠标,然后绘制一个“有边框的矩形”(没有任何填充的矩形显示下面的内容,所以基本上只是一个边框)
我有某些使用此代码:
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)。
这就是它的样子。我基本上想要这个,里面没有黑线,可能还有更厚的边框。
我遇到的问题是我无法弄清楚如何重绘矩形区域内“丢失”的内容。我想我应该使用InvalidateRect而不是Rectangle但是再次确定如何在WM_PAINT中重绘。也许我应该以完全不同的方式接近这个?这是我第一次使用Winapi。
答案 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设置一次。我认为重绘整个屏幕效率非常低,但是如果我只是部分画了需要重绘的区域,我就无法工作。如果我觉得性能是一个问题,我可能会回到这里,但从我的测试来看,它看起来非常顺利。