MFC TableControl 控件各子页面以及子页面上的控件 随窗口最大化 而改变大小

kmcfly 2014-07-25 10:55:17
RT
在MFC的主对话框中有Tabcontrol 控件,控件上绑定了两个子对话框,子对话框上有一些控件,,现在窗口最大化后,,怎么调整子对话框中控件的大小???
说明:主对话框中的tabcontrol控件可以 随窗口最大化 而改变大小:
void CManageTabDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
if((m_change_flag == true)&&(CPageDb::m_bInitDlg = true))
{
// ShowWindow(SW_MAXIMIZE);
ReSize(IDC_TAB_SERVER_INFO,true);//这行可以改变大小,IDC_TAB_SERVER_INFO--tabcontrol控件ID
ReSize(IDD_PAGE_DB,true);//tabcontrol控件上添加的页面ID, 这个不可以改变大小,phWnd =NULL

m_Multiple_width = float(1)/ m_Multiple_width ;
m_Mutiple_heith = float(1)/m_Mutiple_heith ;
}//IDC_TAB_SERVER_INFO
}


void CManageTabDlg::ReSize(int nID,bool bSizeFlag)
{
CRect Rect;
CWnd *phWnd;

phWnd = GetDlgItem(nID);
if(phWnd == NULL)
{
AfxMessageBox(_T("get HWND error"));
return ;
}
phWnd->GetWindowRect(Rect);
ScreenToClient(Rect);
CManageTabDlg::GetNewRect(Rect,m_Multiple_width,m_Mutiple_heith,bSizeFlag);
phWnd->MoveWindow(Rect,TRUE);
}
...全文
1390 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiq119 2015-10-01
  • 打赏
  • 举报
