Win32 MFC窗口背景图片平铺时不应该

时间:2017-02-18 22:49:27

标签: winapi mfc gdi

我在MFC制作了一个示例启动画面,它只显示一个以图像为背景的最顶层无边框窗口。我有一个非常奇怪的问题,即使我们使用相同的操作系统,我的朋友计算机上也会出现这个问题。我已经解决了这个问题,但是我想知道为什么这可能发生在他的机器而不是我的机器上以及为什么我创建的备用版本在两台机器上都有效。

破解方法1(适合我,不适合他)

BOOL Splash::PreCreateWindow(CREATESTRUCT& cs)
{
    if (!CFrameWnd::PreCreateWindow(cs))
        return FALSE;

    CBitmap bitmap; bitmap.LoadBitmap(MAKEINTRESOURCE(IDB_BITMAP1));
    CBrush bitmapBrush; bitmapBrush.CreatePatternBrush(&bitmap);
    bitmap.DeleteObject();

    cs.style = WS_POPUP;
    cs.dwExStyle = WS_EX_TOPMOST;

    cs.lpszClass = AfxRegisterWndClass(0, 0, (HBRUSH)bitmapBrush.Detach());
    bitmapBrush.DeleteObject();

    return TRUE;
}

上述功能在我的2个Windows版本(Windows 7和10)上完全正常,并在我朋友的Windows 7实例上显示偏心的平铺位图。

工作方法2(适用于目前为止所测试的所有内容)

void Splash::OnPaint()
{
    CRect window;
    this->GetClientRect(&window);

    PAINTSTRUCT paint = { 0 };
    CDC *dc = this->BeginPaint(&paint);

    CDC memDC;
    memDC.CreateCompatibleDC(dc);
    CBitmap *oldBitmap = memDC.SelectObject(&this->m_SplashBitmap);

    dc->BitBlt(window.left, window.top, window.right, window.bottom, &memDC, 0, 0, SRCCOPY);

    memDC.SelectObject(oldBitmap);
    memDC.DeleteDC();

    this->EndPaint(&paint);
}

以上代码适用于我的Windows 7,Windows 10和我朋友的Windows 7实例。任何想法为什么会这样或者可能发生什么?也许我的第一次迭代完全错了?

1 个答案:

答案 0 :(得分:0)

您朋友的机器运行的DPI与您的DPI不同,您的应用未标记为支持DPI。

我假设你试图使位图和窗口的大小相同,期望只有一个位图副本会填满窗口。

在一台机器上,没有DPI缩放,一切正常。

在另一台具有DPI缩放功能的计算机上,窗口大小实际上会按比例放大。背景绘图可能是用PatBlt完成的,它不会被缩放;模式(画笔)只是根据需要重复填充该区域。

当您使用BitBlt时,窗口将对窗体应用与窗口相同的DPI缩放,因此无论缩放是否开启,它都有效。