MFC用代码加载一张bmp图片到picture control并适应到控件大小 解决OnInitDialog中调用不显示

2024-01-02 15:52:35

要使用CImage::Draw的缩放功能来适应控件大小,你需要先获取控件的当前大小,然后根据这个大小来调整图片的绘制尺寸。以下是一个修改后的示例,展示了如何实现这一点:

  1. 获取控件大小:首先,获取Picture Control的当前大小。

  2. 计算缩放比例:根据图片的原始大小和控件的大小计算缩放比例。

  3. 使用Draw方法的缩放参数:在CImage::Draw方法中使用计算出的尺寸来绘制图片。

以下是修改后的代码示例:

void CYourDialog::LoadImageToPictureControl()
{
    CImage image;
    HRESULT hResult = image.Load(_T("路径\\你的图片.bmp")); // 加载图片
    if(SUCCEEDED(hResult))
    {
        // 获取Picture Control的句柄
        CStatic* pPictureControl = (CStatic*)GetDlgItem(IDC_STATIC_IMAGE);

        // 获取控件大小
        CRect rect;
        pPictureControl->GetClientRect(&rect);
        int controlWidth = rect.Width();
        int controlHeight = rect.Height();

        // 获取图片原始尺寸
        int imageWidth = image.GetWidth();
        int imageHeight = image.GetHeight();

        // 创建兼容的DC
        CDC* pDC = pPictureControl->GetDC();
        CDC memDC;
        memDC.CreateCompatibleDC(pDC);
        
        // 创建兼容的位图,并选入内存DC
        CBitmap bmp;
        bmp.CreateCompatibleBitmap(pDC, controlWidth, controlHeight);
        CBitmap* pOldbmp = memDC.SelectObject(&bmp);

        // 清空背景
        memDC.FillSolidRect(&rect, pDC->GetBkColor());

        // 使用CImage绘制到内存DC,这里使用缩放
        image.Draw(memDC.m_hDC, 0, 0, controlWidth, controlHeight, 0, 0, imageWidth, imageHeight);

        // 将内存DC绘制到控件上
        pDC->BitBlt(0, 0, controlWidth, controlHeight, &memDC, 0, 0, SRCCOPY);

        // 清理
        memDC.SelectObject(pOldbmp);
        ReleaseDC(pDC);
    }
    else
    {
        // 图片加载失败的处理
    }
}

这段代码将根据控件的大小来缩放图片,使其适应控件的尺寸。注意,这种方法可能会导致图片的长宽比发生变化,因此你可能需要根据实际需要来调整缩放方式,比如保持图片的长宽比等。

解决OnInitDialog中调用不显示

如果在OnInitDialog中调用加载图片的代码但图片没有显示,这可能是因为在OnInitDialog执行时,控件的尺寸还没有被最终确定。一个常见的解决办法是稍后在对话框完全初始化后再加载图片。你可以通过使用Windows的定时器(Timer)功能,在OnInitDialog完成后立即触发图片的加载。

以下是如何实现这一功能的步骤:

  1. OnInitDialog中设置一个短暂的定时器:在OnInitDialog函数中,设置一个一次性的定时器,它将在对话框显示并且所有控件都已经初始化之后激活。

  2. 处理定时器消息:在定时器触发时,调用加载图片的函数。

  3. 在加载图片后销毁定时器:一旦图片加载完毕,销毁定时器。

示例代码如下:

BOOL CYourDialog::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 设置定时器,假设定时器ID为1,延迟为100毫秒
    SetTimer(1, 100, NULL);

    return TRUE;
}

void CYourDialog::OnTimer(UINT_PTR nIDEvent)
{
    // 检查是不是我们设置的定时器
    if (nIDEvent == 1)
    {
        LoadImageToPictureControl(); // 加载图片

        KillTimer(1); // 销毁定时器
    }

    CDialog::OnTimer(nIDEvent);
}

在这个例子中,定时器在OnInitDialog中设置,然后在OnTimer事件处理函数中调用加载图片的代码。这样可以确保在控件已经被初始化且窗口已经准备好显示的时候再加载图片。记得在图片加载后使用KillTimer来销毁定时器,以避免它再次触发。

文章来源:https://blog.csdn.net/chenhao0568/article/details/135340669
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。