拉伸窗口跟最大化窗口有什么不同?

实况灬天河 2016-12-08 08:14:29
我在主窗口和子窗口(对话框)的WM_SIZE消息中,根据拉伸的比例移动和改变子窗口和子窗口控件的大小位置。拉伸的时候,窗口和控件显示是正常的,但是我双击主窗口标题栏或者单击最大化按钮的时候,子窗口的缩放和位置是正常的,但是在子窗口上面的控件则不显示,难道最大化的处理,不是在WM_SIZE消息中处理的吗?断点跟踪时,有看到缩放部分的代码有执行。我之前有怀疑是控件的坐标和宽高有问题,但是跟踪查看的时候,也没有看到异常的坐标数据噢。我还怀疑是移动控件和子窗口之后,没有进行ShowWindow处理,但是,子窗口的缩放又是对的,也显示。求解……
以下附上主要的代码……
响应主窗口WM_SIZE消息函数
LRESULT MainWND_OnSize(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
RECT rect;
GetWindowRect(hwnd,&rect);
//1.0 make expression effective .otherwise 1/3 = 0
fH_Stretch_ratio = (rect.right-rect.left-g_nFrameWidth)*1.0/nWindow_cx;
fV_Stretch_ratio = (rect.bottom-rect.top-g_nFrameHeight)*1.0/nWindow_cy;
if (!g_cdMainwindowManager.EmptyList())
{
g_cdMainwindowManager.DeferMoveItemCtrlDimen(fH_Stretch_ratio,fV_Stretch_ratio);
}
return 0;
}

响应子对话框WM_SIZE消息
BOOL HLPDLG_OnSize(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
if (!g_cdDLPdlgCtrlManager.EmptyList())
{
//g_cdDLPdlgCtrlManager.MoveItemCtrlDimen(fH_Stretch_ratio,fV_Stretch_ratio);
g_cdDLPdlgCtrlManager.DeferMoveItemCtrlDimen(fH_Stretch_ratio,fV_Stretch_ratio);
}
return TRUE;
}

延迟移动窗口函数 子窗口和控件的句柄和坐标宽高都已经存到单向链表中,拉伸的时候,显示正常。
BOOL CCtrlDimen::DeferMoveItemCtrlDimen(float fhratio,float fvratio)
{
int nCtrlnum = 0;
Node * p = head;
while (p->pnext != NULL)
{
nCtrlnum++;
p = p->pnext;
}
if (nCtrlnum == 0 )
{
return FALSE;
}
HDWP hdwpbe = BeginDeferWindowPos(nCtrlnum);
HDWP hdwp;
p = head;
do
{
p = p->pnext;
hdwp = DeferWindowPos(hdwpbe,(HWND)p->hHandle,HWND_TOP,
p->nleft*fhratio,p->ntop*fvratio,p->nwidth*fhratio,p->nheight*fvratio,SWP_SHOWWINDOW);
} while (p->pnext != NULL);
EndDeferWindowPos(hdwp);
return TRUE;
}
...全文
227 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
实况灬天河 2017-01-01
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
WM_SIZE中处理SIZE_MAXIMIZED和SIZE_MINIMIZED情况
不好意思呃……年底了,上个月加班加晕了……还没时间试……谢谢版主……我先结帖……
paschen 版主 2016-12-08
  • 打赏
  • 举报
回复
WM_SIZE中处理SIZE_MAXIMIZED和SIZE_MINIMIZED情况

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