本篇继续上篇的未完部分。上篇介绍到了软件的实现,介绍完了主窗口的初始化,本篇继续介绍后续内容的编码。
(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()函数内不包含各控件值修改的操作,也不包含各控件的禁用、启用操作,仅包含定位、大小调整等与刷新相关的部分操作。
后续内容请继续关注下一篇
本文详细介绍了一个软件界面刷新函数的实现过程,包括如何通过调整控件位置和大小以适应不同尺寸的窗口,确保在刷新、调整大小、最大化、最小化等过程中界面正常显示。
599

被折叠的 条评论
为什么被折叠?



