簡體   English   中英

使用 MFC 從文件加載 BMP

[英]Load BMP from file by using MFC

我嘗試將 bmp 加載到我的 MFC 優化校准。

void CMFCAppDlg::OnBnClickedButtonload()
{
    CFileDialog dlg(TRUE);
    int result=dlg.DoModal();
    if(result==IDOK)
    {
        MyBmpFile::Instance() -> setPath (dlg.GetPathName());
        UpdateData(FALSE);
    }
    HANDLE hBitmap = LoadImage(0, MyBmpFile::Instance() -> getPath(), IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    CBitmap m_bitmap;
    m_bitmap.Attach((HBITMAP)hBitmap);

    CDC dc, *pDC;
    BITMAP bmp;

    m_bitmap.LoadBitmapW(IDB_BITMAP);
    m_bitmap.GetBitmap(&bmp);

    pDC = this->GetDC();
    dc.CreateCompatibleDC(pDC);
    dc.SelectObject(m_bitmap);
    pDC->BitBlt(200, 200, bmp.bmWidth, bmp.bmHeight, &dc,0 , 0, SRCCOPY);

    m_bitmap.DeleteObject();
    m_bitmap.Detach();
}

此代碼在我 select 對話框中的項目后返回錯誤。 問題在於LoadImage()它返回NULL 但實際上我不知道我做錯了什么。

好的,我用 CImage 來繪制這個 bmp,反正我沒有解決LoadImage()的問題。 我嘗試以 static 的方式制作它,例如: L"D:\\e.bmp"_T("D:\\e.bmp")但即使存在問題也與以前相同。

void CMFCAppDlg::OnBnClickedButtonload()
{
    CFileDialog dlg(TRUE);
    int result=dlg.DoModal();
    if(result==IDOK)
    {
        MyBmpFile::Instance() -> setPath (dlg.GetPathName());
        UpdateData(FALSE);
    }

    CImage image;
    image.Load( MyBmpFile::Instance() ->getPath() );

    CDC dc, *pDC;

    pDC = this->GetDC();
    dc.CreateCompatibleDC(pDC);
    image.Draw(pDC -> GetSafeHdc(),0,0);
}

以下可能會有所幫助:

INSTANCE hInst = AfxGetInstanceHandle();
HBITMAP hBmp = (HBITMAP)LoadImage(hInst, L"path\to\file.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

幾件事要檢查:

  • 您使用的是 1 字節還是 2 字節字符。 后者使用L宏。
  • 是否正確指定了文件的路徑(例如,可能與程序恰好運行的位置相關)
  • 您可以像下面的示例中那樣手動將文件加載為 bitmap 嗎?

將文件手動加載為 bitmap 的代碼:

CFile file;
if (file.Open(L"C:\\Tmp\\Example.bmp", CFile::modeRead))
{
    // Read file header
    BITMAPFILEHEADER bmfHeader;
    if (file.Read((LPSTR) &bmfHeader, sizeof(bmfHeader)) == sizeof(bmfHeader))
    {
        // File type should be 'BM'
        if (bmfHeader.bfType == ((WORD)('M' << 8)| 'B'))
        {
            BITMAPINFOHEADER bmiHeader;
            if (file.Read((LPSTR) &bmiHeader, sizeof(bmiHeader)) == sizeof(bmiHeader))
            {
                int width = bmiHeader.biWidth;
                int height = bmiHeader.biHeight;
            }
        }
    }

    file.Close();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM