@Aleksandr361818

Как исправить ошибку в с++?

Private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{ 
POINT cp; 
GetCursorPos(&cp); 
SetCursorPos(0, 0); 
SetCursorPos(cp.x, cp.y); 
while (true) 
{ 
//GetCursorPos(); 
label1->Text = cp;
 Sleep(10000); 
}
 }


Вот ошибка
Ошибка (активно) E1767 невозможно вызвать функцию "System::Windows::Forms::Label::Text::set" с данным списком аргументов Pipetka C:\Users\User\source\repos\Pipetka\MyForm.h 122


Подчёркивается label1 на строке label1->Text = cp;
  • Вопрос задан
  • 542 просмотра
Пригласить эксперта
Ответы на вопрос 1
Casper-SC
@Casper-SC
Программист (.NET)
На примере UWP C++ проекта. Нужно сформировать С++ строку и конвертировать её в Managed String.
Свойство Text имеет тип данных Platform::String (в других типах проектов не знаю какой там тип, как и не знаю, какой у вас тип проекта, видимо, Windows Forms, который для С++ мне создать не удалось из Visual Studio 2019)
6043bd0d024ab531874548.png

Подсмотреть разные примеры можно здесь: https://github.com/stammen/uwp-cpp-examples
Использовать Sleep в UI потоке -- это зависание окна.
И да, как писали в комментариях это не чистый С++, а С++/CX. Здесь пригодились бы знания C# и платформы .NET.

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

using namespace RemoveApp;

using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
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;

std::string FormatPoint(POINT&);

std::wstring_convert<std::codecvt_utf8<wchar_t>> MainPage::s_converter;
std::mutex MainPage::s_mutex;

DispatcherTimer^ _timer;
uint32_t _counter;
const uint32_t TICK = 10000;

MainPage::MainPage()
{
    InitializeComponent();
    UpdateLabel();

    _timer = ref new DispatcherTimer();
    TimeSpan ts;
    ts.Duration = 1000 * TICK;
    _timer->Interval = ts;
    
    auto registrationToken = _timer->Tick += ref new EventHandler<Object^>(this, &MainPage::OnTick);

    _button->Click += ref new RoutedEventHandler(this, &MainPage::OnClick);
}

void MainPage::OnTick(Object^ sender, Object^ e)
{
    UpdateLabel();
}

void MainPage::UpdateLabel()
{
    //GetCursorPos(&cp);
    //SetCursorPos(0, 0);
    //SetCursorPos(cp.x, cp.y);
    ++_counter;
    POINT cp = { _counter, _counter + 10 };
    std::string text = FormatPoint(cp);
    _label1->Text = StringToPlatformString(text);
}

void MainPage::OnClick(Object^ sender, RoutedEventArgs^ e)
{
    if (!_timer->IsEnabled)
    {
        _timer->Start();
    }
}

std::string MainPage::PlatformStringToString(Platform::String^ text)
{
    if (text == nullptr) {
        return std::string("");
    }

    std::lock_guard<std::mutex> lock(s_mutex);
    return s_converter.to_bytes(text->Data());
}

Platform::String^ MainPage::StringToPlatformString(const std::string& text)
{
    if (text.empty()) {
        return ref new Platform::String();
    }
    std::lock_guard<std::mutex> lock(s_mutex);
    std::wstring converted = s_converter.from_bytes(text);
    return ref new Platform::String(converted.c_str());
}

std::string FormatPoint(POINT& point)
{
    return "x = " + std::to_string(point.x) + ", y = " + std::to_string(point.y);
}


MainPage.xaml.h
#pragma once

#include "MainPage.g.h"
#include <codecvt>
#include <string>
#include <mutex>
#include <cstdint>

using namespace Platform;
using namespace Windows::UI::Xaml;

namespace RemoveApp
{
	/// <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();

		void OnTick(Object^ sender, Object^ e);
		void OnClick(Object^ sender, RoutedEventArgs^ e);
		void MainPage::UpdateLabel();

	private:
		std::string PlatformStringToString(String^ s);
		String^ StringToPlatformString(const std::string& s);

		static std::wstring_convert<std::codecvt_utf8<wchar_t>> s_converter;
		static std::mutex s_mutex;
	};
}


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

    <Grid>
        <StackPanel
            HorizontalAlignment="Center"
            VerticalAlignment="Center">
            <TextBlock
                x:Name="_label1"
                Margin="0,25,0,0"
                FontSize="24" />
            <Button
                x:Name="_button"
                Margin="0,18,0,0"
                Content="Запустить таймер" />
        </StackPanel>
    </Grid>
</Page>


pch.h
#pragma once

#include <collection.h>
#include <windows.h>

#include "App.xaml.h"


pch.cpp
#include "pch.h"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы