【问题标题】:how to show PNG images in Toolbar of a WTL application如何在 WTL 应用程序的工具栏中显示 PNG 图像
【发布时间】:2013-01-21 09:47:33
【问题描述】:

我有一个遗留的 WTL 应用程序,我想使用 CToolBarCtrl http://msdn.microsoft.com/en-us/library/tf5d6ca2(v=vs.80).aspx 类在工具栏中显示 png 图像。到目前为止,BMP 图像显示在工具栏中(通过调用 LoadToolBar 函数并使工具栏在资源中可用)。

我想修改它以使用 PNG 图像。我曾尝试使用 CToolBarCtrl 类加载 png 图像,但徒劳无功。有办法吗?

【问题讨论】:

  • BMP 有什么问题?特别是如果您尝试挂载图像的地方不支持 PNG。或者,您可以加载 PNG,在内存中转换,然后将它们作为位图传递给工具栏。

标签: png toolbar wtl


【解决方案1】:

Here是一个将PNG转换为HBITMAP的例子:

#include <gdiplus.h>
#pragma comment(lib, "gdiplus.lib")


ATLINLINE HBITMAP AtlLoadGdiplusImage(ATL::_U_STRINGorID bitmap, ATL::_U_STRINGorID type = (UINT) 0)
{
   USES_CONVERSION;
   static bool s_bInitied = false;
   if( !s_bInitied ) {
      s_bInitied = true;
      Gdiplus::GdiplusStartupInput gsi;
      Gdiplus::GdiplusStartupOutput gso;
      ULONG uToken = 0;
      Gdiplus::GdiplusStartup(&uToken, &gsi, &gso);
   }
   Gdiplus::Bitmap* pBitmap = NULL;
   if( HIWORD(bitmap.m_lpstr) != NULL ) {
      // Load from filename
      pBitmap = new Gdiplus::Bitmap(T2CW(bitmap.m_lpstr)); 
   }
   else if( type.m_lpstr != NULL && type.m_lpstr != RT_BITMAP ) {
      // Loading PNG, JPG resources etc
      WTL::CResource res;
      if( !res.Load(type, bitmap) ) return NULL;
      DWORD dwSize = res.GetSize();
      HANDLE hMemory = ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
      if( hMemory == NULL ) return NULL;
      ::memcpy(::GlobalLock(hMemory), res.Lock(), dwSize);
      ::GlobalUnlock(hMemory);
      IStream* pStream = NULL; 
      if( FAILED( ::CreateStreamOnHGlobal(hMemory, TRUE, &pStream) ) ) {
         ::GlobalFree(hMemory);
         return FALSE;
      }
      pBitmap = new Gdiplus::Bitmap(pStream);
      pStream->Release();
   }
   else {
      // This only loads BMP resources
      pBitmap = new Gdiplus::Bitmap(_Module.GetResourceInstance(), (LPCWSTR) (UINT) bitmap.m_lpstr);
   }
   if( pBitmap == NULL ) return NULL;
   HBITMAP hBitmap = NULL;
   pBitmap->GetHBITMAP(NULL, &hBitmap); 
   delete pBitmap;
   return hBitmap;
}

【讨论】:

    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2015-09-29
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2017-05-10
    • 1970-01-01
    相关资源
    最近更新 更多