- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试实现一个功能,用户按下鼠标左键,将鼠标拖到某处,然后绘制一个“带边框的矩形”(没有任何填充的矩形显示下面的内容,所以基本上只是一个边框) .
我有东西使用这段代码:
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。
最佳答案
感谢 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/
我想使用 SetCursorPos 将鼠标困在窗口中间(就像在 FPS 游戏中一样) . 问题是,当我这样做时,我的窗口会收到一个 WM_MOUSEMOVE ——这最多会抵消用户想要的任何移动,最坏的
我正在开发一个程序,该程序应该在程序停留在后台时模拟程序的基本鼠标输入(这意味着,我想在目标接收输入时使用实际的鼠标和键盘在其他窗口中执行其他操作) 。我需要做的一件事是将鼠标移动到特定的 (x,y)
我正在尝试用 C++ 和 WinAPI 制作一个透明的屏幕保护程序。 到目前为止它在 Windows XP 上运行良好,但在 WES7 上我遇到以下问题:通过使我的屏幕透明,我无法接收任何 WM_MO
我有以下WndProc: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM w, LPARAM l) { switch (mes
当我的 C# WinForms 应用程序正在运行时,我需要检测鼠标指针何时移到第 3 方应用程序上。 我已经进行了一些 Google 搜索,但我似乎无法找到一个有用的代码示例来说明如何使用 C# 为另
现在我正在做一个项目,它要求我始终获取鼠标移动消息。我的应用程序只有一个用于配置目的的小窗口,大部分时间它甚至不会出现在桌面上。我需要的是我需要能够记录鼠标在桌面上的移动。这意味着人们在桌面上移动鼠标
我正在尝试实现一个功能,用户按下鼠标左键,将鼠标拖到某处,然后绘制一个“带边框的矩形”(没有任何填充的矩形显示下面的内容,所以基本上只是一个边框) . 我有东西使用这段代码: cas
你好, 绘制鼠标移动的最佳做法是什么?当在 WM_MOUSEMOVE 中执行绘图时,我看到很多示例(也在 MSDN 上)。但我认为更好的方法是在 WM_PAINT 中绘制。 例子: 版本 1 case
当将 WM_MOUSEMOVE 消息发送到应用程序(在本例中为 Open Office Writer)的客户区时,图像会闪烁,就好像鼠标位于指定坐标上一样,但不会停留在该状态。代码是: PostMes
我有一个(父)窗口,其中一个子窗口是由另一个库(Ogre3d)创建的。窗口初始化使用裸 Win32 API。 我想在我的父窗口中捕获鼠标输入,但似乎我的 WM_MOUSEMOVE 事件仅由子窗口接收,
我正在处理 Win32 控件。此控件上可能有数百个“项目”。这些不是窗口,而是内部对象(例如:矩形)。根据鼠标位置,我想更改鼠标光标。没关系,我可以使用 WM_SETCURSOR。 同时基于鼠标移动,
我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。 官方根据MSDN解决是检查 GetMessageExtraInfo() 的结果是否将高 24 位设置为 0xF
我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。 官方根据MSDN解决是检查 GetMessageExtraInfo() 的结果是否将高 24 位设置为 0xF
我的对话框派生自 CDialog,我想在用户将鼠标光标移开时关闭它。为此,我添加了调用 OnCancel() 的 OnMouseLeave 处理程序。据我了解,要及时发送 WM_MOUSELEAVE
大家好,我正在尝试实现 FPS=Style 相机。鼠标移动有效,但甚至没有接触鼠标。在我什至没有触碰鼠标的情况下,相机在各个角度都在运转。基本上,偏航和俯仰是在没有鼠标本身移动的情况下从鼠标获得错误的
我正在使用一个粗糙的系统通过将 WM_MOUSEMOVE 事件直接发送到 Flash 窗口来从 C++/win32 程序控制 Flash 电影。 它适用于一个轴: SendMessage( m_tar
我在这里看了很多关于 PeekMessage 和 WM_MOUSEMOVE 的帖子,但到目前为止我还没有发现任何与性能相关的内容。 长话短说;我正在做 PC 游戏开发,昨天我注意到我可以将我们的应用程
我是一名优秀的程序员,十分优秀!