如何更改 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.cx
和cs.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.cx
和cs.cy
,并自动更改视图大小吗?
编辑:
我尝试使用OnSize
发回cx
和cy
:
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】:要在创建窗口之前将所需的窗口尺寸调整为特定的客户端大小,您需要调用AdjustWindowRect
或AdjustWindowRectEx
。
来自文档:
根据所需的客户矩形大小计算所需的窗口矩形大小。
通过CREATESTRUCT
成员style
和dwExStyle
可以获得所需的窗口样式和扩展窗口样式。
【讨论】:
我终于用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 大小以适应输入图像?的主要内容,如果未能解决你的问题,请参考以下文章