【问题标题】:Load a CBitmap dynamically动态加载 CBitmap
【发布时间】:2011-01-06 15:59:03
【问题描述】:

我有一个想要动态加载的位图图像。但我无法加载它。

CBitmap bmp;

bmp.LoadBitmap("c:\\aeimg");

它似乎不起作用。 谁能帮帮我。

谢谢。

【问题讨论】:

    标签: mfc visual-c++


    【解决方案1】:

    要从文件加载位图,您需要使用 LoadImageLR_LOADFROMFILE 标志。

    【讨论】:

      【解决方案2】:

      你也可以试试这样的:

      CImage image;
      image.Load(_T("C:\\image.png"));
      CBitmap bitmap;
      bitmap.Attach(image.Detach());
      

      【讨论】:

        【解决方案3】:

        上次我尝试/检查时,CImage 不适用于 png。看看 CxImage - http://www.codeproject.com/KB/graphics/cximage.aspx

        【讨论】:

        • 它支持bmp、jpg、gif和png。 msdn.microsoft.com/en-us/library/d06f3fhw(VS.80).aspx
        • 我必须查一下,就从文件加载而言,您是正确的。我的回忆来自不可能从资源中加载 png,因为 CImage::LoadFromResource() 使用 ::LoadImage() 而 Load() 使用 GDI+。
        【解决方案4】:

        这可能就像您忘记转义反斜杠一样简单。 而不是

        bmp.LoadBitmap("c:\aeimg");
        

        使用

        bmp.LoadBitmap("c:\\aeimg");
        

        否则,您将向 LoadBitmap 方法传递无效路径。

        【讨论】:

          【解决方案5】:

          根据 CBitmap 文档:LoadBitmap() 函数获取位图的资源标识符或位图的资源 id。

          您不能指定位图文件的路径。

          例如

          MyProject.rc
          ------------
          MYBMP      BITMAP  "res\myimage.bmp"
          

          并确保 resource.h 没有任何 MYBMP 条目,否则在预处理期间将其替换为 id 并最终 LoadBitmap() 将失败,因为应用程序无法找到资源,因为 FindResource() 失败。

          现在这样做:

          CBitmap bmp;
          bmp.LoadBitmap(L"MYBMP");
          

          它肯定会加载位图。

          【讨论】:

            【解决方案6】:

            CBitmap 不支持直接读取 .bmp 文件。您可以按照其他答案中的建议使用 CImage 类。您需要在代码中包含 atlimage.h 才能使 CImage 工作:

            #include <atlimage.h>
            :
            CImage img;
            img.Load (_T("C:\\image.bmp"));
            CBitmap bitmap;
            bitmap.Attach(img.Detach());
            

            另一种方法是使用LoadImage Win32 API 加载图像,然后将CBitmap 附加到该图像:

            HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"c:\\image.bmp", 
                                                  IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
            if (hBitmap != NULL) 
               bitmap.Attach(hBitmap);
            

            【讨论】:

              【解决方案7】:
              CString filename;
              TCHAR szFilter[] = _T("Bitmap (*.bmp)|*.bmp|PNG (*.png)|*.png||");
              
              CFileDialog selDlg(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT | OFN_EXTENSIONDIFFERENT, szFilter, this);
              
              
              if (selDlg.DoModal() == IDOK)
              {
                  filename = selDlg.GetPathName();
              
                  CImage image;
              
                  HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,filename, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
              
              
                  if (hBitmap)
                  {
                  // Delete the current bitmap
                  if (m_bmpBitmap.DeleteObject())
                      m_bmpBitmap.Detach();   // If there was a bitmap, detach it
              
                  // Attach the currently loaded bitmap to the bitmap object
                  m_bmpBitmap.Attach(hBitmap);
              
                  Invalidate();
                  }
              
              }
              

              【讨论】:

                【解决方案8】:

                当使用迄今为止提到的解决方案时,每次将 CImage 加载到 CBitmap 上时,使用 CBitmap 的成员变量时,我都会不断发生内存泄漏。我用以下代码解决了这个问题:

                CString _fileName(/*Path to image*/);
                CImage _image;          
                HRESULT hr = _image.Load(_fileName);
                if (SUCCEEDED(hr)) {
                    if (m_Display.m_bmpImage.DeleteObject())
                        m_Display.m_bmpImage.Detach();              
                    m_bmpImage.Attach(_image->Detach());
                }
                

                【讨论】:

                  猜你喜欢
                  • 2011-03-01
                  • 2014-05-20
                  • 1970-01-01
                  • 2018-11-02
                  • 2016-09-26
                  • 2018-03-25
                  • 2013-07-26
                  • 2012-08-13
                  • 2014-08-29
                  相关资源
                  最近更新 更多