【问题标题】:UWP InkCanvas capture events but don't display themUWP InkCanvas 捕获事件但不显示它们
【发布时间】: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 上绘制的笔画?我只是通过捕获事件,我不想在屏幕上绘制。

【问题讨论】:

    标签: c++ uwp inkcanvas


    【解决方案1】:

    找到了,就像有时候 .NET 的事情一样,你不能只在 InitializeComponent() 之后进行某些调用,你必须等到 Loaded,下面的更新代码将隐藏当前的墨迹。

    更新代码:

    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;
    }
    

    【讨论】:

    • @NicoZhu-MSFT:“您可以在 2 天内接受自己的答案。”
    猜你喜欢
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2010-09-29
    • 1970-01-01
    • 2017-12-27
    • 2018-01-16
    相关资源
    最近更新 更多