五子棋等级考试软件的开发(四)

本文详细介绍了一个软件界面刷新函数的实现过程,包括如何通过调整控件位置和大小以适应不同尺寸的窗口,确保在刷新、调整大小、最大化、最小化等过程中界面正常显示。

本篇继续上篇的未完部分。上篇介绍到了软件的实现,介绍完了主窗口的初始化,本篇继续介绍后续内容的编码。

(4)定义界面刷新函数Show()

在testDlg.h文件中添加Show()函数的定义,同时定义变量m_objBoard来绘制棋盘,如下图所示:

然后在testDlg.cpp文件中添加如下的实现代码: 

void CtestDlg::Show()
{
	CRect rect;	//对话框区域大小
	CRect rc;	//按钮区域大小
	CRect rc2;	//文本标签区域大小
	CRect rc3;	//复选框区域大小

	GetClientRect(&rect);
	CWnd* pBtn = GetDlgItem(IDC_BTN_START);
	if (pBtn != NULL)
	{
		pBtn->GetClientRect(&rc);
		GetDlgItem(IDC_LB_LEVEL)->GetClientRect(&rc2);
		GetDlgItem(IDC_LEVEL)->GetClientRect(&rc3);

		CRect rcd;	//调整后的按钮区域大小、文本标签区域大小
		rcd.left = rect.right - rc.Width()*1.25;
		rcd.right = rcd.left + rc.Width();
		rcd.top = rc.Height();
		rcd.bottom = rcd.top + rc.Height();
		pBtn->MoveWindow(&rcd);		//开始评测按钮

		rcd.top = rcd.bottom + rc.Height()*0.5;
		rcd.bottom = rcd.top + rc.Height();
		GetDlgItem(IDC_BTN_NEW)->MoveWindow(&rcd); //开始新游戏按钮

		rcd.top = rcd.bottom + rc.Height();
		rcd.bottom = rcd.top + rc2.Height();
		GetDlgItem(IDC_LB_LEVEL)->MoveWindow(&rcd);	//评估等级标签

		CRect rcd2;	//调整后的值标签区域大小
		rcd2.left = rcd.left + rcd.Width()*0.2;
		rcd2.right = rcd2.left + rc3.Width();
		rcd2.top = rcd.bottom + rcd.Height()*0.4;
		rcd2.bottom = rcd2.top + rc3.Height();
		GetDlgItem(IDC_LEVEL)->MoveWindow(&rcd2);	//评估等级复选框

		rcd.top = rcd2.bottom + rcd.Height()*0.5;
		rcd.bottom = rcd.top + rc2.Height();
		GetDlgItem(IDC_LB_NUM_TOTAL)->MoveWindow(&rcd);	//评估局数标签

		rcd2.top = rcd.bottom + rcd.Height()*0.4;
		rcd2.bottom = rcd2.top + rc2.Height();
		GetDlgItem(IDC_NUM_TOTAL)->MoveWindow(&rcd2);	//评估局数值

		rcd.top = rcd2.bottom + rcd.Height()*0.5;
		rcd.bottom = rcd.top + rc2.Height();
		GetDlgItem(IDC_LB_NUM_LEFT)->MoveWindow(&rcd);	//剩余局数标签

		rcd2.top = rcd.bottom + rcd.Height()*0.4;
		rcd2.bottom = rcd2.top + rc2.Height();
		GetDlgItem(IDC_NUM_LEFT)->MoveWindow(&rcd2);	//剩余局数值

		rcd.top = rcd2.bottom + rcd.Height()*0.5;
		rcd.bottom = rcd.top + rc2.Height();
		GetDlgItem(IDC_LB_RATIO)->MoveWindow(&rcd);		//胜率标签

		rcd2.top = rcd.bottom + rcd.Height()*0.4;
		rcd2.bottom = rcd2.top + rc2.Height();
		GetDlgItem(IDC_RATIO)->MoveWindow(&rcd2);		//胜率值

		rcd.top = rcd2.bottom + rcd.Height()*0.5;
		rcd.bottom = rcd.top + rc2.Height();
		GetDlgItem(IDC_LB_DEPTH)->MoveWindow(&rcd);		//思维深度标签

		rcd2.top = rcd.bottom + rcd.Height()*0.4;
		rcd2.bottom = rcd2.top + rc2.Height();
		GetDlgItem(IDC_DEPTH)->MoveWindow(&rcd2);		//思维深度值

		rcd.top = rcd2.bottom + rcd.Height()*0.5;
		rcd.bottom = rcd.top + rc2.Height();
		GetDlgItem(IDC_LB_CONCERN)->MoveWindow(&rcd);	//专注度标签

		rcd2.top = rcd.bottom + rcd.Height()*0.4;
		rcd2.bottom = rcd2.top + rc2.Height();
		GetDlgItem(IDC_CONCERN)->MoveWindow(&rcd2);		//专注度值
	}

	rect.right -= rc.Width()*1.5;
	CWnd* pBoard = GetDlgItem(IDC_BOARD);
	if (pBoard != NULL)
		pBoard->MoveWindow(&rect);	//棋盘区域

	DrawBoard(&m_objBoard);		//绘制棋盘
	DrawPieces(&m_objBoard);	//绘制棋子
}

该函数将对界面上的按钮、标签、各种信息及棋盘、棋子等进行重新定位和绘制,能保证软件在刷新、调整大小、最大化、最小化等的过程中不会显示异常,当然了,需要在相应的事件响应函数中调用该函数来重绘界面,例如:在CtestDlg::OnPaint()函数中调用Show(),如下图所示:

此时运行程序的话,会发现棋盘区域没有得到刷新,如下图所示:

因为添加的棋盘变量m_objBoard尚未绑定到界面控件上,需要在CtestDlg::DoDataExchange()函数内添加如下代码来进行绑定:

DDX_Control(pDX, IDC_BOARD, m_objBoard);

此时,运行结果如下图所示:

至此,界面刷新部分已基本完成。若想让界面支持放大缩小,可在对话框设计界面上修改对话框的属性,将属性Border的值改为Resizing可支持鼠标拖拉进行放大缩小,将Maximize Box和Minimize Box属性的值改为True可支持最大化最小化按钮,如下图所示:

此时,需要添加对话框缩放的事件响应函数,并在该函数中调用Show()函数。即在testDlg.h文件中添加如下代码来重写对话框缩放的事件响应函数:

afx_msg void OnSize(UINT nType, int cx, int cy);

如下图所示:

 然后在testDlg.cpp文件中添加该函数的实现代码:

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

	// TODO:  在此处添加消息处理程序代码
	Show();
}

最后,将该函数绑定到缩放消息上以便对缩放消息进行响应,即在BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)部分添加如下的的代码:

ON_WM_SIZE()

如下图所示:

至此,支持缩放的界面刷新便完成了,此时可运行程序,任意缩放调整对话框大小,可以看到界面上的各控件会随着对话框的大小变化而重新布局。

注:Show()函数内不包含各控件值修改的操作,也不包含各控件的禁用、启用操作,仅包含定位、大小调整等与刷新相关的部分操作。

后续内容请继续关注下一篇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

De-Chang Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值