簡體   English   中英

如何使用 bitblt 在屏幕上繪制由數組制成的位圖?

[英]How do I draw an array made bitmap on screen using bitblt?

我想使用手工制作的位圖,而不是使用MovetoLineTo繪圖,我將用我自己創建的數組填充它,並用它來填充屏幕。

現在,數組只是用紅色填充,但是當我繪制到屏幕上時,我全黑了。

這是代碼:

void CCGWorkView::OnDraw(CDC* pDC)
{
    CCGWorkDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    pDCToUse->FillSolidRect(&r, world.bg_color);

    BITMAPINFO bminfo;
    CPaintDC hdc(this);
    CRect rect;
    GetWindowRect(&rect);

    int h = rect.bottom - rect.top,
        w = rect.right - rect.left;
    int *bits = new int[w * h];

    HDC hdcMem = CreateCompatibleDC(hdc);
    HBITMAP bm = CreateCompatibleBitmap(hdc, w, h);

    SelectObject(hdcMem, bm);

    bminfo.bmiHeader.biSize = sizeof(bminfo.bmiHeader);
    bminfo.bmiHeader.biWidth = w;
    bminfo.bmiHeader.biHeight = h;
    bminfo.bmiHeader.biPlanes = 1;
    bminfo.bmiHeader.biBitCount = 32;
    bminfo.bmiHeader.biCompression = BI_RGB;
    bminfo.bmiHeader.biSizeImage = 0;
    bminfo.bmiHeader.biXPelsPerMeter = 1;
    bminfo.bmiHeader.biYPelsPerMeter = 1;
    bminfo.bmiHeader.biClrUsed = 0;
    bminfo.bmiHeader.biClrImportant = 0;

    for (int i = 0; i < w * h; i++) {
        bits[i] = RGB(255, 0, 0);
    }

    SetDIBits(hdcMem, bm, 0, h, bits, &bminfo, 0);

    BitBlt(hdc, rect.left, rect.top, w, h, hdcMem, rect.left, rect.top, SRCCOPY);

    DeleteDC(hdcMem);
    DeleteObject(bm);
    delete bits;
}

您的代碼中有幾個問題。

首先,您不需要CPaintDC ,因為pDC被傳遞到您的OnDraw()函數中。 這實際上可能導致您的黑色顯示,因為新創建的 DC 選擇了一個單像素的黑白位圖,並且當您調用CreateCompatibleBitmap() ,該位圖也是單色的。

其次, SetDIBits()期望RGBQUAD顏色( https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-rgbquad ),而不是RGB

而且,正如 Constantine Georgiou 所建議的,您應該在刪除之前從 DC 中取消選擇您的位圖以避免資源泄漏,即使 MFC 為您處理它。

這是修改后的代碼:

void CMFCApplication1View::OnDraw(CDC* pDC)
{
    CMFCApplication1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    //pDCToUse->FillSolidRect(&r, world.bg_color);

    BITMAPINFO bminfo;
    CRect rect;
    GetClientRect(&rect);

    int h = rect.bottom - rect.top,
        w = rect.right - rect.left;
    int* bits = new int[w * h];

    HDC hdcMem = CreateCompatibleDC(pDC->m_hDC);
    HBITMAP bm = CreateCompatibleBitmap(pDC->m_hDC, w, h);

    HGDIOBJ hOld = SelectObject(hdcMem, bm);

    bminfo.bmiHeader.biSize = sizeof(bminfo.bmiHeader);
    bminfo.bmiHeader.biWidth = w;
    bminfo.bmiHeader.biHeight = h;
    bminfo.bmiHeader.biPlanes = 1;
    bminfo.bmiHeader.biBitCount = 32;
    bminfo.bmiHeader.biCompression = BI_RGB;
    bminfo.bmiHeader.biSizeImage = 0;
    bminfo.bmiHeader.biXPelsPerMeter = 1;
    bminfo.bmiHeader.biYPelsPerMeter = 1;
    bminfo.bmiHeader.biClrUsed = 0;
    bminfo.bmiHeader.biClrImportant = 0;

    RGBQUAD red = { 0, 0, 255, 0 };
    for (int i = 0; i < w * h; i++) {
        bits[i] = *((int*)&red);
    }

    SetDIBits(hdcMem, bm, 0, h, bits, &bminfo, DIB_RGB_COLORS);

    BitBlt(pDC->m_hDC, rect.left, rect.top, w, h, hdcMem, rect.left, rect.top, SRCCOPY);

    SelectObject(hdcMem, hOld);
    DeleteDC(hdcMem);
    DeleteObject(bm);
    delete[] bits;
}

暫無
暫無

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

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