描述:
大家好,我现在要开发一个自己的控件,控件里面封装了ESRI公司开发的MapObjects2控件(这个是搞GIS系统开发用的,是一个成熟的产品控件),封装一些常用的方法,为了以后开发方便.但是遇到一个问题的,问题是这样的:
由于我自己的控件里面封装MapObjects2,所以,需要在我的控件大小发生变化的时候,让MaoObjects2控件充满我的控件,所以,我在我的控件的OnSize()里做了如下的工作:
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// TODO : Add Code for message handler. Call DefWindowProc if necessary.
CRect rect;
::GetClientRect(m_hWnd, &rect);
::SetWindowPos(::GetDlgItem(m_hWnd, IDC_MAP1), HWND_BOTTOM, rect.left, rect.top, rect.Width(), rect.Height(), SWP_NOZORDER | SWP_FRAMECHANGED);
return 0;
}
目的是每次Size大小发生变化,就让Map控件充满整个空间区域。但是,测试发现,填充的时候获取的矩形总是拖动窗口前的矩形,也就是说,填充的结果总是Size变化前的范围,而不是变化后的范围。我不知道原因出在哪里,想了好几个方法也解决不了。希望大家帮忙。谢谢。
另外,为了测试我的方法是否可行,我添加了一个 Edit 控件,然后,做了同样的工作,(完全相同的代码,一模一样,没有任何的区别)。发现 Edit 填充的范围就是Size变化后的范围,能够满足我一开始想要的效果:每次Size变化后,Edit就可以完全充满我的控件。
问题就是这样,不知道我说清楚了没有,请各位朋友帮忙。再次感谢!
解决方案1:
从LParam中取得窗口大小,具体参见MSDN,处理的时候判断一下参数中的大小是否与
当前大小一样大, 一般WM_SIZE最后一次传送的lParam就是当前窗口大小
LRESULT CSimpleGrid::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (!IsWindow())
return 0;
long nWidth = LOWORD(lParam);
long nHeight = HIWORD(lParam);
m_wndGrid.SetWindowPos( HWND_TOP,
0,
0,
nWidth,
nHeight,
SWP_NOACTIVATE |
SWP_SHOWWINDOW );
return 0;
}
哦~,
这么说,在OnSize函数内GetClientRect必然得到变化前的Size了。
那么,能不能自定义一个消息,WM_MYSIZE,然后在OnSize里发送这个消息,
在OnSize完成后,想必这个WM_MYSIZE就触发了,
那么在OnMySize里GetClientRect可能得到变化后的Size了。
只是设想,^_^