mfc tab页面内部控件等比例缩放问题

qq_32192153 2016-10-18 03:51:09
我在主窗口中创建了3个控件 每个控件中分别有一些子窗口和控件,遇到的问题是我的主窗口中的控件和按钮以及tab控件可以等比例缩放,然而tab页面中的子窗口控件不能等比例缩放,
我缩放的代码是在主窗口OninitDialog函数中
CRect rect;
GetWindowRect(&rect);
m_listRect.AddTail(rect);//对话框的区域
CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体
while (pWnd)
{
pWnd->GetWindowRect(rect);//子窗体的区域
m_listRect.AddTail(rect); //CList<CRect,CRect> m_listRect成员变量
pWnd = pWnd->GetWindow(GW_HWNDNEXT);//取下一个子窗体
}


然后在Onsize()函数中
if (m_listRect.GetCount() > 0)
{
CRect dlgNow;
GetWindowRect(&dlgNow);
POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect

CRect dlgSaved;
dlgSaved = m_listRect.GetNext(pos);
ScreenToClient(dlgNow);

double x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例
double y = dlgNow.Height() *1.0 / dlgSaved.Height();
ClientToScreen(dlgNow);

CRect childSaved;
CWnd* pWnd = GetWindow(GW_CHILD);
while (pWnd)
{

childSaved = m_listRect.GetNext(pos);//依次获取子窗体的Rect
childSaved.left = LONG(dlgNow.left + (childSaved.left - dlgSaved.left)*x);//根据比例调整控件上下左右距离对话框的距离
childSaved.right = LONG(dlgNow.right + (childSaved.right - dlgSaved.right)*x);
childSaved.top = LONG(dlgNow.top + (childSaved.top - dlgSaved.top)*y);
childSaved.bottom = LONG(dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom)*y);

ScreenToClient(childSaved);
pWnd->MoveWindow(childSaved);
pWnd = pWnd->GetNextWindow();
}
}


我调试发现CWnd* pWnd = GetWindow(GW_CHILD); 并没有获取到 tab 页面中子窗口的控件ID, 我就想在tab子窗口的onsize中也和主窗口一样处理,发现子窗口中的控件并没有缩放,不知道是什么问题
...全文
425 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
引用 11 楼 VisualEleven 的回复:
主窗口的OnSize()中调整CTabCtrl控件的size,CTabCtrl类的OnSize中调整CDialog子对话框窗口的size,子对话框类的OnSize中调整上面各个子控件的Size。
你说的第一点和第三点我都明白了 第二点遇到点问题,请问下CTabCtrl类是哪来的?,我是在主窗口的类中创建的子页面。
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
谢谢大家的回答我明白了怎么弄了 ,是MFC 不是WPF
赵4老师 2016-10-18
  • 打赏
  • 举报
回复
WPF ?
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
“Tab内是Dlg.rar ” http://download.csdn.net/detail/schlafenhamster/4478966 “本程序是一个对话框内一个Tab,而这个Tab含5个对话框的例子。 5个对话框有相同的背景。 本程序显示如何使用运行时类型识别。 DECLARE_DYNAMIC(CDlg1); 还显示如何调整对话框中控件位置 DeferWindowPos”
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
BOOL C主Dlg::OnInitDialog():

	// TODO: Add extra initialization here
	m_Tab.DeleteAllItems();
	char txt[40];
	TCITEM TabCtrlItem;
	memset(&TabCtrlItem,0,sizeof(TabCtrlItem));
	TabCtrlItem.mask= TCIF_TEXT;
	TabCtrlItem.cchTextMax=260;
	for(int jj=0;jj<5;jj++)
	{
		sprintf(txt,"Dlg%d",jj);
		TabCtrlItem.pszText=txt;//(LPSTR)(LPCSTR)"1";//tabCaption;
		m_Tab.InsertItem(jj, &TabCtrlItem);
	}
	m_Tab.SetCurSel(2);
#ifdef DELETE_BEFORE_CREATE
	CreateNewDlg();
#else
	CreateAllDlgs();
	ShowSelectedDlg();
#endif
Eleven 2016-10-18
  • 打赏
  • 举报
回复
主窗口的OnSize()中调整CTabCtrl控件的size,CTabCtrl类的OnSize中调整CDialog子对话框窗口的size,子对话框类的OnSize中调整上面各个子控件的Size。
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
引用 9 楼 schlafenhamster 的回复:
“在InitializeTabPage()中插入tab的子窗口” 子窗口是 对话框 ?
	CString AnalyseBoxClstr("量化分析");
	CString UserSelectClstr("自选股");

	m_Maintabctrl.InsertItem(0, MinuteBoxstr);
	m_Maintabctrl.InsertItem(1, ThityBoxstr);
	m_Maintabctrl.InsertItem(2, SixtyBoxstr);
	m_Maintabctrl.InsertItem(3, DayBoxClstr);
	m_Maintabctrl.InsertItem(4, WeekBoxClstr);
	m_Maintabctrl.InsertItem(5, MoonBoxClstr);
	m_Maintabctrl.InsertItem(6, AnalyseBoxClstr);
	m_Maintabctrl.InsertItem(7, UserSelectClstr);

	CRect rec;
	m_Maintabctrl.GetClientRect(&rec);//获得TAB控件的坐标
	rec.bottom -= 2;
	rec.left += 1;
	rec.top += 22;
	rec.right -= 3;

	//创建子页面
	myMinuteBoxCls.Create(IDD_MinuteBox, &m_Maintabctrl);
	myThityBoxCls.Create(IDD_ThirtyBox, &m_Maintabctrl);
	mySixtyBox.Create(IDD_SixtyBox, &m_Maintabctrl);
	myDayBoxCl.Create(IDD_DayBox, &m_Maintabctrl);
	myWeekBoxCl.Create(IDD_WeekBox, &m_Maintabctrl);
	myMoonBoxCl.Create(IDD_MoonBox, &m_Maintabctrl);
	myAnalyseBoxCl.Create(IDD_AnalyseBox, &m_Maintabctrl);
	myUserSelectCl.Create(IDD_UserSelectBox, &m_Maintabctrl);
	//将子页面移动到指定的位置
	myMinuteBoxCls.MoveWindow(&rec);
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
“在InitializeTabPage()中插入tab的子窗口” 子窗口是 对话框 ?
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
从资源拖一个 tab 关联 为 m_Tab 不是简单些, 为什么要 动态 创建 ?
我在InitializeTabPage()中插入tab的子窗口, 并没有动态创建tab控件, 我想问下,你的回答我有些没看懂,你的意思是说在主窗口的WindowsZoom函数中通过GetTopWindow()获取子窗口的窗口句柄,然后保存下来,在Onsize()中处理??
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
从资源拖一个 tab 关联 为 m_Tab 不是简单些, 为什么要 动态 创建 ?
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
myMainFiveTradeCl 是主窗口中创建的tab子窗口类对象 用于插入tab子页面 主窗口:
//创建子页面
	myMainFiveTradeCl.Create(IDD_MainFiveTradeBox, &m_FiveTradetabctrl);
	myMainHandicapCl.Create(IDD_MainHandicapBox, &m_FiveTradetabctrl);
	//将子页面移动到指定的位置
	myMainFiveTradeCl.MoveWindow(&Fiverec);
	myMainHandicapCl.MoveWindow(&Fiverec);
	//显示子页面
	myMainFiveTradeCl.ShowWindow(SW_SHOW);
	myMainHandicapCl.ShowWindow(SW_HIDE);

	m_FiveTradetabctrl.SetCurSel(0);
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
CWnd* pWnd = GetTopWindow(); while(pWnd != NULL) { rcTmp=rcOrig[iControlCount]; rcTmp.top -= (rcOrig[0].top+iCaptionHeight); rcTmp.bottom-= (rcOrig[0].top+iCaptionHeight); rcTmp.left -= (rcOrig[0].left+Border); rcTmp.right -= (rcOrig[0].left+Border); pWnd->MoveWindow(&rcTmp,FALSE); pWnd = pWnd->GetNextWindow(); iControlCount++; }
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
引用 2 楼 schlafenhamster 的回复:
上 InitializeTabPage(); //初始化Tab页面 WindowsZoom(); //窗口等比例缩放 myMainFiveTradeCl.WindowsZoom();
什么问题 ????
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
myMainFiveTradeCl 是什么 ?
schlafenhamster 2016-10-18
  • 打赏
  • 举报
回复
上 InitializeTabPage(); //初始化Tab页面 WindowsZoom(); //窗口等比例缩放 myMainFiveTradeCl.WindowsZoom();
qq_32192153 2016-10-18
  • 打赏
  • 举报
