永发信息网

C++ WTL中怎么加载外部的图片显示到PICTRUE或者其他控件上,不是添加到资源..求教,在线等。。

答案:1  悬赏:0  手机版
解决时间 2021-02-25 23:43
  • 提问者网友:动次大次蹦擦擦
  • 2021-02-25 20:02
C++ WTL中怎么加载外部的图片显示到PICTRUE或者其他控件上,不是添加到资源..求教,在线等。。
最佳答案
  • 五星知识达人网友:酒醒三更
  • 2021-02-25 21:11
我这里有个源代码例子,可以用GDI+的接口,将指定路径的图片,加载到内存中。
这里有个WTL GDI+的代码,你试试,指定好路径及文件类型。
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;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