c++ - WM_MOVING,LPARAM 在气动快照上给出错误的值
问题描述
我正在开发一个 win32 项目,该项目使用WM_MOVING
来自的消息WndProc
来检测窗口移动的新位置。但是当我尝试将窗口捕捉到左侧时,LPARAM 会在一毫秒内给出错误的值,然后给出实际值。
请查看输出:
Left: 0, Right:683
Left: -205, Right:295
Left: 0, Right:683
Left: -205, Right:295
Left: 0, Right:683
Left: -205, Right:295
实际输出是 -205,但在两者之间我得到零,这导致我的窗口内容闪烁。在我的情况下,内容的位置取决于窗口位置,因此如果我收到错误的值,它会导致闪烁。
这是我想要实现的目标:手动创建丙烯酸效果
当我在这种模式下(就在航空捕捉模式之前)移动窗口时,该值将变为零。
这只会影响窗口的Top
和Left
坐标,并且在航空捕捉到任何侧面时也会闪烁。
这是一个简单的可复制示例:
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
RECT* hostRect;
char buffer[200];
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(0,CLASS_NAME,L"Learn to Program Windows",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
if (hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd, nCmdShow);
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_MOVING:
{
hostRect = reinterpret_cast<RECT*>(lParam);
sprintf_s(buffer, "Left: %d, Top:%d, Right:%d, Bottom:%d\n", hostRect->left, hostRect->top, hostRect->right, hostRect->bottom);
OutputDebugStringA(buffer);
}
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
运行此程序并检查输出中的值,同时将窗口移动到任何一侧以进行航空捕捉。
注意: 在我的情况下,我将无法使用GetWindowRect()
in WM_MOVING
,因为在我的窗口中调用会GetWindowRect()
减慢 render() 函数(只是一个 directx 绘画)。
解决方案
推荐阅读
- reactjs - 例如,有什么方法可以让多个选项卡(屏幕)与浏览器中的预览反应原生?
- angular - 为什么 forkJoin 没有为一组新的 Observable 完成?
- javascript - 数组嵌套和条件
- sql - 使用 Group by 对 int 值和字符串求和
- soap - 反序列化正文时 SOAP Web 服务抛出错误
- python - 第一次使用 Bitbucket Pipeline。PyTest 文件或目录未找到:测试/*
- c# - 如何从 verify.eryn.io/api 获取数据并将其放入 windows 窗体 Richtextbox
- java - 目标 org.apache.avro:avro-maven-plugin:1 .10.2:schema 的执行默认值失败:字段默认值无效
- dataframe - ValueError:从传递的值中推断出的频率 None 不符合传递的频率 H
- statistics - 关于学生 t 检验,组合标准差的正确公式是什么?