C++ cli 表达式必须具有类类型(使用Win2D的C+;+;Windows 8应用程序中的初学者错误)

C++ cli 表达式必须具有类类型(使用Win2D的C+;+;Windows 8应用程序中的初学者错误),c++-cli,drawing,win2d,C++ Cli,Drawing,Win2d,我正在尝试在Windows8应用程序中开始使用Win2D。我只是尝试将库安装到我的新项目中,并使用其中一个函数画一个圆圈,但由于一个我不理解的错误,我无法继续 下面显示的是在Mainpage.xaml.cpp文件中自动创建的事件处理程序。我的错误是,函数中单行代码开头的“args”部分用红色下划线。将鼠标悬停在“args”下的红线上,显示消息“表达式必须具有类类型”。有人能帮忙吗 void AdditiveSignals::MainPage::CanvasAnimatedControl_Draw

我正在尝试在Windows8应用程序中开始使用Win2D。我只是尝试将库安装到我的新项目中,并使用其中一个函数画一个圆圈,但由于一个我不理解的错误,我无法继续

下面显示的是在Mainpage.xaml.cpp文件中自动创建的事件处理程序。我的错误是,函数中单行代码开头的“args”部分用红色下划线。将鼠标悬停在“args”下的红线上,显示消息“表达式必须具有类类型”。有人能帮忙吗

void AdditiveSignals::MainPage::CanvasAnimatedControl_Draw(Microsoft::Graphics::Canvas::UI::Xaml::ICanvasAnimatedControl^ sender, Microsoft::Graphics::Canvas::UI::Xaml::CanvasAnimatedDrawEventArgs^ args)
{
    args.DrawingSession.DrawCircle(640, 360, 30.0f, Colors->Blue);
}

这里是完整的代码,如果需要的话

在MainPage.xaml.h中

//
// MainPage.xaml.h
// Declaration of the MainPage class.
//

#pragma once

#include "MainPage.g.h"

namespace AdditiveSignals
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public ref class MainPage sealed
    {
    public:
        MainPage();

    protected:
        virtual void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^ e) override;
    private:
        void CanvasAnimatedControl_Draw(Microsoft::Graphics::Canvas::UI::Xaml::ICanvasAnimatedControl^ sender, Microsoft::Graphics::Canvas::UI::Xaml::CanvasAnimatedDrawEventArgs^ args);
    };
}
//
//MainPage.xaml.h
//MainPage类的声明。
//
#布拉格语一次
#包括“MainPage.g.h”
名称空间加法信号
{
/// 
///可以单独使用或在框架内导航到的空页。
/// 
公共参考类主页已密封
{
公众:
主页();
受保护的:
虚拟void OnNavigatedTo(Windows::UI::Xaml::Navigation::NavigationEventArgs^e)覆盖;
私人:
void CanvasAnimatedControl_Draw(Microsoft::Graphics::Canvas::UI::Xaml::ICanvasAnimatedControl^发件人,Microsoft::Graphics::Canvas::UI::Xaml::CanvasAnimatedDrawEventArgs^ args);
};
}
在MainPage.xaml中

<Page
    x:Class="AdditiveSignals.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:AdditiveSignals"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:canvas="using:Microsoft.Graphics.Canvas.UI.Xaml"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <Grid>
        <canvas:CanvasAnimatedControl Draw="CanvasAnimatedControl_Draw" />
    </Grid>
</Page>

在MainPage.xaml.cpp中(完整代码)

//
//MainPage.xaml.cpp
//MainPage类的实现。
//
#包括“pch.h”
#包括“MainPage.xaml.h”
使用名称空间AdditiveSignals;
使用命名空间平台;
使用名称空间Windows::Foundation;
使用名称空间Windows::Foundation::Collections;
使用名称空间Windows::UI;
使用名称空间Windows::UI::Xaml;
使用名称空间Windows::UI::Xaml::控件;
使用名称空间Windows::UI::Xaml::Controls::Primitives;
使用名称空间Windows::UI::Xaml::Data;
使用名称空间Windows::UI::Xaml::Input;
使用名称空间Windows::UI::Xaml::Media;
使用名称空间Windows::UI::Xaml::Navigation;
//空白页项模板被记录在http://go.microsoft.com/fwlink/?LinkId=234238
主页::主页()
{
初始化组件();
}
/// 
///当此页面即将显示在框架中时调用。
/// 
///描述如何到达此页面的事件数据。参数
///属性通常用于配置页面。
无效主页::OnNavigatedTo(NavigationEventArgs^e)
{
(void)e;//未使用的参数
//TODO:准备在此处显示的页面。
//TODO:如果应用程序包含多个页面,请确保
//通过注册来处理硬件后退按钮
//Windows::Phone::UI::Input::HardwareButtons.BackPressed事件。
//如果您正在使用某些模板提供的NavigationHelper,
//此事件已为您处理。
}
//每秒将调用此事件处理程序60次
void AdditiveSignals::MainPage::CanvasAnimatedControl_Draw(Microsoft::Graphics::Canvas::UI::Xaml::ICanvasAnimatedControl^发件人,Microsoft::Graphics::Canvas::UI::Xaml::CanvasAnimatedDrawEventArgs^ args)
{
参数DrawingSession.DrawCircle(640、360、30.0f,颜色->蓝色);
}

> P>语言的标准注释:C++/CLI是桥C允许或C++ .NET代码调用C++代码的桥梁。它不是一种主要的开发语言。如果你想学习C++,我会用C++和MFC作为你的GUI工具包。如果你想学习托管代码,我会用WinForms或WPF学习C

也就是说:

void CanvasAnimatedControl_Draw(ICanvasAnimatedControl^ sender, CanvasAnimatedDrawEventArgs^ args)
{
    args.DrawingSession.DrawCircle(640, 360, 30.0f, Colors->Blue);
}
args
是引用类型,而不是值类型。(它是通过引用(^ /Cuth>)传递给您的,它类似于通过指针传递C++对象(*/Cuth>)。)由于它是引用类型,它的成员使用<代码> -> /COD>访问,而不是<代码> ./COD>,就像一个C++指针指向一个对象。

DrawingSession
也是一种引用类型,因此也可以使用
->
访问其成员

Colors
是类的名称;使用
访问静态成员

args->DrawingSession->DrawCircle(640, 360, 30.0f, Colors::Blue);

我认为这应该在C++/CLI标记下,因为这是C++/CLI源代码。
args->DrawingSession->DrawCircle(640, 360, 30.0f, Colors::Blue);