gpt4 book ai didi

winforms - 拖动移动窗口的闪烁位置

转载 作者:行者123 更新时间:2023-12-03 11:48:05 25 4
gpt4 key购买 nike

我正在实现.NET的DragMove方法的Rust替代方法,但是结果导致应用程序在两个相对位置之间闪烁。
参见screencastsample project
我用来执行拖动移动的代码:

let mut mouse_down = false;
let mut last_pos: Option<PhysicalPosition<f64>> = None;
event_loop.run(move |event, _, control_flow| match event {
Event::WindowEvent {
event: WindowEvent::CursorMoved {
position,
..
},
..
} => {
let gl_window = display.gl_window();
let window = gl_window.window();
if mouse_down {
if last_pos.is_some() {
let previous_pos = last_pos.unwrap();
let delta_x = previous_pos.x - position.x;
let delta_y = previous_pos.y - position.y;
window.set_outer_position(PhysicalPosition::new(position.x + delta_x, position.y + delta_y));
}
last_pos = Some(position);
}
}
Event::WindowEvent {
event: WindowEvent::MouseInput{
state,
button,
..
},
..
} => {
mouse_down = button == MouseButton::Left && state == ElementState::Pressed;
if !mouse_down {
last_pos = None;
}
}
_ => {}
});

最佳答案

CursorMoved报告

(x,y) coords in pixels relative to the top-left corner of the window.


当您稍后在 set_outer_position中使用该位置时,实际上是在将窗口相对坐标重新解释为屏幕相对坐标。
您应该将偏移量应用到 outer_position返回的位置。
尽管这解决了紧迫的问题,但我不确定它是否足以解决窗口移动问题。当您处理下一个 CursorMoved事件时,坐标仍然是相对于窗口的,但是此后窗口一直在移动。这可能会在各处产生伪影。
更加健壮的解决方案将在拖动移动操作开始时存储窗口的位置,并通过累积的增量偏移该位置。

关于winforms - 拖动移动窗口的闪烁位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63102026/

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