2017-01-20 3 views
0

Я пытаюсь начать работу с Win2D в приложении Windows 8. Я просто попытался установить библиотеку в свой новый проект и нарисовать круг, используя одну из функций, но не могу пойти дальше из-за ошибки, которую я не понимаю.Выражение должно иметь тип класса (ошибка начального уровня в приложении C++ Windows 8 с использованием 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

<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 
// Implementation of the MainPage class. 
// 

#include "pch.h" 
#include "MainPage.xaml.h" 

using namespace AdditiveSignals; 

using namespace Platform; 
using namespace Windows::Foundation; 
using namespace Windows::Foundation::Collections; 
using namespace Windows::UI; 
using namespace Windows::UI::Xaml; 
using namespace Windows::UI::Xaml::Controls; 
using namespace Windows::UI::Xaml::Controls::Primitives; 
using namespace Windows::UI::Xaml::Data; 
using namespace Windows::UI::Xaml::Input; 
using namespace Windows::UI::Xaml::Media; 
using namespace Windows::UI::Xaml::Navigation; 

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238 

MainPage::MainPage() 
{ 
    InitializeComponent(); 
} 

/// <summary> 
/// Invoked when this page is about to be displayed in a Frame. 
/// </summary> 
/// <param name="e">Event data that describes how this page was reached. The Parameter 
/// property is typically used to configure the page.</param> 
void MainPage::OnNavigatedTo(NavigationEventArgs^ e) 
{ 
    (void) e; // Unused parameter 

    // TODO: Prepare page for display here. 

    // TODO: If your application contains multiple pages, ensure that you are 
    // handling the hardware Back button by registering for the 
    // Windows::Phone::UI::Input::HardwareButtons.BackPressed event. 
    // If you are using the NavigationHelper provided by some templates, 
    // this event is handled for you. 
} 

//This event handler will be called 60 times per second 
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); 
} 
+0

Я думаю, что это должно быть под тегом C++/CLI, так как это источник C++/CLI. [читать дальше] (https://en.wikipedia.org/wiki/C%2B%2B/CLI) –

+0

И C++/CLI не должны использоваться для кода пользовательского интерфейса. –

ответ

2

Стандартная заметка о языке: C++/CLI предназначен как мост, позволяющий C# или другому .Net-коду вызывать код на C++. Он не предназначен как основной язык разработки. Если вы хотите изучить C++, я бы использовал C++ с MFC в качестве своего инструментария GUI. Если вы хотите изучить управляемый код, я бы изучил C# с помощью WinForms или WPF.

Это говорит:

void CanvasAnimatedControl_Draw(ICanvasAnimatedControl^ sender, CanvasAnimatedDrawEventArgs^ args) 
{ 
    args.DrawingSession.DrawCircle(640, 360, 30.0f, Colors->Blue); 
} 

args представляет собой тип ссылки, а не тип значения. (Он был передан вам по ссылке (^), что примерно аналогично передаче объекта C++ по указателю (*).) Поскольку это ссылочный тип, к его членам обращаются с помощью ->, а не ., как и указатель C++ к объекту.

DrawingSession также является ссылочным типом, поэтому его элементы также доступны с использованием ->.

Colors - название класса; Доступ к статическим элементам осуществляется с помощью ::.

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

Спасибо! Просто для вашего интереса, я делаю программу, которая рисует и оживляет формы волны как часть моего университетского проекта. Обычно я использую C++, однако соответствующие учебные пособия для того, что я делал, были доступны только для Win2D с использованием C#. Это было просто попыткой использовать тот же код из C# turorials в C++ из-за моего предпочтения C++, но я сказал, что у меня мало понимания того, как эти среды работают в целом. После публикации этого вопроса я переключился на C# для удобства, но это полезно знать в будущем! – fmwavesrgr8

Смежные вопросы