UWP InkCanvas 捕获事件但不显示它们

UWP InkCanvas capture events but don't display them

我最近在本地修改了 vmulti 项目 https://github.com/djpnewton/vmulti 的一个分支,以便在 Windows 10 with VS2019 Community 中工作,并对其进行了一些改进,包括为 HID 添加尖端和桶压力笔的报告,以及最多支持 4 个操纵杆,这样我就可以通过 TCP/IP 通过我已经用 C++ 编写的服务器将 mouse/keyboard/touch/pen/joystick 事件传递到另一个系统。

我现在正在为它写一个 UI 并且将使用带有 Xaml Islands 的 Win32 C++ 或将使用 UWP,两者都将使用来自单独的 UWP dll 的 Xaml UserControl项目。

我想使用带有 pen/touch/mouse 的 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 上绘制的笔画?我只是通过捕获事件,我不想在屏幕上绘制。

发现了,就像 .NET 的情况一样,你不能在 InitializeComponent() 之后进行某些调用,你必须等到加载,下面更新的代码将隐藏当前的墨水。

更新代码:

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;

    this->Loaded += ref new Windows::UI::Xaml::RoutedEventHandler(this, &VMulti_UI_Xaml::MainScreen::OnLoaded);
}

void VMulti_UI_Xaml::MainScreen::OnLoaded(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    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.001;
    size1.Height = 0.001;
    drawingAttributes->Size = size1;
    inkCanvas1->InkPresenter->UpdateDefaultDrawingAttributes(drawingAttributes);

    inkCanvas1->InkPresenter->InputConfiguration->IsEraserInputEnabled = true;
}