📄 chapter8.htm
字号:
// 显示栏目名称<br>
pDC->SetTextColor(RGB(0, 0, 0));<br>
pDC->TextOut(140, 90, "姓 名:");<br>
pDC->TextOut(140, 130, "性 别:");<br>
pDC->TextOut(140, 170, "出生日期: ");<br>
pDC->TextOut(140, 210, "婚姻状态:");<br>
pDC->TextOut(140, 250, "部 门:");<br>
pDC->TextOut(140, 290, "职 务:");<br>
pDC->TextOut(140, 330, "工 资:");<br>
// 显示栏目内容<br>
pDC->SetTextColor(RGB(0, 0, 255));<br>
pDC->TextOut(300, 90, pDoc->m_empList[m_nCurrEmp].m_strName);<br>
if(pDoc->m_empList[m_nCurrEmp].m_nSex==0)<br>
pDC->TextOut(300, 130, "男");<br>
else<br>
pDC->TextOut(300, 130, "女");<br>
s = pDoc->m_empList[m_nCurrEmp].m_tBirthdate.Format("%Y.%m.%d");<br>
pDC->TextOut(300, 170, s);<br>
if(pDoc->m_empList[m_nCurrEmp].m_bMarried)<br>
pDC->TextOut(300, 210, "已婚");<br>
else<br>
pDC->TextOut(300, 210, "未婚");<br>
pDC->TextOut(300, 250, pDoc->m_empList[m_nCurrEmp].m_strDept);<br>
pDC->TextOut(300, 290, pDoc->m_empList[m_nCurrEmp].m_strPosition);<br>
s.Format("%8.2f", pDoc->m_empList[m_nCurrEmp].m_fSalary);<br>
pDC->TextOut(300, 330, s);<br>
}<br>
}<br>
在编辑资源时,我们框架窗口添加了5个菜单选项,并将对应的消息响应函数映射到了视图类中。这些消息响应函数的代码如下:<br>
void CMy1501View::OnAppend() <br>
{<br>
CMy1501Doc* pDoc = GetDocument();<br>
ASSERT_VALID(pDoc);<br>
CEmpDlg dlg;<br>
if(dlg.DoModal() == IDOK)<br>
{<br>
pDoc->m_nCount++;<br>
m_nCurrEmp = pDoc->m_nCount-1;<br>
pDoc->m_empList[m_nCurrEmp].m_strName = dlg.m_strName;<br>
pDoc->m_empList[m_nCurrEmp].m_nSex = dlg.m_nSex;<br>
pDoc->m_empList[m_nCurrEmp].m_tBirthdate = dlg.m_tBirthdate;<br>
pDoc->m_empList[m_nCurrEmp].m_bMarried = dlg.m_bMarried;<br>
pDoc->m_empList[m_nCurrEmp].m_strDept = dlg.m_strDept;<br>
pDoc->m_empList[m_nCurrEmp].m_strPosition = dlg.m_strPosition;<br>
pDoc->m_empList[m_nCurrEmp].m_fSalary = dlg.m_fSalary;<br>
pDoc->SetModifiedFlag();<br>
Invalidate();<br>
}<br>
}<br>
// 删除当前记录<br>
void CMy1501View::OnDelete() <br>
{<br>
CMy1501Doc* pDoc = GetDocument();<br>
ASSERT_VALID(pDoc);<br>
if(pDoc->m_nCount)<br>
{<br>
for(int i=m_nCurrEmp; i<pDoc->m_nCount-1; i++)<br>
pDoc->m_empList[i] = pDoc->m_empList[i+1];<br>
pDoc->m_nCount--;<br>
if(m_nCurrEmp > pDoc->m_nCount-1)<br>
m_nCurrEmp = pDoc->m_nCount-1;<br>
pDoc->SetModifiedFlag();<br>
Invalidate();<br>
}<br>
}<br>
// 编辑当前记录<br>
void CMy1501View::OnEdit() <br>
{<br>
CMy1501Doc* pDoc = GetDocument();<br>
ASSERT_VALID(pDoc);<br>
if(pDoc->m_nCount)<br>
{<br>
CEmpDlg dlg;<br>
dlg.m_strName = pDoc->m_empList[m_nCurrEmp].m_strName;<br>
dlg.m_nSex = pDoc->m_empList[m_nCurrEmp].m_nSex;<br>
dlg.m_tBirthdate = pDoc->m_empList[m_nCurrEmp].m_tBirthdate;<br>
dlg.m_bMarried = pDoc->m_empList[m_nCurrEmp].m_bMarried;<br>
dlg.m_strDept = pDoc->m_empList[m_nCurrEmp].m_strDept;<br>
dlg.m_strPosition = pDoc->m_empList[m_nCurrEmp].m_strPosition;<br>
dlg.m_fSalary = pDoc->m_empList[m_nCurrEmp].m_fSalary;<br>
if(dlg.DoModal() == IDOK)<br>
{<br>
pDoc->m_empList[m_nCurrEmp].m_strName = dlg.m_strName;<br>
pDoc->m_empList[m_nCurrEmp].m_nSex = dlg.m_nSex;<br>
pDoc->m_empList[m_nCurrEmp].m_tBirthdate = dlg.m_tBirthdate;<br>
pDoc->m_empList[m_nCurrEmp].m_bMarried = dlg.m_bMarried;<br>
pDoc->m_empList[m_nCurrEmp].m_strDept = dlg.m_strDept;<br>
pDoc->m_empList[m_nCurrEmp].m_strPosition = dlg.m_strPosition;<br>
pDoc->m_empList[m_nCurrEmp].m_fSalary = dlg.m_fSalary;<br>
pDoc->SetModifiedFlag();<br>
Invalidate();<br>
}<br>
}<br>
}<br>
// 查看后一记录<br>
void CMy1501View::OnNext() <br>
{<br>
CMy1501Doc* pDoc = GetDocument();<br>
ASSERT_VALID(pDoc);<br>
if(pDoc->m_nCount > 1)<br>
{<br>
if(m_nCurrEmp == pDoc->m_nCount-1)<br>
m_nCurrEmp = 0;<br>
else<br>
m_nCurrEmp++;<br>
}<br>
Invalidate();<br>
}<br>
// 查看前一记录<br>
void CMy1501View::OnPrev() <br>
{<br>
CMy1501Doc* pDoc = GetDocument();<br>
ASSERT_VALID(pDoc);<br>
if(pDoc->m_nCount > 1)<br>
{<br>
if(m_nCurrEmp == 0)<br>
m_nCurrEmp = pDoc->m_nCount-1;<br>
else<br>
m_nCurrEmp--;<br>
}<br>
Invalidate();<br>
}</p>
<p class=style3> </p>
<p class=style2>8-15 用基于对话框的应用程序结构实现例14-5的彩色吹泡泡程序。由于对话框本身结构简单,没有明显的客户区,颜色也不醒目,所以我们在对话框上自行建立一个矩形区域作为吹泡泡的客户区,并通过一个“颜色设置”按钮来设置泡泡的颜色。</strong><br>
<strong>说 明:用AppWizard建立一个基于对话框的应用程序框架(参看15.4:“用AppWizard生成基于对话框的应用程序”),所有设置均使用缺省值。<br>
使用对话框模板编辑器编辑作为主界面窗口的对话框模板,将其上的静态文本控件和“Cancel”按钮删除,将“OK”按钮的Caption设置为“完成”,并将对话框大小调整为400×300左右。<br>
为对话框模板添加一个Picture控件,将其Type设置为Frame,Color设置为Black,并设置Sunken属性(在Styles选项卡中)。调整其位置为(7,7),大小为287×287。这个框中即为自定义的吹泡泡客户区,所有的吹泡泡活动均在该区域中进行。<br>
为对话框模板添加一个按钮,将其ID改为IDC_COLOR,Caption改为“颜色设置”。<br>
使用ClassWizard为对话框类添加一个鼠标左键消息响应函数OnLButtonDown()和一个按钮命令消息响应函数OnColor()。</strong><br>
</p>
<p class=style3>程 序:</p>
<p class=style3>在对话框类的头文件前面添加一行:<br>
#define MAX_BUBBLE 250<br>
并在对话框类定义中添加存放泡泡的几何参数和颜色的数组数据成员:<br>
CRect m_rectBubble[MAX_BUBBLE];<br>
COLORREF m_colorBubble[MAX_BUBBLE];<br>
int m_nBubbleCount;<br>
以及一个存放自定义客户区矩形的数据成员和一个存放当前泡泡颜色设置的数据成员:<br>
CRect m_rectClient;<br>
COLORREF m_colorCurrent;<br>
修改对话框类的OnInitDialog()成员函数,添加计算自定义客户区位置和大小的代码,并将泡泡的数目初始化为0:<br>
BOOL CMyDlg::OnInitDialog()<br>
{<br>
CDialog::OnInitDialog();<br>
CStatic *pST = (CStatic *)GetDlgItem(IDC_CLIENT);<br>
pST->GetWindowRect(&m_rectClient);<br>
ScreenToClient(&m_rectClient);<br>
m_nBubbleCount = 0; <br>
return TRUE;<br>
}<br>
修改OnPaint()成员函数,添加画出泡泡的有关代码:<br>
void CMyDlg::OnPaint() <br>
{<br>
CPaintDC dc(this);<br>
CRgn rgn;<br>
rgn.CreateRectRgnIndirect(&m_rectClient); // 生成一个区域对象<br>
dc.SelectClipRgn(&rgn); // 选择区域<br>
dc.Rectangle(m_rectClient); // 将客户区背景设置<br>
CBrush brushNew, *pbrushOld; // 白色<br>
for(int i=0; i<m_nBubbleCount; i++)<br>
{<br>
brushNew.CreateSolidBrush(m_colorBubble[i]);<br>
pbrushOld = dc.SelectObject(&brushNew);<br>
dc.Ellipse(m_rectBubble[i]);<br>
dc.SelectObject(pbrushOld);<br>
brushNew.DeleteObject();<br>
}<br>
}<br>
修改由ClassWizard生成的鼠标左键消息响应函数OnLButtonDown(),添加吹泡泡的有关代码:<br>
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) <br>
{<br>
if(m_nBubbleCount < MAX_BUBBLE)<br>
{<br>
int r = rand()%50+10;<br>
CRect rect(point.x-r, point.y-r, point.x+r, point.y+r);<br>
m_rectBubble[m_nBubbleCount] = rect;<br>
m_colorBubble[m_nBubbleCount] = m_colorCurrent;<br>
m_nBubbleCount++;<br>
InvalidateRect(rect, FALSE);<br>
}<br>
}<br>
最后修改由ClassWizard生成的按钮消息响应函数OnColor(),添加调用颜色设置公用对话框的代码:<br>
void CMyDlg::OnColor() <br>
{<br>
m_colorCurrent = RGB(200, 200, 200);<br>
CColorDialog dlg(m_colorCurrent);<br>
if(dlg.DoModal() == IDOK)<br>
m_colorCurrent = dlg.GetColor();<br>
}</p>
<p class=style3>[例15-3] 动画播放器程序,可用文件查找公用对话框打开AVI文件并播放。<br>
程 序:首先在对话框类定义中添加一个存放AVI文件名的变量:<br>
CString m_strAviname;<br>
并在OnInitDialog()函数中添加初始化代码:<br>
m_strAviname = _T(“”);<br>
修改对应于3个按钮的消息响应函数:<br>
void CMy1503Dlg::OnOpen() <br>
{<br>
CFileDialog dlg(TRUE, ".AVI", "*.AVI",<br>
OFN_FILEMUSTEXIST|OFN_LONGNAMES|OFN_PATHMUSTEXIST,<br>
"*.AVI", this);<br>
if(dlg.DoModal() == IDOK)<br>
{<br>
m_ctrAvi.Close();<br>
m_strAviname = dlg.GetPathName();<br>
m_ctrAvi.Open(LPCTSTR(m_strAviname));<br>
}<br>
}<br>
void CMy1503Dlg::OnPlay() <br>
{<br>
m_ctrAvi.Play(0, 0xffff, 0xffff);<br>
}<br>
void CMy1503Dlg::OnStop() <br>
{<br>
m_ctrAvi.Stop();<br>
}</p>
<p class=style2>8-16 编写一个计算器程序。该计算器使用编辑控件直接输入数据,并有“加”、“减”、“乘”、“除”、“平方根”和“倒数”计算功能,如图15-4。</strong><br>
</p>
<p class=style3>程 序:</p>
<p class=style3>在对话框类中添加以下数据成员:<br>
int m_nOP; // 运算符<br>
double m_fResult; // 运算中间结果<br>
并在OnInitDialog()函数中添加相应的初始化代码:<br>
m_fResult = 0.0;<br>
m_nOP = 0;<br>
为对话框类添加一个Calc()成员函数:<br>
void CMy1504Dlg::Calc() // 计算<br>
{<br>
UpdateData(TRUE);<br>
switch(m_nOP)<br>
{<br>
case 0: // 第1运算对象<br>
m_fResult = m_fInput;<br>
break;<br>
case 1: // +<br>
m_fResult += m_fInput;<br>
break;<br>
case 2: // -<br>
m_fResult -= m_fInput;<br>
break;<br>
case 3: // *<br>
m_fResult *= m_fInput;<br>
break;<br>
case 4: // /<br>
m_fResult -= m_fInput;<br>
break;<br>
case 5: // 1/X<br>
m_fResult = 1/m_fInput;<br>
break;<br>
case 6: // sqrt(X)<br>
m_fResult = sqrt(m_fInput);<br>
break;<br>
}<br>
m_fInput = m_fResult;<br>
UpdateData(FALSE);<br>
}<br>
最后为所有按钮的消息响应函数添加代码:<br>
void CMy1504Dlg::OnAdd() // 加法<br>
{<br>
Calc();<br>
m_nOP = 1;<br>
}<br>
void CMy1504Dlg::OnSub() // 减法<br>
{<br>
Calc();<br>
m_nOP = 2;<br>
}<br>
void CMy1504Dlg::OnMul() // 乘法<br>
{<br>
Calc();<br>
m_nOP = 3;<br>
}<br>
void CMy1504Dlg::OnDiv() // 除法<br>
{<br>
Calc();<br>
m_nOP = 4;<br>
}<br>
void CMy1504Dlg::OnReciprocal() // 倒数<br>
{<br>
m_nOP = 5;<br>
Calc();<br>
m_nOP = 0;<br>
}<br>
void CMy1504Dlg::OnSqrt() // 平方根<br>
{<br>
m_nOP = 6;<br>
Calc();<br>
m_nOP = 0;<br>
}<br>
void CMy1504Dlg::OnSetfocusInput() // 为输入数据做准备<br>
{<br>
m_fInput = 0.0;<br>
UpdateData(FALSE); <br>
}<br>
void CMy1504Dlg::OnClear() // 清除<br>
{<br>
m_fResult = 0.0;<br>
m_fInput = 0.0;<br>
m_nOP = 0;<br>
UpdateData(FALSE);<br>
}<br>
void CMy1504Dlg::OnCalc() // 显示计算结果<br>
{<br>
Calc();<br>
m_nOP = 0;<br>
}</p>
<p> </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -