[MFC]Phones程序:CFileDialog的应用、消息反射

1. Phones应用程序:

    1) 该程序示例会使用到公用对话框CFileDialog的有关技术和其它的一些小技巧;

    2) File菜单栏中有一个New Entry...菜单项,打开了以后会弹出一个对话框,让你输入姓名和电话号码(两个文本编辑框);

    3) 输入完确认之后会在视图中显示出刚添加的人的信息(姓名和号码);

    4) 其中视图区用一个列表框来显示,添加或打开的信息都以列表的形式来显示;

    5) File里还有Open...、Save、Save As...三个菜单项,直接使用CFileDialog来创建,其中Save菜单项,如果当前输入的信息已经有保存的目标文件了则点击后直接保存在目标文件中,如果没有就跟Save As...一样,会打开一个公用对话框将信息保存在目标文件中;

    6) 程序用到的文件的后缀设置为.phn,即phones的缩写;

!!改程序比较简陋,不能删除列表框中显示的信息,而只能添加和修改(直接双击列表框中的条目可以重新打开New Entry...的那个对话框,只不过打开的对话框中的编辑框不再是空的了,而是包含相应信息的),并且后缀.phn也没有在Windows注册表中注册过,因此不能直接双击文件用Phones程序来打开;


3. 设计:

    1) 输入输入电话号码的编辑框剪要求只能接受数字,不能接受字母,因此要从CEdit类中派生一个CNumEdit,经过编写要求达到该要求;

    2) 编辑姓名和号码的对话框的OK和Cancel按钮用两个位图显示,分别是勾和叉,但是ID还是使用MFC预定义的IDOK和IDCANCEL;

    3) 显示输入和打开的信息的列表框要求具有消息反射功能,即双击列表条目的消息要由列表框自己处理,并且处理方式是打开该条目的编辑姓名和电话的对话框,因此要从CListBox中派生出一个CPhonesListBox类,在其中实现上述功能;

    4) 由于用整个列表框作为用户视图,因此CChildView需要从CPhonesListBox派生;


4. NumEdit数字编辑框:该控件继承于CEdit,添加的功能是只能接受数字、括号、空格、连字符,不能接受其余字符,用来作为填写电话号码的编辑框

.h:

#if !defined(AFX_NUMEDIT_H__B3E49054_7A1A_4FD1_8028_ED50F00D3197__INCLUDED_)
#define AFX_NUMEDIT_H__B3E49054_7A1A_4FD1_8028_ED50F00D3197__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// NumEdit.h : header file
//

/
// CNumEdit window

class CNumEdit : public CEdit
{
// Construction
public:
	CNumEdit();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CNumEdit)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CNumEdit();

	// Generated message map functions
protected:
	//{{AFX_MSG(CNumEdit)
	// 添加字符消息,每输入一个字符都会产生该消息,用以判断是否为数字以及是否显示在编辑框中
	afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
	//}}AFX_MSG

	DECLARE_MESSAGE_MAP()
};

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_NUMEDIT_H__B3E49054_7A1A_4FD1_8028_ED50F00D3197__INCLUDED_)
.cpp:

// NumEdit.cpp : implementation file
//

#include "stdafx.h"
#include "Phones.h"

#include "NumEdit.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CNumEdit

CNumEdit::CNumEdit()
{
}

CNumEdit::~CNumEdit()
{
}


BEGIN_MESSAGE_MAP(CNumEdit, CEdit)
	//{{AFX_MSG_MAP(CNumEdit)
	ON_WM_CHAR() // WM_CHAR -> OnChar是MFC预定义的!!可以直接用Wizzard添加
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CNumEdit message handlers

void CNumEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{ // nChar就是当前输入的字符,nRepCnt是该字符连续输入的个数
  // 这里只需要关心nChar就行了

	// TODO: Add your message handler code here and/or call default
	if (_T('0') <= nChar && nChar <= _T('9') || // 数字1~9必须要保留
		VK_BACK == nChar ||						// 退格键(删除键)必须要保留
		_T('(') == nChar || _T(')') == nChar || // ()必须要保留,欧美号码中会有()
		_T('-') == nChar ||						// -连字符要保留
		_T(' ') == nChar)						// 可以包含空格
		CEdit::OnChar(nChar, nRepCnt, nFlags);	// 符合要求地再传递给基类显示!!
} // 但是仍然可以正常使用HOME、DEL、方向键等,因为这些键不产生WM_CHAR消息!!


5. AddEditDlg编辑信息的对话框:采用DDX_Control的绑定将控件对象以及控件派生对象作为数据成员

.h:

#if !defined(AFX_ADDEDITDLG_H__F6FEADB2_FC59_4468_8353_FBEB05679424__INCLUDED_)
#define AFX_ADDEDITDLG_H__F6FEADB2_FC59_4468_8353_FBEB05679424__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// AddEditDlg.h : header file
//

/
// CAddEditDlg dialog

class CAddEditDlg : public CDialog
{
// Construction
public:
	CAddEditDlg(CWnd* pParent = NULL);   // standard constructor

// Dialog Data
	//{{AFX_DATA(CAddEditDlg)
	enum { IDD = IDD_DIALOG_ADDEDIT };
	CNumEdit	m_wndNumEdit;
	// 要使用两个按钮控件的SetIcon函数来加载显示图标
	// 这里采用DDX_Control来绑定(演示)
	// DDX_Control最适合将控件和派生控件作为成员数据!
	CButton	m_wndCancel;
	CButton	m_wndOK;
	CString	m_strName;
	CString	m_strPhone;
	//}}AFX_DATA


// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAddEditDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:

	// Generated message map functions
	//{{AFX_MSG(CAddEditDlg)
	// 需要在InitDialog中载入按钮的位图
	// 但是OnInitDialog不仅是WM_INITDIALOG的MFC预定义响应函数
	// 也是CDialog的虚函数,但是在MFC中预定义虚函数的级别要比
	// 预定义响应函数要高,因此在这里使用virtual修饰而不是afx_msg
	// 同样在后面的消息映射中也不用添加ON_WM_INITDIALOG,因为
	// 它是虚函数,级别要比响应函数高,因此以虚函数的身份优先
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ADDEDITDLG_H__F6FEADB2_FC59_4468_8353_FBEB05679424__INCLUDED_)

.cpp:

// AddEditDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Phones.h"

#include "NumEdit.h"
#include "AddEditDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CAddEditDlg dialog


CAddEditDlg::CAddEditDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CAddEditDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CAddEditDlg)
	m_strName = _T("");
	m_strPhone = _T("");
	//}}AFX_DATA_INIT
}


void CAddEditDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAddEditDlg)
	DDX_Control(pDX, IDC_EDIT_PHONE, m_wndNumEdit);
	DDX_Control(pDX, IDCANCEL, m_wndCancel);
	DDX_Control(pDX, IDOK, m_wndOK);
	DDX_Text(pDX, IDC_EDIT_NAME, m_strName);
	DDV_MaxChars(pDX, m_strName, 32);
	DDX_Text(pDX, IDC_EDIT_PHONE, m_strPhone);
	DDV_MaxChars(pDX, m_strPhone, 20);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CAddEditDlg, CDialog)
	//{{AFX_MSG_MAP(CAddEditDlg)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/
// CAddEditDlg message handlers

BOOL CAddEditDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	// 载入位图资源
	m_wndOK.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_OK));
	m_wndCancel.SetIcon(AfxGetApp()->LoadIcon(IDI_ICON_CANCEL));
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

6. PhonesListBox列表框累:将作为CChildView的基类,整个视图将以列表框的形式显示

.h:

#if !defined(AFX_PHONESLISTBOX_H__F0854C8A_4B1B_4DD1_8E4C_E1D11BDE5265__INCLUDED_)
#define AFX_PHONESLISTBOX_H__F0854C8A_4B1B_4DD1_8E4C_E1D11BDE5265__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// PhonesListBox.h : header file
//

/
// CPhonesListBox window

class CPhonesListBox : public CListBox
{
// Construction
public:
	CPhonesListBox();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CPhonesListBox)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CPhonesListBox();

public:
	void NewEntry(); // 添加一个打开编辑框增加条目的函数
	// 要定义成public的,因为要在CChildView中调用它

	// Generated message map functions
protected:
	CFont m_font;
	//{{AFX_MSG(CPhonesListBox)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // 用来初始化列表框中文本的字体、制表的宽度
	//}}AFX_MSG
	afx_msg void OnEditItem(); // 双击响应——打开对话框编辑该条目

	DECLARE_MESSAGE_MAP()
};

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_PHONESLISTBOX_H__F0854C8A_4B1B_4DD1_8E4C_E1D11BDE5265__INCLUDED_)

.cpp:

// PhonesListBox.cpp : implementation file
//

#include "stdafx.h"
#include "Phones.h"

#include "NumEdit.h"
#include "AddEditDlg.h"
#include "PhonesListBox.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CPhonesListBox

CPhonesListBox::CPhonesListBox()
{
}

CPhonesListBox::~CPhonesListBox()
{
}

// 创建一个新条目(打开编辑框创建新条目)
void CPhonesListBox::NewEntry()
{
	CAddEditDlg dlg;
	if (IDOK == dlg.DoModal()) {
		CString strItem = dlg.m_strName + _T("\t") + dlg.m_strPhone;
		AddString(strItem);
	}
	SetFocus(); // 关闭对话框后立马主动把焦点放到列表框上
} // 这将在其派生类CChildView中相应Add Entry时调用

BEGIN_MESSAGE_MAP(CPhonesListBox, CListBox)
	//{{AFX_MSG_MAP(CPhonesListBox)
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
	// 将双击消息反射给自己处理
	ON_CONTROL_REFLECT(LBN_DBLCLK, OnEditItem)
END_MESSAGE_MAP()

/
// CPhonesListBox message handlers

int CPhonesListBox::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CListBox::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	m_font.CreatePointFont(80, _T("MS Sans Serif"));  // 设定列表框中字体的风格和粗细度
	SetFont(&m_font, FALSE);
	SetTabStops(128); // 设置\t的宽度,\t将会用来隔开姓名和电话好吗
	
	return 0;
}

// 相应双击条目消息,打开编辑框编辑该条目
void CPhonesListBox::OnEditItem()
{
	CString strItem;
	int nIndex = GetCurSel(); // 获取双击选中的条目的索引
	GetText(nIndex, strItem); // 从nIndex条目处获取内容存放到strItem中
	int nPos = strItem.Find(_T('\t')); // 找到姓名和号码中间间隔的\t的位置

	CAddEditDlg dlg; // 构造接下来要打开的编辑对话框
	// 获取初始时的字符串
	dlg.m_strName = strItem.Left(nPos);
	dlg.m_strName = strItem.Right(strItem.GetLength() - 1 - nPos);

	if (IDOK == dlg.DoModal()) {
		strItem = dlg.m_strName + _T("\t") + dlg.m_strPhone; // 更新用户修改后的条目
		DeleteString(nIndex); // 删除老的条目
		AddString(strItem); // 直接从末尾插入更新后的条目,而不是从删除的位置插入!
	}
	SetFocus(); // 编辑框关闭后要让焦点主动落在列表框中
}

7. ChildView:将PhonesListBox作为基类

.h:

// ChildView.h : interface of the CChildView class
//
/

#if !defined(AFX_CHILDVIEW_H__0F9BE56C_002C_46FE_A3B2_23B20C8D9BC0__INCLUDED_)
#define AFX_CHILDVIEW_H__0F9BE56C_002C_46FE_A3B2_23B20C8D9BC0__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/
// CChildView window

class CChildView : public CPhonesListBox
{
// Construction
public:
	CChildView();

// Attributes
public:

// Operations
public:

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CChildView)
	protected:
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // 要在其中使用列表框的PreCreateWindow!!
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CChildView();

	// Generated message map functions
protected:
	static const TCHAR m_lpszFilters[]; // 过滤器字符串
	CString m_strPath; // 从CFileDialog中获取的文件路径

	// 两个用CStdioFile读写文件的函数
	// 为了与MFC预定义的WriteFle和ReadFile相区别加上前缀My
	BOOL MyWriteFile(LPCTSTR lpszFileName);
	BOOL MyReadFile(LPCTSTR lpszFileName);

	//{{AFX_MSG(CChildView)
	// afx_msg void OnPaint(); // 直接用列表框作为视图就无需重画了
	//}}AFX_MSG

	// 分别对应4个菜单项
	afx_msg void OnFileNewEntry();
	afx_msg void OnFileOpen();
	afx_msg void OnFileSave();
	afx_msg void OnFileSaveAs();
	DECLARE_MESSAGE_MAP()
};

/

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_CHILDVIEW_H__0F9BE56C_002C_46FE_A3B2_23B20C8D9BC0__INCLUDED_)

.cpp:

// ChildView.cpp : implementation of the CChildView class
//

#include "stdafx.h"
#include "Phones.h"

#include "PhonesListBox.h"
#include "ChildView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/
// CChildView

// 文件过滤器字符串的定义
// 一共就两种,一种是*.phn另一种是任意文件类型*.*
const TCHAR CChildView::m_lpszFilters[] = 
	_T("Phone Files(*.phn)|*phn|All Files(*.*)|*.*||");

CChildView::CChildView()
{
}

CChildView::~CChildView()
{
}

// 利用CStdioFile读写文件
// 读:每读一条就添加到列表框中
// 写:从列表框中一项一项录取写入文件

BOOL CChildView::MyReadFile(LPCTSTR lpszFileName)
{
	try {
		CStdioFile file(lpszFileName, CFile::modeRead);
		ResetContent(); // 读入之前要先把列表情况,准备加入新文件的条目
		
		DWORD dwCount;
		file.Read(&dwCount, sizeof(dwCount)); // 文件的第一个双字保存条目数量
		if (dwCount) {
			CString str;
			for (int i = 0; i < (int)dwCount; i++) {
				file.ReadString(str); // 读一条就添加一条
				// ReadString以行为单位读取,读取后会自动去掉末尾的\n
				AddString(str);
			}
		}
		
		return TRUE; // 成功读取就返回TRUE
	}	
	catch (CFileException* e) {
		e->ReportError();
		e->Delete();
	}
	
	return FALSE; // 否则就出现错误范围FALSE
}

BOOL CChildView::MyWriteFile(LPCTSTR lpszFileName)
{
	try {
		CStdioFile file(lpszFileName, CFile::modeWrite|CFile::modeCreate);
		DWORD dwCount = GetCount();
		file.Write(&dwCount, sizeof(dwCount)); // 文件的第一个双字保存条目数量
		if (dwCount) {
			CString str;
			for (int i = 0; i < (int)dwCount; i++) {
				GetText(i, str);
				str += _T("\n");
				file.WriteString(str); // 从列表框中读取的条目需要在末尾添加\n后再写入
			}
		}

		return TRUE; // 平安无事返回TRUE
	}
	catch (CFileException* e) {
		e->ReportError();
		e->Delete();
	}

	return FALSE;
}


BEGIN_MESSAGE_MAP(CChildView,CWnd )
	//{{AFX_MSG_MAP(CChildView)
	// ON_WM_PAINT()
	//}}AFX_MSG_MAP
	ON_COMMAND(IDM_FILE_NEWENTRY, OnFileNewEntry)
	ON_COMMAND(IDM_FILE_OPEN, OnFileOpen)
	ON_COMMAND(IDM_FILE_SAVE, OnFileSave)
	ON_COMMAND(IDM_FILE_SAVEAS, OnFileSaveAs)
END_MESSAGE_MAP()


/
// CChildView message handlers

BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs) 
{
	if (!CPhonesListBox::PreCreateWindow(cs)) // 要使用列表框的PreCreateWindow!!
		// 否则就默认使用CWnd的PreCreateWindow了,这样就无法看到列表框了
		return FALSE;

	cs.dwExStyle |= WS_EX_CLIENTEDGE;
	cs.style &= ~WS_BORDER;
// 	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS, 
// 		::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW+1), NULL);

	return TRUE;
}

// void CChildView::OnPaint() 
// {
// 	CPaintDC dc(this); // device context for painting
// 	
// 	// TODO: Add your message handler code here
// 	
// 	// Do not call CWnd::OnPaint() for painting messages
// }

void CChildView::OnFileNewEntry()
{
	NewEntry(); // 直接调用基类CPhoneListBox的NewEntry就行了
}

void CChildView::OnFileOpen()
{
	CFileDialog dlg(TRUE, _T("phn"), _T("*.phn"),
		OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, m_lpszFilters);

	if (IDOK == dlg.DoModal()) {
		if (MyReadFile(dlg.GetPathName())) {
			m_strPath = dlg.GetPathName();
			SetCurSel(0); // MyReadFile已经将读取的条目添加到列表框中了
			// 所以添加完毕后将第一条选中即可
		}
	}
}

void CChildView::OnFileSave()
{
	if (!m_strPath.IsEmpty()) // 如果已经打开过某个文件或者保存过了
		MyWriteFile(m_strPath); // 则直接写文件即可
	else
		OnFileSaveAs(); // 否则就需要打开Save As对话框选择一个路径保存
}

void CChildView::OnFileSaveAs()
{
	CFileDialog dlg(FALSE, _T("phn"), m_strPath, // 默认值的是m_strPath,可以保持记忆化
		OFN_OVERWRITEPROMPT|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY, // 写的时候一定要包括
		// OFN_OVERWRITEPROMPT的同名覆盖问题
		m_lpszFilters);

	if (IDOK == dlg.DoModal()) {
		if (MyWriteFile(dlg.GetPathName())) {
			m_strPath = dlg.GetPathName();
		}
	}
}


8. MainFrame的OnCreate函数,m_wndView一定要以列表框的样式创建!!

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	if (!m_wndView.Create(WS_CHILD|WS_VISIBLE| // 注意Create的时候要按照列表框的样式初始化!!!
		LBS_USETABSTOPS|LBS_SORT|LBS_NOTIFY|LBS_NOINTEGRALHEIGHT,
		CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST))
		return -1;
	
	return 0;
}

9. .rc:

//Microsoft Developer Studio generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/
#undef APSTUDIO_READONLY_SYMBOLS

/
// Chinese (P.R.C.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
#ifdef _WIN32
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//

1 TEXTINCLUDE DISCARDABLE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE DISCARDABLE 
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
    "#ifdef _WIN32\r\n"
    "LANGUAGE 9, 1\r\n"
    "#pragma code_page(1252)\r\n"
    "#endif //_WIN32\r\n"
    "#include ""res\\Phones.rc2""  // non-Microsoft Visual C++ edited resources\r\n"
    "#include ""afxres.rc""         // Standard components\r\n"
    "#endif\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON_OK             ICON    DISCARDABLE     "res\\icon1.ico"
IDI_ICON_CANCEL         ICON    DISCARDABLE     "res\\ico00001.ico"

/
//
// Dialog
//

IDD_DIALOG_ADDEDIT DIALOG DISCARDABLE  0, 0, 164, 123
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Add/Edit Entry"
FONT 10, "System"
BEGIN
    LTEXT           "&Name",IDC_STATIC,20,25,25,10
    EDITTEXT        IDC_EDIT_NAME,60,25,75,10,ES_AUTOHSCROLL
    LTEXT           "&Phone",IDC_STATIC,20,45,25,10
    EDITTEXT        IDC_EDIT_PHONE,60,45,75,10,ES_AUTOHSCROLL
    DEFPUSHBUTTON   "OK",IDOK,20,75,50,29
    PUSHBUTTON      "Cancel",IDCANCEL,85,75,50,29
END


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    IDD_DIALOG_ADDEDIT, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 157
        TOPMARGIN, 7
        BOTTOMMARGIN, 116
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // Chinese (P.R.C.) resources
/


/
// English (U.S.) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32

/
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME           ICON    DISCARDABLE     "res\\Phones.ico"

/
//
// Menu
//

IDR_MAINFRAME MENU PRELOAD DISCARDABLE 
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New Entry...",               IDM_FILE_NEWENTRY
        MENUITEM SEPARATOR
        MENUITEM "&Open",                       IDM_FILE_OPEN
        MENUITEM "&Save",                       IDM_FILE_SAVE
        MENUITEM "Save As...",                  IDM_FILE_SAVEAS
        MENUITEM "E&xit",                       ID_APP_EXIT
    END
    POPUP "&Edit"
    BEGIN
        MENUITEM "&Undo\tCtrl+Z",               ID_EDIT_UNDO
        MENUITEM SEPARATOR
        MENUITEM "Cu&t\tCtrl+X",                ID_EDIT_CUT
        MENUITEM "&Copy\tCtrl+C",               ID_EDIT_COPY
        MENUITEM "&Paste\tCtrl+V",              ID_EDIT_PASTE
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About Phones...",            ID_APP_ABOUT
    END
END


/
//
// Accelerator
//

IDR_MAINFRAME ACCELERATORS PRELOAD MOVEABLE PURE 
BEGIN
    "C",            ID_EDIT_COPY,           VIRTKEY, CONTROL, NOINVERT
    "V",            ID_EDIT_PASTE,          VIRTKEY, CONTROL, NOINVERT
    VK_BACK,        ID_EDIT_UNDO,           VIRTKEY, ALT, NOINVERT
    VK_DELETE,      ID_EDIT_CUT,            VIRTKEY, SHIFT, NOINVERT
    VK_F6,          ID_NEXT_PANE,           VIRTKEY, NOINVERT
    VK_F6,          ID_PREV_PANE,           VIRTKEY, SHIFT, NOINVERT
    VK_INSERT,      ID_EDIT_COPY,           VIRTKEY, CONTROL, NOINVERT
    VK_INSERT,      ID_EDIT_PASTE,          VIRTKEY, SHIFT, NOINVERT
    "X",            ID_EDIT_CUT,            VIRTKEY, CONTROL, NOINVERT
    "Z",            ID_EDIT_UNDO,           VIRTKEY, CONTROL, NOINVERT
END


/
//
// Dialog
//

IDD_ABOUTBOX DIALOG DISCARDABLE  0, 0, 235, 55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "About Phones"
FONT 8, "MS Sans Serif"
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC,11,17,20,20
    LTEXT           "Phones Version 1.0",IDC_STATIC,40,10,119,8,SS_NOPREFIX
    LTEXT           "Copyright (C) 2015",IDC_STATIC,40,25,119,8
    DEFPUSHBUTTON   "OK",IDOK,178,7,50,14,WS_GROUP
END


#ifndef _MAC
/
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "040904B0"
        BEGIN
            VALUE "CompanyName", "\0"
            VALUE "FileDescription", "Phones MFC Application\0"
            VALUE "FileVersion", "1, 0, 0, 1\0"
            VALUE "InternalName", "Phones\0"
            VALUE "LegalCopyright", "Copyright (C) 2015\0"
            VALUE "LegalTrademarks", "\0"
            VALUE "OriginalFilename", "Phones.EXE\0"
            VALUE "ProductName", "Phones Application\0"
            VALUE "ProductVersion", "1, 0, 0, 1\0"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x409, 1200
    END
END

#endif    // !_MAC


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE 
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 228
        TOPMARGIN, 7
        BOTTOMMARGIN, 48
    END
END
#endif    // APSTUDIO_INVOKED


/
//
// String Table
//

STRINGTABLE PRELOAD DISCARDABLE 
BEGIN
    IDR_MAINFRAME           "Phones"
END

STRINGTABLE PRELOAD DISCARDABLE 
BEGIN
    AFX_IDS_APP_TITLE       "Phones"
    AFX_IDS_IDLEMESSAGE     "Ready"
END

STRINGTABLE DISCARDABLE 
BEGIN
    ID_INDICATOR_EXT        "EXT"
    ID_INDICATOR_CAPS       "CAP"
    ID_INDICATOR_NUM        "NUM"
    ID_INDICATOR_SCRL       "SCRL"
    ID_INDICATOR_OVR        "OVR"
    ID_INDICATOR_REC        "REC"
END

STRINGTABLE DISCARDABLE 
BEGIN
    ID_APP_ABOUT            "Display program information, version number and copyright\nAbout"
    ID_APP_EXIT             "Quit the application; prompts to save documents\nExit"
END

STRINGTABLE DISCARDABLE 
BEGIN
    ID_NEXT_PANE            "Switch to the next window pane\nNext Pane"
    ID_PREV_PANE            "Switch back to the previous window pane\nPrevious Pane"
END

STRINGTABLE DISCARDABLE 
BEGIN
    ID_WINDOW_SPLIT         "Split the active window into panes\nSplit"
END

STRINGTABLE DISCARDABLE 
BEGIN
    ID_EDIT_CLEAR           "Erase the selection\nErase"
    ID_EDIT_CLEAR_ALL       "Erase everything\nErase All"
    ID_EDIT_COPY            "Copy the selection and put it on the Clipboard\nCopy"
    ID_EDIT_CUT             "Cut the selection and put it on the Clipboard\nCut"
    ID_EDIT_FIND            "Find the specified text\nFind"
    ID_EDIT_PASTE           "Insert Clipboard contents\nPaste"
    ID_EDIT_REPEAT          "Repeat the last action\nRepeat"
    ID_EDIT_REPLACE         "Replace specific text with different text\nReplace"
    ID_EDIT_SELECT_ALL      "Select the entire document\nSelect All"
    ID_EDIT_UNDO            "Undo the last action\nUndo"
    ID_EDIT_REDO            "Redo the previously undone action\nRedo"
END

STRINGTABLE DISCARDABLE 
BEGIN
    AFX_IDS_SCSIZE          "Change the window size"
    AFX_IDS_SCMOVE          "Change the window position"
    AFX_IDS_SCMINIMIZE      "Reduce the window to an icon"
    AFX_IDS_SCMAXIMIZE      "Enlarge the window to full size"
    AFX_IDS_SCNEXTWINDOW    "Switch to the next document window"
    AFX_IDS_SCPREVWINDOW    "Switch to the previous document window"
    AFX_IDS_SCCLOSE         "Close the active window and prompts to save the documents"
END

STRINGTABLE DISCARDABLE 
BEGIN
    AFX_IDS_SCRESTORE       "Restore the window to normal size"
    AFX_IDS_SCTASKLIST      "Activate Task List"
END

#endif    // English (U.S.) resources
/



#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9, 1
#pragma code_page(1252)
#endif //_WIN32
#include "res\Phones.rc2"  // non-Microsoft Visual C++ edited resources
#include "afxres.rc"         // Standard components
#endif

/
#endif    // not APSTUDIO_INVOKED


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值