📄 chapter7.htm
字号:
pDerivedClass->fn2();<br>
}<br>
程序运行输出:<br>
调用派生类的函数fn1()<br>
调用派生类的函数fn2()<br>
调用基类的函数fn1()<br>
调用基类的函数fn2()<br>
调用派生类的函数fn1()<br>
调用派生类的函数fn2()</p>
<p class="style3"></p>
<p class=style3><strong>7-12 为例9-1的吹泡泡程序加一版权(About)对话框。<br>
然后修改例9-1的程序,加入以下内容:</strong><br>
</p>
<p class=style3>程 序:<br>
1.在程序首部加上文件包含命令<br>
#include “resource.h”<br>
2.在框架窗口类之前加入从CDialog类派生的对话框类:<br>
// 对话框类<br>
class CAboutDlg: public CDialog<br>
{<br>
public:<br>
CAboutDlg();<br>
enum {IDD = IDD_DIALOG1};<br>
};<br>
inline CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD){}<br>
3.在框架窗口类中添加响应鼠标右键消息的代码,包括消息响应函数说明、消息响应宏和消息响应函数定义。鼠标右键消息响应函数为:<br>
void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point)<br>
{<br>
CAboutDlg dlg;<br>
dlg.DoModal();<br>
}</p>
<p class=style3><strong>7-13 签名留念簿程序。该程序模仿签名簿,用户使用鼠标左键点击窗口客户区后会弹出一个对话框,输入姓名后可在鼠标点击位置显示出该签名。签名的颜色、字体大小和方向随机确定。<br>
说 明:项目建立及添加对话框模板资源的方法同例14-1。修改对话框模板的ID为IDD_NAMEDLG,Caption为“签名对话框”,并添加一个静态文本控件(Caption改为“签名”)和一个编辑控件(ID改为IDC_EDITNAME)。</strong><br>
</p>
<p class=style3>程 序:<br>
// Example 14-2:签名留念簿程序<br>
#include <afxwin.h><br>
#include "resource.h"<br>
// 对话框类<br>
class CNameDlg: public CDialog<br>
{<br>
public:<br>
CPoint m_pointTopLeft;<br>
CString m_strNameEdit;<br>
public:<br>
CNameDlg();<br>
enum {IDD = IDD_NAMEDLG};<br>
protected:<br>
virtual void DoDataExchange(CDataExchange* pDX);<br>
virtual BOOL OnInitDialog(); <br>
};<br>
// 对话框类的构造函数<br>
CNameDlg::CNameDlg():CDialog(CNameDlg::IDD)<br>
{<br>
m_strNameEdit = _T("");<br>
}<br>
// 数据交换和数据检验<br>
void CNameDlg::DoDataExchange(CDataExchange* pDX)<br>
{<br>
CDialog::DoDataExchange(pDX);<br>
DDX_Text(pDX, IDC_EDITNAME, m_strNameEdit);<br>
DDV_MaxChars(pDX, m_strNameEdit, 20);<br>
}<br>
// 初始化对话框<br>
BOOL CNameDlg::OnInitDialog() <br>
{<br>
CDialog::OnInitDialog();<br>
CRect rect;<br>
GetWindowRect(&rect);<br>
rect = CRect(m_pointTopLeft, rect.Size());<br>
MoveWindow(rect);<br>
return TRUE;<br>
}<br>
// 签名类<br>
class CSignal: public CObject<br>
{<br>
CString m_sName; // 姓名<br>
CPoint m_pointSignal; // 签名位置<br>
int m_nHeight; // 字体高<br>
int m_nColor; // 签名颜色<br>
int m_nEscapement; // 签名倾角<br>
public:<br>
CSignal(){}<br>
void SetValue(CString name,CPoint point,int height,int color,<br>
int escapement);<br>
void ShowSignal(CDC *pDC);<br>
};<br>
// 签名类成员函数<br>
void CSignal::SetValue(CString name,CPoint point,int height,int color, <br>
int escapement)<br>
{<br>
m_sName = name;<br>
m_pointSignal = point;<br>
m_nHeight = height;<br>
m_nColor = color;<br>
m_nEscapement = escapement;<br>
}<br>
// 显示签名<br>
void CSignal::ShowSignal(CDC *pDC)<br>
{<br>
CFont *pOldFont, font;<br>
font.CreateFont(m_nHeight, 0, m_nEscapement,0, 400, FALSE,FALSE,<br>
0, OEM_CHARSET, OUT_DEFAULT_PRECIS, <br>
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, <br>
DEFAULT_PITCH, "楷体");<br>
pOldFont = pDC->SelectObject(&font);<br>
switch(m_nColor)<br>
{<br>
case 0:<br>
pDC->SetTextColor(RGB(0, 0, 0));<br>
break;<br>
case 1:<br>
pDC->SetTextColor(RGB(255, 0, 0));<br>
break;<br>
case 2:<br>
pDC->SetTextColor(RGB(0, 255, 0));<br>
break;<br>
case 3:<br>
pDC->SetTextColor(RGB(0, 0, 255));<br>
break;<br>
}<br>
pDC->TextOut(m_pointSignal.x, m_pointSignal.y, m_sName);<br>
pDC->SelectObject(pOldFont);<br>
}<br>
// 框架窗口类<br>
#define MAX_NAME 250<br>
class CMyWnd: public CFrameWnd<br>
{<br>
CSignal m_signalList[MAX_NAME];<br>
int m_nCount;<br>
public:<br>
CMyWnd(): m_nCount(0){}<br>
protected:<br>
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);<br>
afx_msg void OnPaint();<br>
DECLARE_MESSAGE_MAP()<br>
};<br>
// 消息映射<br>
BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)<br>
ON_WM_LBUTTONDOWN()<br>
ON_WM_PAINT()<br>
END_MESSAGE_MAP()<br>
// 框架窗口类的成员函数<br>
// 鼠标右键消息响应函数<br>
void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)<br>
{<br>
if(m_nCount < MAX_NAME)<br>
{<br>
CNameDlg dlg;<br>
dlg.m_pointTopLeft = point;<br>
if(dlg.DoModal() == IDOK)<br>
{<br>
int height = rand()%60+12;<br>
int color = rand()%4;<br>
int escapement = (rand()%1200)-600;<br>
CString name = dlg.m_strNameEdit;<br>
m_signalList[m_nCount].SetValue(name,point,height,<br>
color,escapement);<br>
m_nCount++;<br>
Invalidate();<br>
}<br>
}<br>
}<br>
// 绘制框架窗口客户区函数<br>
void CMyWnd::OnPaint()<br>
{<br>
CPaintDC dc(this);<br>
for(int i=0; i<m_nCount; i++)<br>
m_signalList[i].ShowSignal(&dc);<br>
}<br>
// 应用程序类<br>
class CMyApp: public CWinApp<br>
{<br>
public:<br>
BOOL InitInstance();<br>
};<br>
// 应用程序类的成员函数<br>
BOOL CMyApp::InitInstance()<br>
{<br>
CMyWnd *pFrame = new CMyWnd;<br>
pFrame->Create(0,_T("签字留念簿程序"));<br>
pFrame->ShowWindow(m_nCmdShow);<br>
this->m_pMainWnd = pFrame;<br>
return TRUE;<br>
}<br>
// 全局应用程序对象<br>
CMyApp ThisApp;</p>
<p class=style3> </p>
<p class=style3><strong>7-14 将例14-2的签名留念簿中的对话框改为无模式对话框。用户可用鼠标右键调出签名对话框,并在不退出该对话框的情况下用鼠标左键将输入的签名显示在窗口客户区。<br>
说 明:在向项目中添加对话框模板资源时,要在其属性对话框的More Styles页中选择Visible项。其他同例14-2。</strong><br>
</p>
<p class=style3>程 序:</p>
<p class=style3>该程序中的签名类CSignal和应用程序类与上例相同,因此下面仅列出了框架窗口类和对话框类。由于这两个类的成员函数中存在相互引用的情况,所以我们将框架窗口类的声明放在前面,接下来是对话框类的定义,并在框架窗口类之前加入了一条对对话框类的声明。最后是这两个类的成员函数定义。<br>
// 框架窗口类<br>
#define MAX_NAME 250<br>
class CNameDlg;<br>
class CMyWnd: public CFrameWnd<br>
{<br>
CSignal m_signalList[MAX_NAME];<br>
int m_nCount;<br>
CNameDlg *m_pNameDlg;<br>
public:<br>
CMyWnd();<br>
~CMyWnd();<br>
protected:<br>
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);<br>
afx_msg void OnRButtonDown(UINT nFlags, CPoint point);<br>
afx_msg void OnPaint();<br>
DECLARE_MESSAGE_MAP()<br>
};<br>
// 对话框类<br>
class CNameDlg: public CDialog<br>
{<br>
public:<br>
BOOL m_bActive;<br>
CString m_strNameEdit;<br>
enum {IDD = IDD_NAMEDLG};<br>
CNameDlg();<br>
BOOL Create();<br>
protected:<br>
virtual void DoDataExchange(CDataExchange* pDX);<br>
virtual BOOL OnInitDialog();<br>
virtual void OnOK();<br>
virtual void OnCancel();<br>
};<br>
// 框架窗口类的消息映射<br>
BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)<br>
ON_WM_LBUTTONDOWN()<br>
ON_WM_RBUTTONDOWN()<br>
ON_WM_PAINT()<br>
END_MESSAGE_MAP()<br>
// 框架窗口类的成员函数<br>
// 框架窗口类的构造函数<br>
CMyWnd::CMyWnd()<br>
{<br>
m_nCount = 0;<br>
m_pNameDlg = new CNameDlg;<br>
}<br>
// 框架窗口类的析构函数<br>
CMyWnd::~CMyWnd()<br>
{<br>
delete m_pNameDlg;<br>
}<br>
// 鼠标右键消息响应函数<br>
void CMyWnd::OnRButtonDown(UINT nFlags, CPoint point)<br>
{<br>
if(m_pNameDlg->m_bActive)<br>
m_pNameDlg->SetActiveWindow(); // 激活对话框<br>
else<br>
m_pNameDlg->Create(); // 显示对话框<br>
}<br>
// 鼠标左键消息响应函数<br>
void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point)<br>
{<br>
if(m_nCount < MAX_NAME)<br>
{<br>
int height = rand()%60+12;<br>
int color = rand()%4;<br>
int escapement = (rand()%1200)-600;<br>
CString name = m_pNameDlg->m_strNameEdit;<br>
m_signalList[m_nCount].SetValue(name, point, height, color,<br>
escapement);<br>
m_nCount++;<br>
Invalidate();<br>
}<br>
}<br>
// 绘制框架窗口客户区函数<br>
void CMyWnd::OnPaint()<br>
{<br>
CPaintDC dc(this);<br>
for(int i=0; i<m_nCount; i++)<br>
m_signalList[i].ShowSignal(&dc);<br>
}<br>
// 对话框类的成员函数<br>
// 对话框类的构造函数<br>
CNameDlg::CNameDlg():CDialog(CNameDlg::IDD)<br>
{<br>
m_bActive = FALSE;<br>
m_strNameEdit = _T("");<br>
}<br>
// 数据交换<br>
void CNameDlg::DoDataExchange(CDataExchange* pDX)<br>
{<br>
CDialog::DoDataExchange(pDX);<br>
DDX_Text(pDX, IDC_EDIT1, m_strNameEdit);<br>
}<br>
// 初始化对话框<br>
BOOL CNameDlg::OnInitDialog() <br>
{<br>
CDialog::OnInitDialog();<br>
CRect rect;<br>
GetWindowRect(&rect);<br>
MoveWindow(0, 0, rect.Width(), rect.Height());<br>
return TRUE;<br>
}<br>
// 显示无模态对话框<br>
BOOL CNameDlg::Create()<br>
{<br>
m_bActive = TRUE;<br>
return CDialog::Create(CNameDlg::IDD);<br>
}<br>
// 退出对话框<br>
void CNameDlg::OnCancel() <br>
{<br>
m_bActive = FALSE;<br>
DestroyWindow(); <br>
}<br>
// 更新数据<br>
void CNameDlg::OnOK()<br>
{<br>
UpdateData(TRUE);<br>
}</p>
<p class=style3> </p>
<p class=style3><strong>7-15 为例14-2的签名程序加上字体选择对话框。<br>
说 明:本程序使用字体选择公用对话框(通过鼠标右键调出)选择签名的字体、字号和颜色等参数,在签名对话框中要输入姓名和签名与X轴的倾斜角。建立项目的方法与例14-2相似,只是要在签名对话框模板中再添加一个编辑控件用于输入签名的倾斜角,其标识符为IDD_EDIT2。</strong><br>
</p>
<p class=style3>程 序:<br>
// Example 14-4:签名留念簿程序<br>
#include <afxwin.h><br>
#include <afxdlgs.h><br>
#include <string.h><br>
#include "resource.h"<br>
// 对话框类<br>
class CNameDlg: public CDialog<br>
{<br>
public:<br>
CPoint m_pointTopLeft; // 对话框位置<br>
CString m_strNameEdit; // 签名<br>
LONG m_lEscapement; // 签名倾角<br>
public:<br>
CNameDlg();<br>
enum {IDD = IDD_NAMEDLG};<br>
protected:<br>
virtual void DoDataExchange(CDataExchange* pDX);<br>
virtual BOOL OnInitDialog(); <br>
};<br>
// 对话框类的构造函数<br>
CNameDlg::CNameDlg():CDialog(CNameDlg::IDD), m_pointTopLeft(0, 0)<br>
{<br>
m_strNameEdit = _T("");<br>
m_lEscapement = 0;<br>
}<br>
// 数据交换和数据检验<br>
void CNameDlg::DoDataExchange(CDataExchange* pDX)<br>
{<br>
CDialog::DoDataExchange(pDX);<br>
DDX_Text(pDX, IDC_EDIT1, m_strNameEdit);<br>
DDX_Text(pDX, IDC_EDIT2, m_lEscapement);<br>
DDV_MaxChars(pDX, m_strNameEdit, 20);<br>
DDV_MinMaxLong(pDX, m_lEscapement, -600, 600);<br>
}<br>
// 初始化对话框<br>
BOOL CNameDlg::OnInitDialog() <br>
{<br>
CDialog::OnInitDialog();<br>
CRect rect;<br>
GetWindowRect(&rect);<br>
rect = CRect(m_pointTopLeft, rect.Size());<br>
MoveWindow(rect);<br>
return TRUE;<br>
}<br>
// 签名类<br>
class CSignal: public CObject<br>
{<br>
CString m_strSignal; // 姓名<br>
COLORREF m_colorSignal; // 签名颜色<br>
CPoint m_pointSignal; // 签名位置<br>
LOGFONT m_fontSignal; // 签名字体<br>
public:<br>
CSignal(){}<br>
void SetValue(CString signal, CPoint point, COLORREF color,<br>
LONG escapement, LOGFONT *pfont);<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -