2016-11-14 108 views
1

我有一个位图类,它有一个用于从文件路径或资源ID加载位图的加载函数。这部分工作正常。SelectObject返回NULL,并在构造函数中创建hbitmap

void GtBitmap::Load() 
    { 
     LPTSTR szFileName; 
     szFileName = (LPTSTR)m_strPath.c_str(); 
     // Check for valid .BMP file path 
     if (m_strPath.size() > 0) 
     { 
      // Open .BMP file 
      m_pFile = fopen(m_strPath.c_str(), ("rb")); 
      if (m_pFile != NULL) 
      { 

       m_hBitmap = (HBITMAP)LoadImage (GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_SHARED | LR_LOADFROMFILE); 

       GetObject(m_hBitmap, sizeof(m_bmap), &m_bmap); 
       int i = 1; 
      } 
     } 
     else if (m_intResourceID != 0) 
     { 
      m_hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(m_intResourceID), IMAGE_BITMAP, 0, 0, LR_SHARED); 
      GetObject(m_hBitmap, sizeof(m_bmap), &m_bmap); 
      int i = 1; 
     } 
    } 

但是,当我尝试在我的代码块中呈现它时,SelectObject返回null。这是画家类的那部分的代码。

void GtPainterGDI::GtDrawBitmap(GtRectI & target, GtBitmap & bitmap, bool blnOffset) 
    { 
     GtCanvas topCv = m_arrCanvas.back(); 
     HDC hdcMem = CreateCompatibleDC(topCv.m_hdcParent); 
     HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.m_hBitmap); 
     DWORD lastError = GetLastError(); 

     bool success = BitBlt(hdcMem, target.GetLeft(), target.GetTop(), 
      target.Width(), target.Height(), hdcMem, 0, 0, SRCCOPY); 

     SelectObject(hdcMem, bitmap.m_hBitmap); 
     DeleteDC(hdcMem); 
    }; 

SelectObject()返回null,并且图像未绘制。如果在该绘图函数中使用LoadImage(),我只能看到图像。但是,我不想每次我想要绘制时加载图像。我应该能够在Load函数或位图的构造函数中加载一次图像,然后在绘制函数中使用该句柄。

如果有人可以请提供一个例子,在构造函数中加载图像,然后在代码WM_PAINT或其他画图函数中的其他地方绘画,我将不胜感激。该代码是GT图形用户界面库的新版本。我计划在未来几天内在codeproject上发布新版本。我必须先做一些清理...

在此先感谢。

回答

0

HINSTANCE​​中的参数在从文件加载图像时应该是NULL。仅当从资源加载时才使用GetModuleHandle(NULL)

m_hBitmap = (HBITMAP)LoadImage(NULL, m_strPath.c_str(), 
    IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
if (!m_hBitmap) 
{ 
    //report error 
} 

另外LR_SHARED在这里没有必要。

当测试文件存在时,可以使用std::ifstream。例如:

#include <fstream> 
... 
bool test = std::ifstream(m_strPath).good(); 

这将测试文件并立即关闭文件句柄。

确保在删除之前hdcMem选择hbmOld

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.m_hBitmap); 
BitBlt(...) 
//SelectObject(hdcMem, bitmap.m_hBitmap); <<= remove this 
SelectObject(hdcMem, hbmOld); 
DeleteDC(hdcMem); 
+0

谢谢您的帮助。 –

相关问题