На примере UWP C++ проекта. Нужно сформировать С++ строку и конвертировать её в
Managed String.
Свойство Text имеет тип данных
Platform::String (в других типах проектов не знаю какой там тип, как и не знаю, какой у вас тип проекта, видимо, Windows Forms, который для С++ мне создать не удалось из Visual Studio 2019)
Подсмотреть разные примеры можно здесь:
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"