如何更改 MFC 中的 VIEW 大小以适应输入图像?

Posted

技术标签:

【中文标题】如何更改 MFC 中的 VIEW 大小以适应输入图像?【英文标题】:How to change VIEW size in MFC to fit the input image? 【发布时间】:2013-09-16 13:34:10 【问题描述】:

我想更改 VIEW 大小以适应输入图像的大小。

首先,我使用 File Open 打开 bmp 或 jpg(jpeg/gif) 图像。

打开bmp图片:

void CDrawToolView::ShowBitmap(CDC* pDC,CString strPicPath)
        
    HBITMAP hBitmap=(HBITMAP)LoadImage(NULL,strPicPath,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
    m_bitmap.Detach();
    m_bitmap.Attach(hBitmap);

    CRect rect;
    GetClientRect(&rect);

    CDC dcImage;
    if (!dcImage.CreateCompatibleDC(pDC))
    
        return;
    
    BITMAP bm;
    m_bitmap.GetBitmap(&bm);
    dcImage.SelectObject(&m_bitmap);
    pDC->StretchBlt(0,0,rect.right,rect.bottom,&dcImage,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY); 

打开 jpg(jpeg/gif) 图片:

void CDrawToolView::ShowPic(CDC* pDC,CString strPicPath)
        
    if(!m_MyImage.IsNull())
        m_MyImage.Destroy();
    HRESULT hResult=m_MyImage.Load(strPicPath);
    int iWidth=m_MyImage.GetWidth();
    int iHeight=m_MyImage.GetHeight();
    m_MyImage.Draw(pDC->m_hDC,0,0,iWidth,iHeight);

然后,我想将MainFrm.cpp 中的cs.cxcs.cy 更改为图像的大小。

我原来的 VIEW 设置是:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

    if( !CFrameWnd::PreCreateWindow(cs) )
        return FALSE;
    cs.x=320;
    cs.y=15;

    cs.cx=441; //210*2
    cs.cy=701; //297*2

    return TRUE;

我可以使用指针将输入图像的宽度和高度从CDrawToolView 传递到MainFrm.cpp 中的cs.cxcs.cy,并自动更改视图大小吗?

编辑:

我尝试使用OnSize 发回cxcy

void CDrawToolView::OnSize(UINT nType, int cx, int cy)

    CView::OnSize(nType, cx, cy);
    CWnd* pMainFrame = this->GetParent();
    ::SendMessage(pMainFrame->m_hWnd,WM_SIZE,0,0);

以及如何将宽度和高度传递给它?

【问题讨论】:

向您的主机发送一条 WM_SIZE 消息。但是您需要计算环绕位图图像大小所需的大小(即,您希望客户端空间成为图像的大小,并且您需要添加边框/帧大小因为消息需要帧大小。 一种简单的方法是获取客户端矩形的当前大小,确定需要更改多少才能达到图像大小,然后获取当前帧大小,并发送一个带有新矩形的 WM_SIZE,该矩形由您在上面计算的调整大小进行调整。简单:) @Mordachai 我已经根据您的建议编辑了我的问题。以及如何将宽度和高度传递给 cx 和 cy? 阅读您的问题并再次编辑部分,这真的没有意义。您似乎无法理解如何在 C(和 C++)中传递参数,而不是 MFC 的特定问题。 查看 IInspectable 的回答。如果您在显示视图之前知道大小,那么这是一个很好的方法。如果您动态加载图像,并且需要不断更改视图大小以适应每个新加载的图像,那么您向自己发送 WM_SIZE 消息 - 您不需要 OnSize 处理程序(这完全不相关)。 【参考方案1】:

要在创建窗口之前将所需的窗口尺寸调整为特定的客户端大小,您需要调用AdjustWindowRectAdjustWindowRectEx

来自文档:

根据所需的客户矩形大小计算所需的窗口矩形大小。

通过CREATESTRUCT成员styledwExStyle可以获得所需的窗口样式和扩展窗口样式。

【讨论】:

我终于用SetWindowPos()解决了这个问题。不过,确实感谢您的建议。我是 MFC 的新人,在不同情况下都在努力传递参数。所以我决定按照你的建议从基础学习。【参考方案2】:

注意:未经测试的代码 - 其中一些是伪代码,但它应该为您提供 IDEA:

inline BOOL MoveWindow(HWND hwnd, const RECT & rect, BOOL bRepaint)

    return ::MoveWindow(hwnd, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, bRepaint);


void CDrawToolView::LoadPic(CString strPicPath)
        
    if(!m_MyImage.IsNull())
        m_MyImage.Destroy();
    HRESULT hResult=m_MyImage.Load(strPicPath);
    int iWidth=m_MyImage.GetWidth();
    int iHeight=m_MyImage.GetHeight();
    CRect client(0, 0, iWidth, iHeight);
    AdjustWindowRect(&client, GetWindowStyle(GetHwnd()), TRUE/FALSE); // You will need to write the helper: GetWindowStyle, or replace this with more statements to obtain the style into a DWORD and then use that DWORD here...
    ResizeWindow(GetHwnd(), &client, TRUE);

【讨论】:

以上是关于如何更改 MFC 中的 VIEW 大小以适应输入图像?的主要内容,如果未能解决你的问题,请参考以下文章

调整 MFC 网格控件的大小以适应对话框?

如何更改弹出菜单的字体大小(MFC、VC6)

旋转UIView并使其更改视图大小以适应相对于旋转的空间

自动更改字体大小以适应swift中的按钮

如何在方向更改时调整多个标签的大小以自动适应 UIView 内部

MFC怎么让主窗口随View类改变大小