ファイルパスまたはリソースIDのいずれかからビットマップをロードするロード機能を持つビットマップクラスがあります。この部分はうまく動作します。SelectObjectは、コンストラクタでhbitmapを作成してNULLを返します。
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()を使用すると、イメージが表示されるだけです。しかし、私はペイントしたいときはいつもイメージをロードしたくありません。私は、画像をロード関数またはビットマップのコンストラクタに一度ロードしてから、ペイント関数でハンドルを使用することができます。
誰でもコンストラクタで画像を読み込んだ後、コードWM_PAINTまたは同等のペイント関数内の別の場所にペイントしていただければ幸いです。このコードは、GTグラフィカルユーザーインターフェイスライブラリの新しいバージョンです。数日後にcodeprojectに新しいバージョンを投稿するつもりです。私はいくつかのクリーンアップを最初にやらなければならない...
ありがとうございます。
はあなたの助けをいただき、ありがとうございます。 –