




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、下載 第14章 雜類 收集到本章中的例子的唯一標(biāo)準(zhǔn)是因?yàn)闆](méi)有足夠的相關(guān)主題的例子使它們獨(dú)立成章。剪切和粘貼,以及MFC的數(shù)據(jù)集類幾乎都有足夠的例子使它們成為一章,但是由于時(shí)間的原因,除了書上所列例子外,其余的例子都被省略了。盡管如此,在本章中還是包含了幾個(gè)有用的例子。 例74 剪切、拷貝和粘貼文本數(shù)據(jù) 討論編輯控件窗口內(nèi)建的剪切和粘貼功能。 例75 剪切、拷貝和粘貼多信息文本數(shù)據(jù) 討論多信息編輯控件窗口內(nèi)建的剪切和粘貼功能。例76 剪切、拷貝和粘貼二進(jìn)制數(shù)據(jù) 使用串行化剪切和粘貼數(shù)據(jù)類。 例77 數(shù)組函數(shù) 討論MFC類維護(hù)相同的類或指針的數(shù)組。 例78 列表函數(shù) 討論MFC類維護(hù)相同的類或指針
2、的鏈接列表。 例79 映像函數(shù) 討論MFC類維護(hù)使用二進(jìn)制或文本關(guān)鍵字訪問(wèn)相同的類和指針。例80 系統(tǒng)鍵盤輸入 定向一些系統(tǒng)鍵,如Delete鍵,到視圖類的Delete ( )函數(shù)。例 81 時(shí)間 討論使用MFC類可以訪問(wèn)的時(shí)間格式。 14.1 例74 剪切、拷貝和粘貼文本數(shù)據(jù) 目標(biāo) 從編輯控件中剪切或拷貝字符串,然后把它粘貼到控件中的另一個(gè)地方或其他控件中。用戶也可以使用彈出式菜單進(jìn)行剪切和粘貼,如圖 14-1所示。 策略 實(shí)際上,編輯控件提供了剪貼功能,在控件上右擊鼠標(biāo),會(huì)彈出如上的菜單。因此,本例的目的是討論如何自己實(shí)現(xiàn)這個(gè)彈出菜單,以便以后可以加入自己的菜單命令。還將討論編輯控件中支持
3、剪貼的成員函數(shù),并把這種功能封裝到自己的 CEdit 控件的派生類。 編輯控件中的Cut 和Paste菜單項(xiàng) 圖14-1 添加用戶自己的菜單命令到剪貼文本彈出菜單中 步驟 1. 創(chuàng)建一個(gè)新的編輯控件類 使用C l a s s Wi z a r d 創(chuàng)建一個(gè)新的編輯控件類,該類是從 CE d i t派生過(guò)來(lái)的。再使用ClassWizard添加WM_RBUTTONDOWN消息處理函數(shù)到這個(gè)類中。 2. 裝入和啟用彈出式菜單 1) 使用菜單編輯器創(chuàng)建一個(gè)如同圖 14-1的菜單資源。 2) 編輯WM_RBUTTONDOWN消息處理函數(shù),創(chuàng)建一個(gè)基于菜單資源的彈出式菜單。 第 14 章 雜 類 289
4、下載void CWzdEdit:OnRButtonDown(UINT nFlags, CPoint point)CMenu menu;/ load a menu from the resources menu.LoadMenu(IDR_SELECTION_MENU);/ get a pointer to actual popup menu CMenu* pPopup = menu.GetSubMenu(0);一旦裝入,彈出式菜單的所有菜單項(xiàng)都被啟用。但有時(shí)可能需要禁用某些菜單項(xiàng)以表示其當(dāng)前不可用。例如,若沒(méi)有任何東西需要取消,我們必須禁用 Undo命令。 3) 使用CEdit的CanUndo
5、( )啟用或禁用Undo命令。 UINT nUndo=(CanUndo() ? 0 : MF_GRAYED);pPopup-EnableMenuItem(ID_EDIT_UNDO, MF_BYCOMMAND|nUndo);4) 對(duì)于依賴于編輯控件中所選的文本的命令,使用 CEdit:GetSel ( )獲得當(dāng)前選中文本的開始和結(jié)束位置。若開始和結(jié)束位置相等,即沒(méi)有選中任何文字,此時(shí) Cut、Copy和Delete命令均被禁用。 int beg,end; GetSel(beg,end);UINT nSel=(beg!=end) ? 0 : MF_GRAYED);pPopup-EnableMenu
6、Item(ID_EDIT_CUT, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_EDIT_CLEAR, MF_BYCOMMAND|nSel);5) 對(duì)于Paste命令,我們需要檢查剪貼板中是否有可用的文本。 UINT nPaste=(:IsClipboardFormatAvailable(CF_TEXT) ? 0 : MF_GRAYED);pPopup-EnableMenuItem(ID_EDIT_PASTE, MF_BYCOMMAND|
7、nPaste);6) 現(xiàn)在,我們可以顯示彈出式菜單,等待用戶選擇。 / pop up the menu CPoint pt; GetCursorPos(&pt);pPopup-TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); pPopup-DestroyMenu();CEdit:OnRButtonDown(nFlags, point);3. 處理彈出式菜單命令 1) 若用戶選擇一個(gè)命令,那么該命令將作為一條帶命令 ID的WM_COMMAND消息返回到窗口中,使用菜單編輯器可以給命令 ID賦值。要處理這些命令,必須手工添加下面的消息宏到消息映像
8、中。 ON_COMMAND(ID_EDIT_UNDO, OnUndo) ON_COMMAND(ID_EDIT_CUT, OnCut) ON_COMMAND(ID_EDIT_COPY, OnCopy) ON_COMMAND(ID_EDIT_PASTE, OnPaste) ON_COMMAND(ID_EDIT_CLEAR, OnDelete) ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll)2) 因?yàn)轫憫?yīng)這些命令的CEdit ( )成員函數(shù)一般沒(méi)有參數(shù),因此,我們可以簡(jiǎn)單地在編輯類 的.h文件中,作為嵌入函數(shù)實(shí)現(xiàn)這些消息處理函數(shù)。 /AFX_MSG(CWzdE
9、dit)afx_msg void OnRButtonDown(UINT nFlags, CPoint point);/AFX_MSGafx_msg void OnUndo(void)Undo(); afx_msg void OnCut(void)Cut(); afx_msg void OnCopy(void)Copy(); afx_msg void OnPaste(void)Paste(); afx_msg void OnDelete(void)Clear();afx_msg void OnSelectAll(void)SetSel(0,-1); DECLARE_MESSAGE_MAP()正如
10、你所看到的,只有Select All命令的需求復(fù)雜一些。 3) 關(guān)于編輯類的詳細(xì) ,請(qǐng)參見本節(jié)的“ 編輯控件類”。說(shuō)明 可以添加自己的命令到這個(gè)彈出式菜單中。為了使這個(gè)類完全被封裝,也可以考慮動(dòng)態(tài)地創(chuàng)建彈出式菜單,如例21所示的一樣,而不是依賴于外部菜單資源。 CD說(shuō)明 在CD上運(yùn)行該工程時(shí),單擊Test/Wzd菜單命令打開一個(gè)對(duì)話框。這個(gè)對(duì)話框包含一個(gè)編輯框,若在該編輯框上右擊鼠標(biāo)將顯示一個(gè)帶有剪貼、拷貝、粘貼等編輯命令的彈出式菜單。 編輯控件類 #if !defined(AFX_WZDEDIT_H 19B437E6_E7F5_11D1_A18D_DCB3C85EBD34 INCLUDED_
11、) #define AFX_WZDEDIT_H 19B437E6_E7F5_11D1_A18D_DCB3C85EBD34 INCLUDED_#if _MSC_VER = 1000#pragma once#endif / _MSC_VER = 1000/ WzdEdit.h : header file/ CWzdEdit windowclass CWzdEdit : public CEdit/ Construction public:CWzdEdit();/ Attributes public:/ Operations public:/ Overrides/ ClassWizard genera
12、ted virtual function overrides/AFX_VIRTUAL(CWzdEdit)/AFX_VIRTUAL/ Implementation public:virtual CWzdEdit();/ Generated message map functions protected:/AFX_MSG(CWzdEdit)afx_msg void OnRButtonDown(UINT nFlags, CPoint point);/AFX_MSGafx_msg void OnUndo(void)Undo(); afx_msg void OnCut(void)Cut(); afx_m
13、sg void OnCopy(void)Copy(); afx_msg void OnPaste(void)Paste(); afx_msg void OnDelete(void)Clear();afx_msg void OnSelectAll(void)SetSel(0,-1); DECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Developer Studio will insert additional declarations immediately/ before the previous line.#endif/ !defi
14、ned( AFX_WZDEDIT_H 19B437E6_E7F5_11D1_A18D_DCB3C85EBD34 INCLUDED_)/ WzdEdit.cpp : implementation file/#include stdafx.h #include wzd.h #include WzdEdit.h#ifdef _DEBUG#define new DEBUG_NEW #undef THIS_FILEstatic char THIS_FILE = FILE ; #endif/ CWzdEditCWzdEdit:CWzdEdit()CWzdEdit:CWzdEdit()BEGIN_MESSA
15、GE_MAP(CWzdEdit, CEdit)/AFX_MSG_MAP(CWzdEdit) ON_WM_RBUTTONDOWN()/AFX_MSG_MAP ON_COMMAND(ID_EDIT_UNDO, OnUndo) ON_COMMAND(ID_EDIT_CUT, OnCut) ON_COMMAND(ID_EDIT_COPY, OnCopy) ON_COMMAND(ID_EDIT_PASTE, OnPaste) ON_COMMAND(ID_EDIT_CLEAR, OnDelete)ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll) END_MESSAGE
16、_MAP()/ CWzdEdit message handlersvoid CWzdEdit:OnRButtonDown(UINT nFlags, CPoint point)CMenu menu;/ load a menu from the resources menu.LoadMenu(IDR_SELECTION_MENU);/ get a pointer to actual popup menu CMenu* pPopup = menu.GetSubMenu(0);/ enable/disable Undo commandUINT nUndo=(CanUndo() ? 0 : MF_GRA
17、YED);pPopup-EnableMenuItem(ID_EDIT_UNDO, MF_BYCOMMAND|nUndo);/ enable/disable selection commands int beg,end;GetSel(beg,end);UINT nSel=(beg!=end) ? 0 : MF_GRAYED);pPopup-EnableMenuItem(ID_EDIT_CUT, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_E
18、DIT_CLEAR, MF_BYCOMMAND|nSel);/ enable/disable Paste commandUINT nPaste=(:IsClipboardFormatAvailable(CF_TEXT) ? 0 : MF_GRAYED); pPopup-EnableMenuItem(ID_EDIT_PASTE, MF_BYCOMMAND|nPaste);/ pop up the menu CPoint pt; GetCursorPos(&pt);pPopup-TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); pPopup-De
19、stroyMenu();CEdit:OnRButtonDown(nFlags, point);14.2 例75剪切、拷貝、粘貼多信息文本數(shù)據(jù) 目標(biāo) 從多信息文本控件中剪切或拷貝文件,然后把它粘貼到控件的其他位置或者別的控件中。也可使用彈出式菜單進(jìn)行剪切和粘貼,如圖 14-2 所示。策略 與CEdit不同的是,多信息文本控件并未提供這種功能。我們將使用 CRichEditCtrl 類和CMenu類的成員函數(shù)創(chuàng)建彈出式菜單, 并把多信息編輯控件中的Cat和Paste菜單項(xiàng) 圖14-2 創(chuàng)建一個(gè)剪貼多信息文本的彈出式菜單 所有這些功能封裝到 CRichEditCtrl的派生類中。步驟 1. 設(shè)置應(yīng)用
20、程序 1) 支持多信息文本編輯功能的初始化工作必須與 MFC的其他控件類分離開來(lái)。在應(yīng)用程序類的InitInstance ( )函數(shù)中,添加下面所示的一行代碼。 BOOL CWzdApp:InitInstance()AfxInitRichEdit();: : :2) 使用菜單編輯器,創(chuàng)建一個(gè)如同圖 14-2所示的彈出式菜單的菜單資源。 3) 使用Class Wizard創(chuàng)建一個(gè)派生于 CRich Edit Ctrl的新多信息文本編輯控件,然后用ClassWizard添加一個(gè)WM-RBUTTONDOWN消息處理函數(shù)。 2. 裝入并啟用彈出式菜單 1) 在WM_RBUTTONDOWN消息處理函數(shù)中
21、,首先生成一個(gè)基于上步創(chuàng)建的菜單資源的彈出式菜單。 void CWzdRichEditCtrl:OnRButtonDown(UINT nFlags, CPoint point)CMenu menu;/ load a menu from the resources menu.LoadMenu(IDR_SELECTION_MENU);/ get a pointer to actual popup menuCMenu* pPopup = menu.GetSubMenu(0);一旦裝入,彈出式菜單中所有的菜單項(xiàng)都被啟用。但有時(shí)可能需要禁用某些菜單項(xiàng)以標(biāo)識(shí)當(dāng)前不可用。例如,若沒(méi)有任何東西需要取消的話,我
22、們必須禁用 Undo命令。 2) 使用CRichEditCtrl的CanUndo ( ),啟用或禁用Undo命令。 / enable/disable Undo commandUINT nUndo=(CanUndo() ? 0 : MF_GRAYED);pPopup-EnableMenuItem(ID_EDIT_UNDO, MF_BYCOMMAND|nUndo);3) 對(duì)于依賴于控件中所選的文本的命令,使用 CRichEditCtrl:GetSelectionType ( ),確定是否選擇了文本。若選擇類型為SEL_EMPTY,則Cut、Copy和Delete命令為無(wú)效。 UINT nSel=(
23、GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED); pPopup-EnableMenuItem(ID_EDIT_CUT, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_EDIT_CLEAR, MF_BYCOMMAND|nSel);4) 對(duì)于Paste命令,我們使用CRichEditCtrl:CanPaste ( )。 UINT nPaste=(CanPaste() ? 0 : MF_GRAYED
24、);pPopup-EnableMenuItem(ID_EDIT_PASTE, MF_BYCOMMAND|nPaste);5) 現(xiàn)在,可以顯示彈出式菜單,等待用戶選擇。 CPoint pt;GetCursorPos(&pt);pPopup-TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); pPopup-DestroyMenu();CRichEditCtrl:OnRButtonDown(nFlags, point);3. 處理彈出式菜單命令 1) 如果用戶單擊了一個(gè)命令,那么該命令將作為一條帶命令 ID的WM_COMMAND消息返回到窗口中??梢?/p>
25、使用菜單編輯器給該命令 ID賦值。為了處理這些命令,必須手工添加下列消息宏到消息映像中。 ON_COMMAND(ID_EDIT_UNDO, OnUndo) ON_COMMAND(ID_EDIT_CUT, OnCut) ON_COMMAND(ID_EDIT_COPY, OnCopy) ON_COMMAND(ID_EDIT_PASTE, OnPaste) ON_COMMAND(ID_EDIT_CLEAR, OnDelete) ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll)2) 因?yàn)轫憫?yīng)這些消息的CRichEditCtrl成員函數(shù)一般不帶參數(shù),因此我們可以簡(jiǎn)單
26、地在類的.h文件中,以嵌入函數(shù)實(shí)現(xiàn)這些消息處理。 /AFX_MSG(CWzdEdit)afx_msg void OnRButtonDown(UINT nFlags, CPoint point);/AFX_MSGafx_msg void OnUndo(void)Undo(); afx_msg void OnCut(void)Cut(); afx_msg void OnCopy(void)Copy(); afx_msg void OnPaste(void)Paste(); afx_msg void OnDelete(void)Clear();afx_msg void OnSelectAll(voi
27、d)SetSel(0,-1);DECLARE_MESSAGE_MAP()正如所看到的,只有Select All命令的需求復(fù)雜一些。 3) 關(guān)于編輯類的詳細(xì) ,參見本節(jié)的“ 多信息文本編輯控件類”。說(shuō)明 在MFC的某些版本中,可能會(huì)發(fā)現(xiàn)多信息文本編輯控件的 Cut、Copy和Paste函數(shù)導(dǎo)致應(yīng)用程序出錯(cuò)以至退出。然而,這個(gè)發(fā)行版本沒(méi)有這個(gè)問(wèn)題。 在這個(gè)彈出式菜單中理想的情況是應(yīng)包含 Font(字體)和Paragraph(段落)菜單命令。應(yīng)用多信息文本編輯控件類的成員函數(shù),也很容易實(shí)現(xiàn)這兩個(gè)命令處理函數(shù)。 CD說(shuō)明 在CD上運(yùn)行該工程時(shí),單擊Test/Wzd菜單命令以打開一個(gè)對(duì)話框。這個(gè)對(duì)話框包
28、含一個(gè)多信息文本編輯框,用右鍵單擊它,將顯示一個(gè)帶有剪切、拷貝、粘貼等編輯命令的彈出式菜單。 多信息文本編輯控件類 #if !defined( AFX_WZDRICHEDITCTRL_H 19B437E7_E7F5_11D1_A18D_DCB3C85EBD34 INCL UDED_)#define AFX_WZDRICHEDITCTRL_H 19B437E7_E7F5_11D1_A18D_DCB3C85EBD34 INCLUDED_#if _MSC_VER = 1000#pragma once#endif / _MSC_VER = 1000/ WzdRichEditCtrl.h : heade
29、r file/ CWzdRichEditCtrl windowclass CWzdRichEditCtrl : public CRichEditCtrl/ Construction public:CWzdRichEditCtrl();/ Attributes public:/ Operations public:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CWzdRichEditCtrl)/AFX_VIRTUAL/ Implementation public:virtual CWzdRich
30、EditCtrl();/ Generated message map functions protected:/AFX_MSG(CWzdRichEditCtrl)afx_msg void OnRButtonDown(UINT nFlags, CPoint point);/AFX_MSGafx_msg void OnUndo(void)Undo(); afx_msg void OnCut(void)Cut(); afx_msg void OnCopy(void)Copy(); afx_msg void OnPaste(void)Paste(); afx_msg void OnDelete(voi
31、d)Clear();afx_msg void OnSelectAll(void)SetSel(0,-1); DECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Developer Studio will insert additional declarations immediately/ before the previous line.#endif/ !defined( AFX_WZDRICHEDITCTRL_H 19B437E7_E7F5_11D1_A18D_DCB3C85EBD34 INCL UDED_)/ WzdRichEdit
32、Ctrl.cpp : implementation file/#include stdafx.h #include wzd.h#include WzdRichEditCtrl.h#ifdef _DEBUG#define new DEBUG_NEW #undef THIS_FILEstatic char THIS_FILE = FILE ; #endif/ CWzdRichEditCtrlCWzdRichEditCtrl:CWzdRichEditCtrl()CWzdRichEditCtrl:CWzdRichEditCtrl()BEGIN_MESSAGE_MAP(CWzdRichEditCtrl,
33、 CRichEditCtrl)/AFX_MSG_MAP(CWzdRichEditCtrl) ON_WM_RBUTTONDOWN()/AFX_MSG_MAP ON_COMMAND(ID_EDIT_UNDO, OnUndo) ON_COMMAND(ID_EDIT_CUT, OnCut) ON_COMMAND(ID_EDIT_COPY, OnCopy) ON_COMMAND(ID_EDIT_PASTE, OnPaste) ON_COMMAND(ID_EDIT_CLEAR, OnDelete)ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll) END_MESSAGE
34、_MAP()/ CWzdRichEditCtrl message handlersvoid CWzdRichEditCtrl:OnRButtonDown(UINT nFlags, CPoint point)CMenu menu;/ load a menu from the resources menu.LoadMenu(IDR_SELECTION_MENU);/ get a pointer to actual popup menu CMenu* pPopup = menu.GetSubMenu(0);/ enable/disable Undo commandUINT nUndo=(CanUnd
35、o() ? 0 : MF_GRAYED);pPopup-EnableMenuItem(ID_EDIT_UNDO, MF_BYCOMMAND|nUndo);/ enable/disable selection commandsUINT nSel=(GetSelectionType()!=SEL_EMPTY) ? 0 : MF_GRAYED); pPopup-EnableMenuItem(ID_EDIT_CUT, MF_BYCOMMAND|nSel); pPopup-EnableMenuItem(ID_EDIT_COPY, MF_BYCOMMAND|nSel); pPopup-EnableMenu
36、Item(ID_EDIT_CLEAR, MF_BYCOMMAND|nSel);/ enable/disable Paste commandUINT nPaste=(CanPaste() ? 0 : MF_GRAYED);pPopup-EnableMenuItem(ID_EDIT_PASTE, MF_BYCOMMAND|nPaste);/ pop up the menu CPoint pt; GetCursorPos(&pt);pPopup-TrackPopupMenu(TPM_RIGHTBUTTON, pt.x, pt.y, this); pPopup-DestroyMenu();CRichE
37、ditCtrl:OnRButtonDown(nFlags, point);14.3 例76 剪切、拷貝和粘貼二進(jìn)制數(shù)據(jù) 目標(biāo) 從用戶文檔中剪切或拷貝二進(jìn)制數(shù)據(jù),然后把它粘貼到文檔的其他位置或其他文檔中。 策略 本例基于如下假設(shè):用戶文檔是由若干專有的數(shù)據(jù)類組成。這些數(shù)據(jù)類可能包括圖形、圖像、圖標(biāo)及控件窗口等,這些數(shù)據(jù)類被繪制在應(yīng)用程序的視圖中。本例同時(shí)假定已經(jīng)實(shí)現(xiàn)了用鼠標(biāo)選 取一個(gè)或多個(gè)這些繪制對(duì)象的某種方法。本例所提供的功能包括剪切或拷貝一組選擇的數(shù)據(jù)類到 剪貼板上,因此這些對(duì)象可以被粘貼在文檔的其他位置或其他文檔中。 我們將使用串行化功能來(lái)剪切或拷貝所選數(shù)據(jù)到剪貼板中。第 13章已經(jīng)討論過(guò)
38、了串行化的問(wèn)題,那里主要用于從磁盤上調(diào)出或保存文檔到磁盤。然而,它同樣可以很完美地用于調(diào)出或保存文檔的數(shù)據(jù)到剪貼板上。我們將在新的選擇類中封裝剪切和粘貼功能。 步驟 1. 創(chuàng)建一個(gè)CSelection類 1) 使用Developer Studio創(chuàng)建一個(gè)派生于CObject的新類CSelection,單擊Insert/New Class菜單命令打開New Class對(duì)話框。然后選擇Class Type為Generic Class。 2) 在新類的構(gòu)造函數(shù)中,為文檔創(chuàng)建一個(gè)新的剪貼板類型。擁有這種類型剪貼板的文檔可以粘貼該剪貼板類型,但其他類型的文檔不行。 CWzdSelect:CWzdSele
39、ct()m_clipboardFormat = :RegisterClipboardFormat(CWzdInfo1);3) 按如下方式,添加一個(gè)Select ( )成員函數(shù)到新類中。Select ( )維護(hù)一系列的選項(xiàng)。若有新的選項(xiàng),則視圖類調(diào)用該函數(shù)。這個(gè)函數(shù)還跟蹤最后一次被選中的數(shù)據(jù)項(xiàng)。 void CWzdSelect:Select(CWzdInfo1 *pInfo)m_pActiveSelection=pInfo;if (!m_WzdSelectionList.Find(pInfo)m_WzdSelectionList.AddTail(pInfo);4) 在類中加入Serialize
40、( )函數(shù)。它的任務(wù)是串行化類的選項(xiàng)列表到剪貼板中。 void CWzdSelect:Serialize(CArchive& ar)int nCount; CObject:Serialize(ar); if(ar.IsStoring()nCount = m_WzdSelectionList.GetCount(); ar Serialize(ar);elsear nCount;while (nCount- 0)CWzdInfo1* pInfo = new CWzdInfo1; pInfo-Serialize(ar); m_WzdSelectionList.AddTail(pInfo);5) 添加
41、CutSelections ( ) 函數(shù)。既然剪切和拷貝非常類似,因此這個(gè)函數(shù)也只是簡(jiǎn)單地調(diào)用拷貝函數(shù)。我們將使用調(diào)用參數(shù)pList作為標(biāo)志若為NULL,則CopySelections ( ) 只是拷貝到剪貼板上。 void CWzdSelect:CutSelections(CList *pList)CopySelections(pList);CopySelections ( )函數(shù)既處理剪切又處理拷貝數(shù)據(jù)對(duì)象到剪貼板上。 2. 實(shí)現(xiàn)CopySelections ( )輔助函數(shù) 1) 添加CopySelections ( )函數(shù)。它的首要任務(wù)是當(dāng)沒(méi)有任何東西被選中時(shí)返回。 void CWzdS
42、elect:CopySelections(CList *pList /*=NULL*/)if (m_WzdSelectionList.GetCount() CacheGlobalData(m_clipboardFormat, file.Detach(); pDS-SetClipboard();4) 請(qǐng)記住我們是讓pList來(lái)標(biāo)識(shí)是剪切還是拷貝。為了從文檔中剪切所選內(nèi)容,視圖類會(huì)把一個(gè)指向文檔數(shù)據(jù)對(duì)象列表的指針賦給這個(gè)參數(shù)?,F(xiàn)在,我們把這些項(xiàng)目從文檔中刪除。 / if cutting, delete items in selection list from document if (pList)
43、for (POSITION pos=m_WzdSelectionList.GetHeadPosition();pos;)CWzdInfo1 *pInfo=m_WzdSelectionList.GetNext(pos);POSITION posx;if (posx=pList-Find(pInfo)pList-RemoveAt(posx);delete pInfo;5) 最后,清空選項(xiàng)列表。m_WzdSelectionList.RemoveAll(); m_pActiveSelection=NULL;3. 粘貼二進(jìn)制數(shù)據(jù) 1) 創(chuàng)建一個(gè)PasteClipboard ( )函數(shù),它以指向文檔數(shù)據(jù)對(duì)
44、象列表的指針為參數(shù)。這個(gè)函數(shù)的首要任務(wù)是刪除當(dāng)前所選中的所有內(nèi)容。 void CWzdSelect:PasteClipboard(CList *pList)/ reset selections m_WzdSelectionList.RemoveAll(); m_pActiveSelection=NULL;2) 其次,捆綁一個(gè)數(shù)據(jù)對(duì)象到剪貼板,并把數(shù)據(jù)串行化返回到選項(xiàng)列表。 COleDataObject object; object.AttachClipboard();CFile* pFile = object.GetFileData(m_clipboardFormat); if (!pFile
45、) return;CArchive ar(pFile, CArchive:load); Serialize(ar);ar.Close();delete pFile; /deletes file3) 最后,我們把這些選擇內(nèi)容加入到應(yīng)用程序文檔中。 for (POSITION pos=m_WzdSelectionList.GetHeadPosition();pos;)m_pActiveSelection=m_WzdSelectionList.GetNext(pos); pList-AddTail(m_pActiveSelection);該選擇類的詳細(xì) 參見本節(jié)的“ 選擇類”。 4. 實(shí)現(xiàn)新的選擇類
46、 1) 在用戶視圖類中嵌入CSelection類。 / WzdView.h xprivate:CWzdSelect m_select;2) 調(diào)用CSelection類的不同成員函數(shù)以處理選擇、剪切、拷貝和粘貼等菜單命令。 void CWzdView:OnSelect()m_select.Select(GetDocument()-GetInfo1List()-GetHead();void CWzdView:OnEditCut()m_select.CutSelections(GetDocument()-GetInfo1List();void CWzdView:OnUpdateEditCut(CCm
47、dUI* pCmdUI)pCmdUI-Enable(m_select.SelectionCount();void CWzdView:OnEditCopy()m_select.CopySelections();void CWzdView:OnUpdateEditCopy(CCmdUI* pCmdUI)pCmdUI-Enable(m_select.SelectionCount();void CWzdView:OnEditPaste()m_select.PasteClipboard(GetDocument()-GetInfo1List();void CWzdView:OnUpdateEditPast
48、e(CCmdUI* pCmdUI)pCmdUI-Enable(m_select.CanPasteClipboard();說(shuō)明 若想粘貼數(shù)據(jù)到文檔的某一特定位置處,則需要深入設(shè)計(jì) PasteClipboard ( )。對(duì)于圖形圖像,這樣做可能是不必要的,因?yàn)橐粋€(gè)圖形的 X、Y位置比其在文檔數(shù)據(jù)列表中位置重要得多。然而,當(dāng)粘貼數(shù)據(jù)到數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)項(xiàng)列表可能需一些特殊的考慮。 對(duì)于選擇圖形項(xiàng)目,可以使用MFC的CTracker類在視圖中突出顯示所選項(xiàng)目。 CD說(shuō)明 在CD上運(yùn)行該工程時(shí),首先在 WzdSelect.cpp.中的每個(gè)函數(shù)上設(shè)置斷點(diǎn)。然后單擊菜單上的Test/Wzd命令填充文檔。最后,
49、單擊不同的 EditZ菜單命令,觀察文檔數(shù)據(jù)的剪切、拷貝和粘貼。 選擇類 #ifndef WZDSELECT_H #define WZDSELECT_H#include afxtempl.h #include WzdInfo1.hclass CWzdSelect : public CObjectpublic:CWzdSelect();CWzdSelect();void Select(CWzdInfo1 *pInfo); int SelectionCount();void CutSelections(CList *pList);void CopySelections(CList *pList=NULL); BOOL CanPasteClipboard();void PasteClipboard(CList *pList); void Serialize(CArchi
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 未來(lái)工作場(chǎng)景中的AR與VR技術(shù)探索
- 基于教育心理學(xué)的醫(yī)療培訓(xùn)模式創(chuàng)新
- 全方位、多元化推進(jìn)全民胃腸道疾病知識(shí)的科學(xué)普及實(shí)踐和反思
- 教育科技融合啟航盛典見證新高度
- 全球鈾礦資源分布與核能產(chǎn)業(yè)技術(shù)創(chuàng)新與產(chǎn)業(yè)升級(jí)路徑研究報(bào)告
- 公交優(yōu)先戰(zhàn)略2025年城市交通擁堵治理的公共交通與城市社區(qū)建設(shè)協(xié)同報(bào)告
- ChEMBL22003-生命科學(xué)試劑-MCE
- 浙江工業(yè)職業(yè)技術(shù)學(xué)院《核醫(yī)學(xué)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 甘肅省武威五中學(xué)2025屆化學(xué)九上期末檢測(cè)模擬試題含解析
- 廣東信息工程職業(yè)學(xué)院《行為矯正學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 高校學(xué)科重塑路徑研究
- DB12T 1444-2025 博物館消防安全管理導(dǎo)則
- 硫化氫題庫(kù)及答案
- 2025年房地產(chǎn)銷售經(jīng)理季度工作總結(jié)及年度計(jì)劃
- 低壓培訓(xùn)課件
- 教師團(tuán)隊(duì)協(xié)作與溝通能力
- 保安公司薪酬管理制度
- 井蓋巡查管理制度
- GB/T 33490-2025展覽展示工程服務(wù)基本要求
- 2024年國(guó)能榆林化工有限公司招聘真題
- 消防總隊(duì)面試題目及答案
評(píng)論
0/150
提交評(píng)論