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_)
// 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 }
.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_)
// 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(); // 编辑框关闭后要让焦点主动落在列表框中 }
.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_)
// 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(); } } }
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; }
//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