![](/img/trans.png)
[英]Image in custom control isn't loaded in UWP (WinUI3 preview 3 C++/WinRT)
[英]Convert Win32 BITMAP into WinUI3 C++/WinRT ImageSource
我想在自定义列表视图中显示文件,除了在列表视图中显示每个文件扩展名的图标之外,我做了所有我需要的事情。
我发现了如何将 HICON/BITMAP 用作文件扩展名,但我需要在自定义列表视图中显示它,如图像或类似的东西。
我怎样才能做到这一点?
我正在使用最新的软件包 WinUI3 C++/WinRT。
在IInspectable的评论的帮助下,我能够找到自己问题的答案,非常感谢他。
您将需要这些标题:
#include <winrt/Windows.Storage.h>
#include <winrt/Microsoft.Ui.Xaml.Media.Imaging.h>
这是异步方法:
::winrt::Windows::Foundation::IAsyncOperation<::winrt::Microsoft::UI::Xaml::Media::ImageSource>
GetIconFromFile(
const ::winrt::hstring& file,
::winrt::Windows::Storage::FileProperties::ThumbnailMode thumbnailMode = ::winrt::Windows::Storage::FileProperties::ThumbnailMode::DocumentsView
) {
const auto& fileStorage = co_await ::winrt::Windows::Storage::StorageFile::GetFileFromPathAsync(file);
const auto& fileThumbnail = co_await fileStorage.GetThumbnailAsync(thumbnailMode);
::winrt::Microsoft::UI::Xaml::Media::Imaging::BitmapImage bitmapImage;
bitmapImage.SetSource(fileThumbnail);
co_return bitmapImage;
}
您可以通过使用它们来摆脱命名空间,但我决定不这样做,因为如果您从 Windows 命名空间中包含内容,可能会出现模棱两可的错误。
你可以像这样使用它:
// xaml
<Image x:Name="image" Width="40" Height="40"/>
//cpp
::winrt::Windows::Foundation::IAsyncAction LoadImageIcon() {
const auto& filePath = TEXT("<your file path>");
image().Source(co_await GetIconFromFile(filePath));
}
这是一个通用的 function 执行HBITMAP
=> WinUI3 Image.Source
转换:
#pragma comment(lib, "gdi32")
#pragma comment(lib, "oleaut32")
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage::Streams; // for InMemoryRandomAccessStream
using namespace Windows::Graphics::Imaging; // for BitmapDecoder
using namespace Microsoft::UI::Xaml;
using namespace Microsoft::UI::Xaml::Controls; // for Image
using namespace Microsoft::UI::Xaml::Media::Imaging; // for SoftwareBitmapSource
IAsyncAction SetImageSourceFromHBITMAPAsync(HBITMAP hBitmap, Image image)
{
PICTDESC pd = {};
pd.cbSizeofstruct = sizeof(PICTDESC);
pd.picType = PICTYPE_BITMAP;
pd.bmp.hbitmap = hBitmap;
com_ptr<IPicture> picture;
if (FAILED(OleCreatePictureIndirect(&pd, IID_IPicture, FALSE, (LPVOID*)picture.put()))) // #include <olectl.h> in pch.h
return;
InMemoryRandomAccessStream memStream; // #include <winrt/Windows.Storage.Streams.h> in pch.h
com_ptr<IStream> stream;
if (FAILED(CreateStreamOverRandomAccessStream(winrt::get_unknown(memStream), IID_PPV_ARGS(&stream)))) // #include <shcore.h> in pch.h
return;
if (FAILED(picture->SaveAsFile(stream.get(), TRUE, nullptr)))
return;
auto decoder = co_await BitmapDecoder::CreateAsync(memStream); // #include <winrt/Windows.Graphics.Imaging.h> in pch.h
auto bitmap = co_await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat::Bgra8, BitmapAlphaMode::Premultiplied);
SoftwareBitmapSource bitmapSource; // #include <winrt/Microsoft.UI.Xaml.Media.Imaging.h> in pch.h
co_await bitmapSource.SetBitmapAsync(bitmap);
image.Source(bitmapSource);
}
以及如何使用它的示例:
namespace winrt::WinUIApp1CPP::implementation
{
MainWindow::MainWindow()
{
InitializeComponent();
}
void MainWindow::myButton_Click(IInspectable const&, RoutedEventArgs const&)
{
auto hBitmap = (HBITMAP)LoadImage(nullptr, L"D:\\Downloads\\dog.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
if (!hBitmap)
return;
auto op{ SetImageSourceFromHBITMAPAsync(hBitmap, myImage()) }; // add this XAML somewhere <Image x:Name="myImage" />
DeleteObject(hBitmap);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.