1

ファイル パスまたはリソース ID からビットマップをロードするためのロード関数を持つビットマップ クラスがあります。この部分は正常に動作します。

    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 に投稿する予定です。まずは大掃除しなきゃ…

前もって感謝します。

4

1 に答える 1

0

HINSTANCEパラメータ inは、ファイルから画像をロードするときに指定するLoadImage必要があります。リソースからロードする場合にのみ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();

これにより、ファイルがテストされ、ファイル ハンドルがすぐに閉じられます。

hbmOld削除する前に必ず選択してくださいhdcMem:

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.m_hBitmap);
BitBlt(...)
//SelectObject(hdcMem, bitmap.m_hBitmap); <<= remove this
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
于 2016-11-15T01:05:34.843 に答える