MFC uses code to load a bmp picture into the picture control and adapt it to the size of the control to solve the problem that the call in OnInitDialog does not display.

To use CImage::Drawthe scaling function to adapt to the size of the control, you need to first get the current size of the control, and then adjust the drawing size of the image based on this size. Here is a modified example showing how to achieve this:

  1. Get the control size : First, get the current size of the Picture Control.

  2. Calculate the scaling ratio : Calculate the scaling ratio based on the original size of the image and the size of the control.

  3. Use Drawthe scaling parameter of the method : CImage::DrawUse the calculated dimensions in the method to draw the image.

Here is the modified code example:

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
    {
    
    
        // 图片加载失败的处理
    }
}

This code will scale the image to fit the size of the control. Note that this method may cause the aspect ratio of the image to change, so you may need to adjust the scaling method according to actual needs, such as maintaining the aspect ratio of the image.

Solve the problem that the call in OnInitDialog is not displayed

If OnInitDialogyou call the code that loads an image in but the image does not display, this may be because OnInitDialogthe control's dimensions have not been finalized at the time of execution. A common workaround is to load the image later, after the dialog box has fully initialized. You can trigger the image to load immediately after completion by using the Windows Timer function OnInitDialog.

Here are the steps on how to implement this functionality:

  1. OnInitDialogSet a short-lived timer in : In OnInitDialogthe function, set a one-time timer that will activate after the dialog box is displayed and all controls have been initialized.

  2. Processing timer messages : When the timer triggers, call the function that loads the image.

  3. Destroy the timer after loading the image : Once the image is loaded, destroy the timer.

The sample code is as follows:

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);
}

In this example, the timer OnInitDialogis set in and then OnTimerthe code that loads the image is called in the event handler. This ensures that the image is loaded when the control has been initialized and the window is ready to be displayed. Remember to use destroy timer after image is loaded KillTimerto avoid it triggering again.

Guess you like

Origin blog.csdn.net/chenhao0568/article/details/135340669