首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

使用 API 函數實現外部位圖瀏覽與縮放顯示

     編輯:關於VC++

簡單三步驟:載入、繪製、瀏覽

無需 CDib 類別,直接以 Win32 API LoadImage、StretchBlt 載入並繪製外部 BMP 檔案,搭配 CFileFind 實現資料夾內多圖瀏覽。

瀏覽器介面

核心程式碼

1. 開啟單一 BMP 並繪製到 Picture 控制項

CFileDialog dlg(TRUE, "bmp", "*.bmp", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
                "位圖檔(*.bmp)|*.bmp||");
if (dlg.DoModal() == IDOK) {
    Calculate(); // 掃描同目錄下所有 .bmp

    HWND hPic = GetDlgItem(IDC_PIC)->m_hWnd;
    HDC hDst = ::GetDC(hPic);
    HDC hSrc = CreateCompatibleDC(hDst);

    HBITMAP hBmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(),
        dlg.GetPathName(), IMAGE_BITMAP, 0, 0,
        LR_LOADFROMFILE | LR_CREATEDIBSECTION);

    BITMAP bm; GetObject(hBmp, sizeof(BITMAP), &bm);
    SelectObject(hSrc, hBmp);

    RECT rc; ::GetClientRect(hPic, &rc);
    SetStretchBltMode(hDst, COLORONCOLOR); // 關鍵:高品質縮放
    StretchBlt(hDst, rc.left, rc.top, rc.right, rc.bottom,
               hSrc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY);

    // 更新捲軸與張數顯示
    int pos = FindIndex(dlg.GetPathName());
    m_Scroll.SetScrollRange(0, total-1);
    m_Scroll.SetScrollPos(pos);
    m_Num.Format("第 %d 張, 共 %d 張", pos+1, total);
    UpdateData(FALSE);

    SetTimer(ID_TIMER, 30, NULL); // 避免對話框殘留黑塊
}

2. 掃描資料夾取得所有 BMP 路徑

void Calculate() {
    total = 0;
    CFileFind finder;
    BOOL b = finder.FindFile("*.bmp");
    while (b) {
        b = finder.FindNextFile();
        files[total++] = finder.GetFilePath(); // 絕對路徑
    }
}

3. 捲軸事件切換圖片

void OnHScroll(UINT code, UINT pos, CScrollBar* bar) {
    if (bar->GetDlgCtrlID() == IDC_SCROLL) {
        int idx = m_Scroll.GetScrollPos();
        LoadBitmapByIndex(idx); // 同開啟邏輯,改用 files[idx]
    }
}

關鍵提示

  • SetStretchBltMode(hDC, COLORONCOLOR) 必須設定,否則縮放畫質極差
  • 小圖載入極快會導致檔案對話框殘留,故加入 SetTimer 強制重繪
  • 檔名緩衝區 char FileName[250] 需足夠大,避免截斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved