【发布时间】:2021-10-09 22:06:24
【问题描述】:
我最近在本地修改了 vmulti 项目 https://github.com/djpnewton/vmulti 的一个分支,以便在带有 VS2019 社区的 Windows 10 中工作,并对其进行了一些改进,包括为笔的 HID 报告添加笔尖和桶压力,以及最多支持 4 个操纵杆,这样我就可以通过我已经用 C++ 编写的服务器通过 TCP/IP 将鼠标/键盘/触摸/笔/操纵杆事件传递到另一个系统。
我现在正在为它编写一个 UI,要么将 Win32 C++ 与 Xaml Islands 一起使用,要么将使用 UWP,两者都将使用来自单独 UWP dll 项目的 Xaml UserControl。
我想使用带有笔/触摸/鼠标的 UWP InkCanvas 来仅收集笔划,如果可能的话,我根本不希望笔划显示在屏幕上。
现在我的代码如下所示:
MainScreen::MainScreen()
{
InitializeComponent();
this->inkCanvas1->InkPresenter->InputDeviceTypes = Windows::UI::Core::CoreInputDeviceTypes::Mouse | Windows::UI::Core::CoreInputDeviceTypes::Pen | Windows::UI::Core::CoreInputDeviceTypes::Touch;
this->inkCanvas1->InkPresenter->StrokeInput->InkPresenter->InputProcessingConfiguration->Mode = Windows::UI::Input::Inking::InkInputProcessingMode::Erasing;
this->inkCanvas1->InkPresenter->InputProcessingConfiguration->Mode = Windows::UI::Input::Inking::InkInputProcessingMode::Erasing;
this->inkCanvas1->InkPresenter->StrokeInput->StrokeStarted += ref new Windows::Foundation::TypedEventHandler<Windows::UI::Input::Inking::InkStrokeInput^, Windows::UI::Core::PointerEventArgs^>(this, &VMulti_UI_Xaml::MainScreen::OnStrokeStarted);
this->inkCanvas1->InkPresenter->StrokeInput->StrokeContinued += ref new Windows::Foundation::TypedEventHandler<Windows::UI::Input::Inking::InkStrokeInput^, Windows::UI::Core::PointerEventArgs^>(this, &VMulti_UI_Xaml::MainScreen::OnStrokeContinued);
this->inkCanvas1->InkPresenter->StrokeInput->StrokeEnded += ref new Windows::Foundation::TypedEventHandler<Windows::UI::Input::Inking::InkStrokeInput^, Windows::UI::Core::PointerEventArgs^>(this, &VMulti_UI_Xaml::MainScreen::OnStrokeEnded);
this->inkCanvas1->Opacity = 0.002;
Windows::UI::Input::Inking::InkDrawingAttributes^ drawingAttributes = inkCanvas1->InkPresenter->CopyDefaultDrawingAttributes();
drawingAttributes->DrawAsHighlighter = true;
Windows::UI::Color color1 = Windows::UI::Color();
color1.R = 0;
color1.G = 0;
color1.B = 0;
color1.A = 0;
drawingAttributes->Color = color1;
Windows::Foundation::Size size1 = drawingAttributes->Size;
size1.Width = 0.0;
size1.Height = 0.0;
drawingAttributes->Size = size1;
inkCanvas1->InkPresenter->UpdateDefaultDrawingAttributes(drawingAttributes);
}
void VMulti_UI_Xaml::MainScreen::OnStrokeStarted(Windows::UI::Input::Inking::InkStrokeInput^ sender, Windows::UI::Core::PointerEventArgs^ args)
{
std::wcout << "Stroke Started: " << args->CurrentPoint->Position.X << "," << args->CurrentPoint->Position.Y << std::endl;
args->Handled = true;
inkCanvas1->InkPresenter->StrokeContainer->Clear();
}
void VMulti_UI_Xaml::MainScreen::OnStrokeContinued(Windows::UI::Input::Inking::InkStrokeInput^ sender, Windows::UI::Core::PointerEventArgs^ args)
{
std::wcout << "Stroke Continued: " << args->CurrentPoint->Position.X << "," << args->CurrentPoint->Position.Y << std::endl;
args->Handled = true;
inkCanvas1->InkPresenter->StrokeContainer->Clear();
}
void VMulti_UI_Xaml::MainScreen::OnStrokeEnded(Windows::UI::Input::Inking::InkStrokeInput^ sender, Windows::UI::Core::PointerEventArgs^ args)
{
std::wcout << "Stroke Ended: " << args->CurrentPoint->Position.X << "," << args->CurrentPoint->Position.Y << std::endl;
args->Handled = true;
inkCanvas1->InkPresenter->StrokeContainer->Clear();
}
这几乎已经足够了,但您正在绘制的当前笔画仍会显示。我也想让它消失。在 StrokeInput 的笔画事件上将设置处理为 true 不会做任何事情来阻止笔画被绘制。清除每个事件的笔画会清除所有内容,但您正在绘制的当前笔画除外,我也想删除它。将 InkCanvas 的不透明度显示为低于 0.002 的任何值似乎会使事件以某种方式无法触发。
所以我想知道,我怎样才能摆脱所有绘制的笔画,包括当前在 InkCanvas 上绘制的笔画?我只是通过捕获事件,我不想在屏幕上绘制。
【问题讨论】: