第14单元对话框 下面介绍常用的数据检验函数: void DDV Max Chars( CData Exchange* pDX, CString const& value, int nChars ) void DDV Min Byte( CDataExchange* pDX, BYTE value, BYTE min Val BYTE max val void DDV Min Date Time( CDataExchange* pDX, CTime& revAlue, const CTime* refMin Range, const CTime" refMaxRange ) void DD Min MaxD Word( CData Exchange* pDX, DWORD const& value DWORD min Val, DWORD max Val void DDV Min Double( CDataExchange* pDX, double const& value, double min Val, double max val void DDV Min Float( CDataExchange* pDX, float value, float min Val float max Val ) void DDV MinMaxlnt( CDataExchange* pDX, int value, int min Val, int max Val ) void DDV MinMaxLong( CDataExchange* pDX, long value, long min Val, : Val void DDV MinMaxMonth( CDataExchange'* pDX, CTime& revalue, const CTime* refMinRange, const CTime* refMax Range void DDV MinMaxUnsigned( CData Exchange* pDX, unsigned value unsigned min Val, unsigned max Val ) void DDV Min MaxSlider( CDataExchange* pDX, DWORD value, DWORD min Val DWORD max Val 其中参数pDX和 value的含义与DDx函数相同,最后一个(或两个)参数是数据范围。参 数 n Chars是字符串的最大字符数,而参数mnVa和 marVa分别为数值类数据的下限和上 例142签名留念簿程序。该程序模仿签名簿,用户使用鼠标左键点击窗口客户区后 会弹出一个对话框,输入姓名后可在鼠标点击位置显示出该签名。签名的颜色、字体大小和 方向随机确定。 说明:项目建立及添加对话框模板资源的方法同例14-1。修改对话框模板的ID为 IDD NAMEDLG, Caption为“签名对话框”,并添加一个静态文本控件( Caption改为“签 名”)和一个编辑控件(ID改为 IDC EDITNAME) 程序: ∥/ Example14-2:签名留念簿程序 #include <afxwin. h> include resource. h" /对话框类 class CNameDlg: public CDialog public
第 14 单元 对话框 280 下面介绍常用的数据检验函数: void DDV_MaxChars ( CDataExchange* pDX, CString const& value, int nChars ); void DDV_MinMaxByte ( CDataExchange* pDX, BYTE value, BYTE minVal, BYTE maxVal ); void DDV_MinMaxDateTime ( CDataExchange* pDX, CTime& refValue, const CTime* refMinRange, const CTime* refMaxRange ); void DDV_MinMaxDWord( CDataExchange* pDX, DWORD const& value, DWORD minVal, DWORD maxVal ); void DDV_MinMaxDouble ( CDataExchange* pDX, double const& value, double minVal, double maxVal ); void DDV_MinMaxFloat ( CDataExchange* pDX, float value, float minVal, float maxVal ); void DDV_MinMaxInt ( CDataExchange* pDX, int value, int minVal, int maxVal ); void DDV_MinMaxLong ( CDataExchange* pDX, long value, long minVal, long maxVal ); void DDV_MinMaxMonth ( CDataExchange* pDX, CTime& refValue, const CTime* refMinRange, const CTime* refMaxRange ); void DDV_MinMaxUnsigned ( CDataExchange* pDX, unsigned value, unsigned minVal, unsigned maxVal ); void DDV_MinMaxSlider ( CDataExchange* pDX, DWORD value, DWORD minVal, DWORD maxVal ); 其中参数 pDX 和 value 的含义与 DDX 函数相同,最后一个(或两个)参数是数据范围。参 数 nChars 是字符串的最大字符数,而参数 minVal 和 maxVal 分别为数值类数据的下限和上 限。 [例 14-2] 签名留念簿程序。该程序模仿签名簿,用户使用鼠标左键点击窗口客户区后 会弹出一个对话框,输入姓名后可在鼠标点击位置显示出该签名。签名的颜色、字体大小和 方向随机确定。 说 明:项目建立及添加对话框模板资源的方法同例 14-1。修改对话框模板的 ID 为 IDD_NAMEDLG,Caption 为“签名对话框”,并添加一个静态文本控件(Caption 改为“签 名”)和一个编辑控件(ID 改为 IDC_EDITNAME)。 程 序: // Example 14-2:签名留念簿程序 #include <afxwin.h> #include "resource.h" // 对话框类 class CNameDlg: public CDialog { public:
第14单元对话框 CPoint m pointTopLeft String m strNameEdit publ )lgo enum [IDD= IDD NAMEDLG protected virtual void DoDataExchange(CDataExchange* pDX) virtual BOOL OnInitDialogo /对话框类的构造函数 CNameDlg: CNameDlg(: CDialog(CName Dlg:: IDD) m strName Edit T() /数据交换和数据检验 void CNameDlg: DoDataExchange(CDataExchange* pDX) CDialog:: DoDataExchange(pDX) DDX Text(pDX, IDC EDI TNAME, m strName Edit) DDV MaxChars (pDX, m strName Edit, 20) //初始化对话框 BOOL CNameDlg:: OnInitDialogo CDialog:: OnInitDialogo CRect rect GetWindowRect(&rect) rect CRect(m pointTopLeft, rect Size o) return TRUE //签名类 class SIgnal: public Cobject CString m sName /姓名 CPoint m pointsignal;∥/签名位置 int m nHeight /字体高 int //签名颜色
第 14 单元 对话框 281 CPoint m_pointTopLeft; CString m_strNameEdit; public: CNameDlg(); enum {IDD = IDD_NAMEDLG}; protected: virtual void DoDataExchange(CDataExchange* pDX); virtual BOOL OnInitDialog(); }; // 对话框类的构造函数 CNameDlg::CNameDlg():CDialog(CNameDlg::IDD) { m_strNameEdit = _T(""); } // 数据交换和数据检验 void CNameDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDITNAME, m_strNameEdit); DDV_MaxChars(pDX, m_strNameEdit, 20); } // 初始化对话框 BOOL CNameDlg::OnInitDialog() { CDialog::OnInitDialog(); CRect rect; GetWindowRect(&rect); rect = CRect(m_pointTopLeft, rect.Size()); MoveWindow(rect); return TRUE; } // 签名类 class CSignal: public CObject { CString m_sName; // 姓名 CPoint m_pointSignal; // 签名位置 int m_nHeight; // 字体高 int m_nColor; // 签名颜色
int m eScapement;//签名倾角 blie igna } void Setvalue(CString name, CPoint point, int height, int color //签名类成员函数 void CSignal: SetValue(CString name, CPoint point, int height, int color int escapement) name m m nHeight m cOlor color t = escapement /显示签名 void CSignal: ShowSignal(CDC *pDC) CFont **pOIdFont, font font. CreateFont(m nHeight, 0, m eScapement, 0, 400, FALSE, FALSE 0, OEM CHARSET, OUT DEFAULT PRECIS CLIP DEFAULT PRECIS, DEFAULT QUALITY, DEFAULT_ PITCH,"楷体"); pOldFont= pDC->SelectObject(&font) switch(m cOlor case DC->SetTextColor(rGb(0, 0, 0)) case 5,0,0) pDC->SetTextColor (RGB(0, 255, 0)) break
第 14 单元 对话框 282 int m_nEscapement; // 签名倾角 public: CSignal(){} void SetValue(CString name,CPoint point,int height,int color, int escapement); void ShowSignal(CDC *pDC); }; // 签名类成员函数 void CSignal::SetValue(CString name,CPoint point,int height,int color, int escapement) { m_sName = name; m_pointSignal = point; m_nHeight = height; m_nColor = color; m_nEscapement = escapement; } // 显示签名 void CSignal::ShowSignal(CDC *pDC) { CFont *pOldFont, font; font.CreateFont(m_nHeight, 0, m_nEscapement,0, 400, FALSE,FALSE, 0, OEM_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH, "楷体"); pOldFont = pDC->SelectObject(&font); switch(m_nColor) { case 0: pDC->SetTextColor(RGB(0, 0, 0)); break; case 1: pDC->SetTextColor(RGB(255, 0, 0)); break; case 2: pDC->SetTextColor(RGB(0, 255, 0)); break; case 3:
第14单元对话框 DC->SetTextColor (RGb(0, 0, 255)) break pDC->Text Out(m pointSignal. x, m pointsignal y, m sName pDC->SelectObject(poldFont //框架窗口类 #define maX name 250 class CMy Wnd: public CFrameWnd CSignal m signalList [MAX NAME int m n Count: publi CMyWnd (: m nCount(O)1 protected afx msg void OnLBut ton Down UINT nFlags, CPoint point afx msg void OnPaint O DECLARE MESSAGE MAPO /消息映射 BEGIN MESSAGE MAP(CMyWnd, CFrameWnd ON WM LBUTTONDOWN O ON WM PAINTO END MESSAGE MAPO /框架窗口类的成员函数 /鼠标右键消息响应函数 void CMy Wnd:: OnLBut Down UINT nFlags, CPoint point) if(m nCount MAX NAME) CNamedlg dig dl if(dlg DoModal(== IDOK) int color rand (%4 int escapement =(rand(%1200)-600 CString name = dlg. m strName Edit
第 14 单元 对话框 283 pDC->SetTextColor(RGB(0, 0, 255)); break; } pDC->TextOut(m_pointSignal.x, m_pointSignal.y, m_sName); pDC->SelectObject(pOldFont); } // 框架窗口类 #define MAX_NAME 250 class CMyWnd: public CFrameWnd { CSignal m_signalList[MAX_NAME]; int m_nCount; public: CMyWnd(): m_nCount(0){} protected: afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() }; // 消息映射 BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) ON_WM_LBUTTONDOWN() ON_WM_PAINT() END_MESSAGE_MAP() // 框架窗口类的成员函数 // 鼠标右键消息响应函数 void CMyWnd::OnLButtonDown(UINT nFlags, CPoint point) { if(m_nCount < MAX_NAME) { CNameDlg dlg; dlg.m_pointTopLeft = point; if(dlg.DoModal() == IDOK) { int height = rand()%60+12; int color = rand()%4; int escapement = (rand()%1200)-600; CString name = dlg.m_strNameEdit;