- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在调整窗口大小时,我需要获得窗口客户区的正确大小(宽度/高度)。我尝试使用 GetClientRect
,但它总是提供错误的值(请参阅下面的详细信息)。
User32.RECT clientRECT;
User32.GetClientRect(_handle, out clientRECT);
所以我决定在创建窗口时在窗口矩形(带边框)和客户端矩形之间存储 x 和 y 增量,然后将这个增量值与窗口矩形相加,从 WM_SIZING 的 lParam 接收
消息。
var windowRECT = (User32.RECT)Marshal.PtrToStructure(lParam, typeof(User32.RECT));
var clientAreaWidth = ((windowRECT.right - windowRECT.left) + _xDelta);
var clientAreaHeight = ((windowRECT.bottom - windowRECT.top) + _yDelta);
这个技巧总能给出正确的大小。
但为什么 GetClientRect 有如此奇怪的行为?因此,我编写了这段代码以获取有关正在发生的事情的更多详细信息。
Debug.WriteLine("dX: " + (clientRECT.right - clientAreaWidth).ToString() + ", dY: " + (clientRECT.bottom - clientAreaHeight).ToString());
然后我启动项目并开始拖动窗口的右下角。这是输出:
dX: 16, dY: 17 // fast dragging in NW-direction
dX: 21, dY: 16
dX: 34, dY: 25
dX: 92, dY: 62
dX: 110, dY: 75
dX: 94, dY: 65
dX: 60, dY: 48
dX: 22, dY: 19
...
dX: 0, dY: 1 // slow dragging in NW-direction
dX: 0, dY: 2
dX: 0, dY: 1
dX: 0, dY: 1
dX: 0, dY: 1
dX: 1, dY: 1
dX: 0, dY: 1
dX: 1, dY: 2
dX: 0, dY: 1
...
dX: -16, dY: -12 // fast dragging in SE-direction
dX: -68, dY: -65
dX: -77, dY: -75
dX: -53, dY: -43
dX: -22, dY: -17
dX: -5, dY: -4
...
dX: -1, dY: 0 // slow dragging in SE-direction
dX: -1, dY: 0
dX: -1, dY: 0
dX: -1, dY: -1
dX: -1, dY: 0
dX: -1, dY: -1
dX: -1, dY: 0
dX: 0, dY: -1
dX: -1, dY: 0
dX: 0, dY: -1
是什么导致了这种行为?
最佳答案
如果要使用WM_SIZING
,需要使用lParam
中携带的rect,而不是GetClientRect
的结果
关于c# - WM_SIZING 上的 GetClientRect 给出了错误的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29296121/
当我调整窗口大小并发送 WM_SIZE 消息时,WM_SIZE 消息是发送到消息队列还是直接调用窗口过程? 最佳答案 通过鼠标调整窗口大小会将 WM_SIZE 直接发送到窗口过程,它不会通过消息队列。
我正在尝试使用 WM_SIZE 事件来强制应用程序具有最小大小,代码: case WM_SIZE: int nWidth; int nHeight; int _dWidth;
我制作小游戏时遇到了一些低优先级窗口消息的问题,这些消息不断地从系统发送并阻止运行游戏逻辑的代码。 我像这样创建我的消息循环: bool Window::SystemRoutineAndCheckQu
当我调整窗口大小时,我想告诉程序的另一部分我的窗口已更改大小。我在 MSDN 上阅读那: WM SIZE 消息 WM SIZE 消息在窗口大小更改后发送到窗口。 但是,即使在拖动时我也会收到 WM_S
我创建了一个无标题窗口。 我手动(或以编程方式)调整其大小,使其高度为 30 像素或更小。 当我捕获底部边框以垂直调整其大小时,它的行为如下如果我拖动顶部边框。事实上,在调试程序时,WM_SIZING
CreateWindowEx API 真的会发送 WM_SIZE 消息吗? 当我通过 CreateWindowEx 创建一个窗口作为全屏模式时, CreateWindowEx 发布 WM_SIZE 但
以编程方式发送 WM_SIZE 消息是否有问题,例如: SendMessage(hWnd, WM_SIZE, 0, 0); 我不关心 wParam 和 lParam 的值(我的 WM_SIZE 事件处
我有一个设置了最小高度的表单,因为我不希望它在“简约显示”模式下调整大小超过某个点。 当用户尝试通过 Aero 将窗口捕捉到屏幕顶部来最大化窗口时,窗口会最大化,但窗口的高度仅为 240 像素(设置的
当 WM_SIZE 和 WM_PAINT 消息都被发送时(例如:当我将窗口调整到更大的尺寸时),是否保证 WM_SIZE 消息将在 WM_PAINT 消息之前发送? 最佳答案 是的,首先接收到 WM_
我有 TVirtualStringTree 的后代使用我自己的自动调整列程序的类。为了让它在控件的大小发生变化时工作,我已经覆盖了 Resize程序: type TMyVirtualStringT
我的测试表明,当我调用 ShowWindow() , 一个 WM_SIZE消息被发送。 我可以依赖这种行为(因为我找不到它的文档)吗? 最佳答案 根据 MSDN,调用 ShowWindow() 具有以
在调整窗口大小时,我需要获得窗口客户区的正确大小(宽度/高度)。我尝试使用 GetClientRect,但它总是提供错误的值(请参阅下面的详细信息)。 User32.RECT clientRECT;
如果我使用此方法(或 WM_KEYUP 并以相同的 return 0 最后),我将无法获得 WM_SIZE 命令: case WM_KEYDOWN: { keys[wParam] = 1;
我有一个处理消息的函数,我在 WindowProcedure 之外捕获某些消息以触发所需的行为。 问题是,虽然其他消息似乎正在按需要工作,但出于某种原因我无法捕获 WM_SIZE 消息。WM_SIZE
我正在尝试使用带有 MFC 框架 (VS 6.0) 的 C++ 拦截我基于 CDialog 的窗口的大小和位置变化,以便根据新的大小和/或位置调整我的合成物的位置。 我该怎么做? 谢谢! 最佳答案 1
为什么 SetScrollInfo() 函数会向 WndProc() 发送 WM_SIZE 消息? 编辑 显然,这是 WinAPI 中的错误。正在发送 WM_SIZE 消息,因为我忘记包含 WS_HS
我是一名优秀的程序员,十分优秀!