回复
你压根就没明白人家说的啥。人家的意思是tab页上的子窗口不响应主窗口的OnSize()。
引用 9 楼 fhplzh 的回复:
最近也遇到这样的问题! 我是这么处理的。 主界面,分界面(tab control中的)都是重写onsize来实现。 代码如下,希望对你有帮助!若不懂,可以私信我! 环境:VS2005 主界面的onsize: void CRO2TestDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CWnd hWnd; if (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) { float ratio[2]; POINT newDialogSize; CRect newRect; //获取新的客户区的大小 GetWindowRect(&newRect); newDialogSize.x = newRect.right - newRect.left; newDialogSize.y = newRect.bottom - newRect.top; //得现在的对话框与以往对话框的大小比例 ratio[0] = (float)newDialogSize.x / oSize.x; ratio[1] = (float)newDialogSize.y / oSize.y; CRect Rect; int woc; //左右上角的数据 CPoint OldTLPoint, NewTLPint; CPoint OldBRPoint, NewBRPint; //列出所有控件 HWND hwndChild = ::GetWindow(m_hWnd,GW_CHILD);//获取窗体子控件指针 while(hwndChild) { //取得ID woc = ::GetDlgCtrlID(hwndChild); GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect);//将控件大小转换为在对话框中的区域坐标 OldTLPoint = Rect.TopLeft();//左上角 NewTLPint.x = long(OldTLPoint.x*ratio[0]); NewTLPint.y = long(OldTLPoint.y*ratio[1]); OldBRPoint = Rect.BottomRight();//右小角 NewBRPint.x = long(OldBRPoint.x*ratio[0]); NewBRPint.y = long(OldBRPoint.y*ratio[1]); Rect.SetRect(NewTLPint,NewBRPint); GetDlgItem(woc)->MoveWindow(Rect,TRUE); hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);//获取该窗口下的子控件指针 } //修改tab control中的子界面 CRect rectPara1; m_tabCtrl.GetClientRect(&rectPara1); //调整子对话框在父窗口中的位置 rectPara1.top += 20; rectPara1.bottom += 4; rectPara1.left += 4; rectPara1.right -= 4; m_para1.MoveWindow(&rectPara1); m_para2.MoveWindow(&rectPara1); m_para3.MoveWindow(&rectPara1); m_para4.MoveWindow(&rectPara1); m_para5.MoveWindow(&rectPara1); m_para6.MoveWindow(&rectPara1); m_para7.MoveWindow(&rectPara1); //获取视频窗口父窗口的大小 ::GetClientRect(hWnd, Rect); oSize = newDialogSize; } } tab control中的分界面: void CPara1::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CWnd hWnd; //CRO2TestDlg dlg; if (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) { float ratio[2]; POINT newDialogSize; CRect newRect; //获取新的客户区的大小 GetWindowRect(&newRect); newDialogSize.x = newRect.right - newRect.left; newDialogSize.y = newRect.bottom - newRect.top; //得现在的对话框与以往对话框的大小比例 ratio[0] = (float)newDialogSize.x / oParaSize1.x; ratio[1] = (float)newDialogSize.y / oParaSize1.y; CRect Rect; int woc; //左右上角的数据 CPoint OldTLPoint, NewTLPint; CPoint OldBRPoint, NewBRPint; //列出所有控件 HWND hwndChild = ::GetWindow(m_hWnd,GW_CHILD);//获取窗体子控件指针 while(hwndChild) { //取得ID woc = ::GetDlgCtrlID(hwndChild); GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect);//将控件大小转换为在对话框中的区域坐标 OldTLPoint = Rect.TopLeft();//左上角 NewTLPint.x = long(OldTLPoint.x*ratio[0]); NewTLPint.y = long(OldTLPoint.y*ratio[1]); OldBRPoint = Rect.BottomRight();//右小角 NewBRPint.x = long(OldBRPoint.x*ratio[0]); NewBRPint.y = long(OldBRPoint.y*ratio[1]); Rect.SetRect(NewTLPint,NewBRPint); //如果是下拉框 if(woc == IDC_GPS_TYPE || woc == IDC_ZJ_FLAG || woc == IDC_SDDB_SWI || woc == IDC_DEADZONE_TYPE || woc == IDC_DEADZONE_ONETYPE || woc == IDC_DEADZONE_TWOTYPE) GetDlgItem(woc)->MoveWindow(Rect.left,Rect.top,Rect.Width(),Rect.Height() + 200,TRUE);//+200表示下拉长度 else GetDlgItem(woc)->MoveWindow(Rect,TRUE); hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);//获取该窗口下的子控件指针 } //获取视频窗口父窗口的大小 ::GetClientRect(hWnd, Rect); oParaSize1 = newDialogSize; } }
MrBai_2511 2015-09-10
  • 打赏
  • 举报
回复
tab 上的控件 table里面按钮控件事件怎么响应呀 这个怎么响应的 我也不知道 没有用MFC 感觉好麻烦啊 谁能用windows的消息机制讲一下啊啊啊啊
黑暗时代fhp 2015-08-13
  • 打赏
  • 举报
回复
最近也遇到这样的问题! 我是这么处理的。 主界面,分界面(tab control中的)都是重写onsize来实现。 代码如下,希望对你有帮助!若不懂,可以私信我! 环境:VS2005 主界面的onsize: void CRO2TestDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CWnd hWnd; if (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) { float ratio[2]; POINT newDialogSize; CRect newRect; //获取新的客户区的大小 GetWindowRect(&newRect); newDialogSize.x = newRect.right - newRect.left; newDialogSize.y = newRect.bottom - newRect.top; //得现在的对话框与以往对话框的大小比例 ratio[0] = (float)newDialogSize.x / oSize.x; ratio[1] = (float)newDialogSize.y / oSize.y; CRect Rect; int woc; //左右上角的数据 CPoint OldTLPoint, NewTLPint; CPoint OldBRPoint, NewBRPint; //列出所有控件 HWND hwndChild = ::GetWindow(m_hWnd,GW_CHILD);//获取窗体子控件指针 while(hwndChild) { //取得ID woc = ::GetDlgCtrlID(hwndChild); GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect);//将控件大小转换为在对话框中的区域坐标 OldTLPoint = Rect.TopLeft();//左上角 NewTLPint.x = long(OldTLPoint.x*ratio[0]); NewTLPint.y = long(OldTLPoint.y*ratio[1]); OldBRPoint = Rect.BottomRight();//右小角 NewBRPint.x = long(OldBRPoint.x*ratio[0]); NewBRPint.y = long(OldBRPoint.y*ratio[1]); Rect.SetRect(NewTLPint,NewBRPint); GetDlgItem(woc)->MoveWindow(Rect,TRUE); hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);//获取该窗口下的子控件指针 } //修改tab control中的子界面 CRect rectPara1; m_tabCtrl.GetClientRect(&rectPara1); //调整子对话框在父窗口中的位置 rectPara1.top += 20; rectPara1.bottom += 4; rectPara1.left += 4; rectPara1.right -= 4; m_para1.MoveWindow(&rectPara1); m_para2.MoveWindow(&rectPara1); m_para3.MoveWindow(&rectPara1); m_para4.MoveWindow(&rectPara1); m_para5.MoveWindow(&rectPara1); m_para6.MoveWindow(&rectPara1); m_para7.MoveWindow(&rectPara1); //获取视频窗口父窗口的大小 ::GetClientRect(hWnd, Rect); oSize = newDialogSize; } } tab control中的分界面: void CPara1::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); CWnd hWnd; //CRO2TestDlg dlg; if (nType==SIZE_RESTORED || nType==SIZE_MAXIMIZED) { float ratio[2]; POINT newDialogSize; CRect newRect; //获取新的客户区的大小 GetWindowRect(&newRect); newDialogSize.x = newRect.right - newRect.left; newDialogSize.y = newRect.bottom - newRect.top; //得现在的对话框与以往对话框的大小比例 ratio[0] = (float)newDialogSize.x / oParaSize1.x; ratio[1] = (float)newDialogSize.y / oParaSize1.y; CRect Rect; int woc; //左右上角的数据 CPoint OldTLPoint, NewTLPint; CPoint OldBRPoint, NewBRPint; //列出所有控件 HWND hwndChild = ::GetWindow(m_hWnd,GW_CHILD);//获取窗体子控件指针 while(hwndChild) { //取得ID woc = ::GetDlgCtrlID(hwndChild); GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect);//将控件大小转换为在对话框中的区域坐标 OldTLPoint = Rect.TopLeft();//左上角 NewTLPint.x = long(OldTLPoint.x*ratio[0]); NewTLPint.y = long(OldTLPoint.y*ratio[1]); OldBRPoint = Rect.BottomRight();//右小角 NewBRPint.x = long(OldBRPoint.x*ratio[0]); NewBRPint.y = long(OldBRPoint.y*ratio[1]); Rect.SetRect(NewTLPint,NewBRPint); //如果是下拉框 if(woc == IDC_GPS_TYPE || woc == IDC_ZJ_FLAG || woc == IDC_SDDB_SWI || woc == IDC_DEADZONE_TYPE || woc == IDC_DEADZONE_ONETYPE || woc == IDC_DEADZONE_TWOTYPE) GetDlgItem(woc)->MoveWindow(Rect.left,Rect.top,Rect.Width(),Rect.Height() + 200,TRUE);//+200表示下拉长度 else GetDlgItem(woc)->MoveWindow(Rect,TRUE); hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT);//获取该窗口下的子控件指针 } //获取视频窗口父窗口的大小 ::GetClientRect(hWnd, Rect); oParaSize1 = newDialogSize; } }
wpp123wpp123 2014-10-25
  • 打赏
  • 举报
回复
同问这个问题
微型蚂蚁 2014-07-25
  • 打赏
  • 举报
回复
那就在tabcontrol的OnSize里处理一下,缩放子对话框。不过子对话缩放的时候不会对里面的控件重新排列和缩放,都要你自己在OnSIze处理
kmcfly 2014-07-25
  • 打赏
  • 举报
回复
引用 4 楼 ohyeszq 的回复:
phWnd = GetDlgItem(nID);获取不到对话框的指针。
对,,就是获取不到 子对话框的指针
ohyeszq 2014-07-25
  • 打赏
  • 举报
回复
phWnd = GetDlgItem(nID);获取不到对话框的指针。
kmcfly 2014-07-25
  • 打赏
  • 举报
回复
引用 1 楼 piaobotudou 的回复:
子对话框的父窗口是TabControl?
嗯 是的,,该怎么弄
kmcfly 2014-07-25
  • 打赏
  • 举报
回复
子对话框的父窗口是TabControl? 嗯 是的,,该怎么弄
微型蚂蚁 2014-07-25
  • 打赏
  • 举报
回复
子对话框的父窗口是TabControl?
kmcfly 2014-07-25
  • 打赏
  • 举报
回复
引用 6 楼 piaobotudou 的回复:
那就在tabcontrol的OnSize里处理一下,缩放子对话框。不过子对话缩放的时候不会对里面的控件重新排列和缩放,都要你自己在OnSIze处理
tabcontrol 这个控件在主对话框上,在主对话框的onSize函数中可以改变tabcontrol控件的大小,,,关键是在哪里改变tabcontrol 中子对话框的大小,,,tabcontrol控件没有onsize 消息函数啊。。。 菜鸟求解

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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