回复
这是tab中子窗口中的代码和主窗口中差不多
void MainFiveTradeCl::WindowsZoom()
{
	//----------------------窗口等比例缩放
	CRect rect;
	GetWindowRect(&rect);
	m_FiveTradelistRect.AddTail(rect);//对话框的区域
	CWnd* pWnd = GetWindow(GW_CHILD);//获取子窗体
	while (pWnd)
	{
		pWnd->GetWindowRect(rect);//子窗体的区域
		m_FiveTradelistRect.AddTail(rect);           //CList<CRect,CRect> m_listRect成员变量
		pWnd = pWnd->GetWindow(GW_HWNDNEXT);//取下一个子窗体
	}
	//-----------------------End
}


BOOL MainFiveTradeCl::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常:  OCX 属性页应返回 FALSE
}


void MainFiveTradeCl::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	if (m_FiveTradelistRect.GetCount() > 0)
	{
		CRect dlgNow;
		GetWindowRect(&dlgNow);
		POSITION pos = m_FiveTradelistRect.GetHeadPosition();//第一个保存的是对话框的Rect

		CRect dlgSaved;
		dlgSaved = m_FiveTradelistRect.GetNext(pos);
		ScreenToClient(dlgNow);

		double x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例
		double y = dlgNow.Height()  *1.0 / dlgSaved.Height();
		ClientToScreen(dlgNow);

		CRect childSaved;
		CWnd* pWnd = GetWindow(GW_CHILD);
		while (pWnd)
		{

			childSaved = m_FiveTradelistRect.GetNext(pos);//依次获取子窗体的Rect
			childSaved.left = LONG(dlgNow.left + (childSaved.left - dlgSaved.left)*x);//根据比例调整控件上下左右距离对话框的距离
			childSaved.right = LONG(dlgNow.right + (childSaved.right - dlgSaved.right)*x);
			childSaved.top = LONG(dlgNow.top + (childSaved.top - dlgSaved.top)*y);
			childSaved.bottom = LONG(dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom)*y);

			ScreenToClient(childSaved);
			pWnd->MoveWindow(childSaved);
			pWnd = pWnd->GetNextWindow();
		}
	}
}
主窗口代码
BOOL CNewGpSysDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标
	ShowWindow(SW_NORMAL);

	//LoadButtonImage();            //加载按钮图片

	InitializeTabPage();            //初始化Tab页面

	WindowsZoom();                //窗口等比例缩放 

	myMainFiveTradeCl.WindowsZoom();
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
void CNewGpSysDlg::OnSize(UINT nType, int cx, int cy)//窗口等比例缩放
{
	CDialogEx::OnSize(nType, cx, cy);

	myMainFiveTradeCl.OnSize(0, 0, 0);

	if (m_listRect.GetCount() > 0)
	{
		CRect dlgNow;
		GetWindowRect(&dlgNow);
		POSITION pos = m_listRect.GetHeadPosition();//第一个保存的是对话框的Rect

		CRect dlgSaved;
		dlgSaved = m_listRect.GetNext(pos);
		ScreenToClient(dlgNow);

		double x = dlgNow.Width() * 1.0 / dlgSaved.Width();//根据当前和之前保存的对话框的宽高求比例
		double y = dlgNow.Height()  *1.0 / dlgSaved.Height();
		ClientToScreen(dlgNow);

		CRect childSaved;
		CWnd* pWnd = GetWindow(GW_CHILD);
		while (pWnd)
		{

			childSaved = m_listRect.GetNext(pos);//依次获取子窗体的Rect
			childSaved.left = LONG(dlgNow.left + (childSaved.left - dlgSaved.left)*x);//根据比例调整控件上下左右距离对话框的距离
			childSaved.right = LONG(dlgNow.right + (childSaved.right - dlgSaved.right)*x);
			childSaved.top = LONG(dlgNow.top + (childSaved.top - dlgSaved.top)*y);
			childSaved.bottom = LONG(dlgNow.bottom + (childSaved.bottom - dlgSaved.bottom)*y);

			ScreenToClient(childSaved);
			pWnd->MoveWindow(childSaved);
			pWnd = pWnd->GetNextWindow();
		}
	} 
	
}

15,978

社区成员

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

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