gpt4 book ai didi

c++ - 在 WM_MOUSEMOVE 中拖动并绘制边框?

转载 作者:太空宇宙 更新时间:2023-11-04 13:01:53 27 4
gpt4 key购买 nike

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

我有东西使用这段代码:

         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。

最佳答案

感谢 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 被设置一次。我认为重绘整个屏幕效率极低,但如果我只是部分绘制需要重绘的区域,我将无法正常工作。如果我觉得性能是个问题,我可能会回到这个问题上,但从我的测试来看它似乎非常顺利。

关于c++ - 在 WM_MOUSEMOVE 中拖动并绘制边框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com