我有一个触摸屏(lg 23et83v,如果重要的话),我想为我3岁的女儿写一个非常基本的油漆应用程序:没有她不在乎的带有豪华工具的广泛工具面板(我不喜欢tuxpaint)。只是素描而已。这就是我的动机。
但在下面的代码中,我观察到以下奇怪的行为:
-
在目标机器上(windows 10 pro,6核amd,2014年左右),我用手指画画时有一个小延迟(大约0.5秒?)画在我手指后面的位置。只有当我把手指放好后,绘图的位置才能赶上手指的位置。
-
当我用鼠标画画的时候,滞后会让人印象深刻(~2-4秒!)为了更长的动作。如果我停止鼠标移动,绘图位置最终会跟上。看起来鼠标生成的鼠标移动事件的速率并不比在Bullet 1中移动手指时的触摸控制器高。
-
当我断开屏幕触摸控制器的USB电缆时,鼠标滞后几乎消失。嗯,它仍然很明显,但可以接受(比如说~0.25秒)
-
当我在开发机器上用鼠标画图时(2008年左右的英特尔Q6600四核),我没有看到任何鼠标延迟。
如果它是硬件或驱动程序相关的,我可能是运气不好。但在我看来,这似乎是Windows试图通过平均数个连续鼠标位置来平滑触摸移动。如果这是真的,我能控制平均值吗?关于这个问题的原因还有什么其他想法吗?
PS:当我在显示上述问题的机器上使用MS油漆时,我看不到任何延迟。所以这个问题一定是由一些与c相关或者与我使用api的特定方式相关的东西引起的。
public partial class MainWindow : Window
{
WriteableBitmap bitmap;
public MainWindow()
{
InitializeComponent();
int bitmapWidth = Convert.ToInt32(SystemParameters.PrimaryScreenWidth);
int bitmapHeight = Convert.ToInt32(SystemParameters.PrimaryScreenHeight);
bitmap = new WriteableBitmap(bitmapWidth, bitmapHeight, 96, 96, PixelFormats.Bgra32, null);
canvasImage.Source = bitmap;
}
void plot(int x, int y, uint value)
{
uint[] valueArray = new uint[1];
valueArray[0] = value;
bitmap.WritePixels(new Int32Rect(0, 0, 1, 1), valueArray, 4, x, y);
}
Point previousPosition;
void imageMouseMove(object sender, MouseEventArgs e)
{
Point currentPosition = e.GetPosition(canvasImage);
if (e.LeftButton == MouseButtonState.Pressed)
{
int x2 = (int)Math.Floor(currentPosition.X * canvasImage.Source.Width / canvasImage.ActualWidth);
int y2 = (int)Math.Floor(currentPosition.Y * canvasImage.Source.Height / canvasImage.ActualHeight);
int x1 = (int)Math.Floor(previousPosition.X * canvasImage.Source.Width / canvasImage.ActualWidth);
int y1 = (int)Math.Floor(previousPosition.Y * canvasImage.Source.Height / canvasImage.ActualHeight);
plot(x2,y2, 0xFF800000);
}
previousPosition = currentPosition;
}
void button1_Click(object sender, RoutedEventArgs e)
{
Close();
}
}
标记:
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="Paintuition.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Paintuition"
ResizeMode="NoResize"
WindowState="Maximized"
WindowStyle="None">
<Grid>
<Image
x:Name="canvasImage"
MouseMove="imageMouseMove" />
<Button
Content="X"
x:Name="button1"
Click="button1_Click"
Background="Red"
BorderBrush="#FFFFBFBF"
FontFamily="Arial"
Foreground="White"
FontWeight="ExtraBold"
FontSize="54"
Width="66"
Height="65"
Grid.Column="0"
Grid.Row="0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Margin="0,42,34,0" />
</Grid>
</Window>