根据显示的位图大小显示错误

时间:2015-01-08 02:19:33

标签: mfc


我在SDI视图中遇到了麻烦 我使用以下代码来显示位图缓冲区。 根据位图的宽度以及宽度变大时,会出现闪烁问题 此外,该视图显示如下所示的奇怪数据:

Flickering and weird display

这是预期的显示。 Correct display

我在这个视图中使用的代码在这里:

void CTestLargeView::RefreshDisplay()
{
    CClientDC dc(this);
    CRect cRect;
    GetClientRect(&cRect);

    LPBITMAPINFO pBmpInfo;
    pBmpInfo = (LPBITMAPINFO) new BYTE[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)];

    pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pBmpInfo->bmiHeader.biWidth = XSize;
    pBmpInfo->bmiHeader.biHeight = YSize;
    pBmpInfo->bmiHeader.biPlanes = 1;
    pBmpInfo->bmiHeader.biBitCount = 32;
    pBmpInfo->bmiHeader.biCompression = BI_RGB;
    pBmpInfo->bmiHeader.biSizeImage = XSize * YSize;
    pBmpInfo->bmiHeader.biXPelsPerMeter = 0;
    pBmpInfo->bmiHeader.biYPelsPerMeter = 0;
    pBmpInfo->bmiHeader.biClrUsed = 0;
    pBmpInfo->bmiHeader.biClrImportant = 0;

    SetStretchBltMode(dc.m_hDC, STRETCH_DELETESCANS);
    StretchDIBits(dc.m_hDC, 
                  0, 
                  0, 
                  cRect.Width(), 
                  cRect.Height(), 
                  0, 
                  0, 
                  XSize, 
                  YSize, 
                  Data, 
                  pBmpInfo, 
                  DIB_RGB_COLORS, 
                  SRCCOPY);

    delete[] pBmpInfo;
}

void CTestLargeView::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == 150)
        RefreshDisplay();

    CView::OnTimer(nIDEvent);
}

int CTestLargeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CView::OnCreate(lpCreateStruct) == -1)
        return -1;

    SetTimer(150, 33, NULL);

    XSize = 32000;  // No flickering
    //XSize = 32800;    // Flickering occurring

    YSize = 256;

    Data = new int[XSize * YSize];

    for (int i = 0 ; i < XSize * YSize ; i++)
        Data[i] = RGB(i % 255, i % 255, i % 255);

    return 0;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

发现问题 - &gt;
它是由&#34; STRETCH_DELETESCANS&#34;引起的。将其更改为STRETCH_HALFTONE正在纠正这个问题。