Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C++/WinRTile, std::wstring gibi C++ Standart Kitaplığı geniş dize türlerini kullanarak Windows Çalışma Zamanı API'lerini çağırabilirsiniz (not: std::stringgibi dar dize türleriyle değil). C++/WinRT, winrt::hstring adlı özel bir dize türüne sahiptir (C++/WinRT temel kitaplığında tanımlanır ve bu %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h). Bu da Windows Çalışma Zamanı oluşturucularının, işlevlerinin ve özelliklerinin alıp döndüreceği dize türüdür. Çoğu durumda, hstringdönüştürme oluşturucuları ve işleçleri sayesinde, istemci kodunuzda hstring'nin farkında olup olmama seçeneğine sahipsiniz. API'leri
C++'ta birçok dize türü vardır. Varyantlar, C++ Standart Kitaplığı'ndan std::basic_string ek olarak birçok kitaplıkta bulunur. C++17'de, tüm dize türleri arasındaki boşlukları doldurmak için std::basic_string_viewve dize dönüştürme yardımcı programları vardır. winrt::hstring, std::wstring_view ile dönüştürülebilirlik sağlayarak, std::basic_string_view için tasarlanmış olan birlikte çalışabilirliği sağlar.
std::wstring (ve isteğe bağlı olarak winrt::hstring) Uri ile kullanma
Windows::Foundation::Uri bir winrt::hstringoluşturulmuştur.
public:
Uri(winrt::hstring uri) const;
Ancak hstring, farkında olmanıza gerek kalmadan onunla çalışmanıza olanak tanıyan dönüştürme oluşturucularına sahiptir. Geniş bir dize sabitinden, geniş bir dize görünümünden ve std::wstringkullanarak bir URI meydana getirme işlemini gösteren bir kod örneği verilmiştir.
#include <winrt/Windows.Foundation.h>
#include <string_view>
using namespace winrt;
using namespace Windows::Foundation;
int main()
{
using namespace std::literals;
winrt::init_apartment();
// You can make a Uri from a wide string literal.
Uri contosoUri{ L"http://www.contoso.com" };
// Or from a wide string view.
Uri contosoSVUri{ L"http://www.contoso.com"sv };
// Or from a std::wstring.
std::wstring wideString{ L"http://www.adventure-works.com" };
Uri awUri{ wideString };
}
Özellik erişimcisi Uri::Domain, hstringtüründedir.
public:
winrt::hstring Domain();
Çünkü hstring'in operatörünün std::wstring_view'e dönüşümü sayesinde, bu ayrıntının farkında olmak tercihe bağlıdır.
// Access a property of type hstring, via a conversion operator to a standard type.
std::wstring domainWstring{ contosoUri.Domain() }; // L"contoso.com"
domainWstring = awUri.Domain(); // L"adventure-works.com"
// Or, you can choose to keep the hstring unconverted.
hstring domainHstring{ contosoUri.Domain() }; // L"contoso.com"
domainHstring = awUri.Domain(); // L"adventure-works.com"
Benzer şekilde, IStringable::ToString hstring döndürür.
public:
hstring ToString() const;
UriIStringable arabirimini uygular.
// Access hstring's IStringable::ToString, via a conversion operator to a standard type.
std::wstring tostringWstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringWstring = awUri.ToString(); // L"http://www.adventure-works.com/"
// Or you can choose to keep the hstring unconverted.
hstring tostringHstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringHstring = awUri.ToString(); // L"http://www.adventure-works.com/"
Standart geniş bir dizeyi hstring'ten almak için hstring::c_str işlevini kullanabilirsiniz (tıpkı std::wstring'den alabileceğiniz gibi).
#include <iostream>
std::wcout << tostringHstring.c_str() << std::endl;
bir hstring varsa, bundan bir Uri yapabilirsiniz.
Uri awUriFromHstring{ tostringHstring };
hstringalan bir yöntem düşünün.
public:
Uri CombineUri(winrt::hstring relativeUri) const;
Az önce gördüğünüz tüm seçenekler bu gibi durumlarda da geçerlidir.
std::wstring contact{ L"contact" };
contosoUri = contosoUri.CombineUri(contact);
std::wcout << contosoUri.ToString().c_str() << std::endl;
hstring, bir std::wstring_view dönüştürme işleci üyesine sahiptir ve dönüştürme işlemi maliyetsiz gerçekleştirilir.
void legacy_print(std::wstring_view view);
void Print(winrt::hstring const& hstring)
{
legacy_print(hstring);
}
winrt::hstring işlevleri ve işleçleri
winrt::hstringiçin oluşturucular, işleçler, işlevler ve yineleyicilerden oluşan bir dizi uygulanmıştır.
hstring bir aralık olduğundan, bunu aralık tabanlı forveya std::for_eachile kullanabilirsiniz. Ayrıca, C++ Standart Kitaplığı'ndaki karşılıkları ile doğal ve verimli bir şekilde karşılaştırma için karşılaştırma işleçleri sağlar. Ayrıca, ilişkilendirici kapsayıcılar için anahtar olarak hstring kullanmak için ihtiyacınız olan her şeyi içerir.
Birçok C++ kitaplığının std::stringkullandığını ve yalnızca UTF-8 metniyle çalıştığını biliyoruz. Kolaylık sağlamak amacıyla, winrt::to_string ve winrt::to_hstringgibi yardımcıları çift yönlü dönüşüm sağlamak için sunuyoruz.
WINRT_ASSERT bir makro tanımıdır ve _ASSERTEolarak genişletilir.
winrt::hstring w{ L"Hello, World!" };
std::string c = winrt::to_string(w);
WINRT_ASSERT(c == "Hello, World!");
w = winrt::to_hstring(c);
WINRT_ASSERT(w == L"Hello, World!");
hstring işlevleri ve işleçleri hakkında daha fazla örnek ve bilgi için winrt::hstring API başvuru konusuna bakın.
winrt::hstring ve winrt::param::hstring için gerekçe
Windows Çalışma Zamanı, wchar_t karakterleri terimleriyle uygulanır, ancak Windows Çalışma Zamanı'nın Uygulama İkili Arabirimi (ABI), ne std::wstring ne de std::wstring_view'in bir alt kümesidir. Bunları kullanmak önemli ölçüde verimsizliğe yol açabilir. Bunun yerine C++/WinRT, temel HSTRINGile tutarlı sabit bir dizeyi temsil eden ve std::wstringgibi bir arabirimin arkasında uygulanan winrt::hstringsağlar.
winrt::hstring mantıksal olarak kabul etmesi gereken C++/WinRT giriş parametrelerinin aslında winrt::param::hstringbeklediğini fark edebilirsiniz. param ad alanı, C++ Standart Kitaplığı türlerine doğal olarak bağlanmak ve kopyaları ve diğer verimsizlikleri önlemek üzere giriş parametrelerini iyileştirmek için özel olarak kullanılan bir tür kümesi içerir. Bu türleri doğrudan kullanmamalısınız. Kendi işlevleriniz için bir iyileştirme kullanmak istiyorsanız std::wstring_viewkullanın. Ayrıca bkz. Parametreleri ABI sınırına geçirme.
Sonuç olarak, Windows Çalışma Zamanı dize yönetiminin ayrıntılarını büyük ölçüde yoksayabilir ve bildiklerinizle etkili bir şekilde çalışabilirsiniz. Windows Runtime'da metin dizelerinin ne kadar yoğun kullanıldığı göz önünde bulundurulduğunda bu önemlidir.
Dizeleri biçimlendirme
Dize biçimlendirme için bir seçenek std::wostringstream. Aşağıda basit bir hata ayıklama izleme iletisini biçimlendiren ve görüntüleyen bir örnek verilmiş.
#include <sstream>
#include <winrt/Windows.UI.Input.h>
#include <winrt/Windows.UI.Xaml.Input.h>
...
void MainPage::OnPointerPressed(winrt::Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{
winrt::Windows::Foundation::Point const point{ e.GetCurrentPoint(nullptr).Position() };
std::wostringstream wostringstream;
wostringstream << L"Pointer pressed at (" << point.X << L"," << point.Y << L")" << std::endl;
::OutputDebugString(wostringstream.str().c_str());
}
Özellik ayarlamanın doğru yolu
Bir değeri bir ayarlayıcı işlevine geçirerek bir özellik ayarlarsınız. İşte bir örnek.
// The right way to set the Text property.
myTextBlock.Text(L"Hello!");
Aşağıdaki kod yanlış. Derleme yapar, ancak tek yaptığı, Text() erişimci işlevi tarafından döndürülen geçici winrt::hstring değiştirmek ve ardından sonucu atmaktır.
// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";
Önemli API'ler
- winrt::hstring yapısı
- winrt::to_hstring işlevi
- winrt::to_string işlevi