VisualC++教程(下)ppt.ppt_第1頁
VisualC++教程(下)ppt.ppt_第2頁
VisualC++教程(下)ppt.ppt_第3頁
VisualC++教程(下)ppt.ppt_第4頁
VisualC++教程(下)ppt.ppt_第5頁
已閱讀5頁,還剩219頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第5章菜單 工具欄和狀態(tài)欄 5 1 1文檔應用程序的MFC類結構 用MFCAppWizard exe 創(chuàng)建一個默認的單文檔應用程序Ex SDI 將項目工作區(qū)窗口切換到 ClassView 類視圖 頁面 可以看到構成Ex SDI應用程序框架的MFC類結構 如圖所示 再創(chuàng)建一個默認的多文檔應用程序Ex MDI 可以看到如圖所示的MFC類結構 5 1 2項目的文件組織 VisualC 6 0中 項目中所有的源文件都采用文件夾的方式進行管理的 每一個類的源代碼均保存同名的h和cpp文件 opt關于開發(fā)環(huán)境的參數(shù)文件 如工具格位置等信息 aps AppStudioFile 資源輔助文件 二進制格式 clwClassWizard信息文件 dsp DeveloperStudioProject 項目文件 plg編譯信息文件 mdp MicrosoftDevStudioProject 舊版本的項目文件 bsc用于瀏覽項目信息 map執(zhí)行文件的映像信息紀錄文件 pch Pre CompiledFile 預編譯文件 可以加快編譯速度 但是文件非常大 pdb ProgramDatabase 記錄程序有關的一些數(shù)據(jù)和調(diào)試信息 ncb無編譯瀏覽文件 nocompilebrowser 5 1 2項目的文件組織 還有相應的Debug 調(diào)試 Res 資源 等子文件夾 程序項目Win32Release版本 它與Release的區(qū)別在于 Debug版本的運行程序有相應的調(diào)試信息碼 而Release版本的運行程序沒有 但Release版本的運行程序經(jīng)過代碼的優(yōu)化 其程序的運行效率被最大提升 通過選擇 編譯 放置可遠行配置 菜單命令 在圖所示的對話框中 選擇 Ex SDI Win32Release 然后單擊 確定 按鈕 編譯后即可 5 2菜單 Windows程序都有各自的菜單 為了使Windows程序更容易操作 許多程序員對于菜單的設計都遵循下列一些規(guī)則 若選擇某菜單項會彈出一對話框 那么在該菜單項文本后有 2 若某項菜單有子菜單 那么在該菜單項文本后有 3 若菜單項需要助記符 則用括號將帶下劃線的字母括起來 助記符與Alt構成一個組合鍵 當按住 Alt 鍵不放 再敲擊 4 該字母時 對應的菜單項就會被選中 4 若某項菜單需要快捷鍵的支持 則一般將其列在相應菜單項文本之后 所謂 快捷鍵 是一個組合鍵 如Ctrl N 使用時是先按下 Ctrl 健不放 然后再按 N 鍵 任何時候按下快捷鍵 相應的菜單命令都會被執(zhí)行 5 1 1更改應用程序菜單 通過菜單編輯器直接修改菜單資源IDR MAINFRAME可以實現(xiàn)添加和修改應用程序菜單 如下示例過程 例Ex MenuSDI 更改應用程序菜單 1 創(chuàng)建一個默認的單文檔應用程序Ex MenuSDI 2 在項目工作區(qū)窗口中選擇ResourceView頁面 雙擊資 Menu 項中的IDR MAINFRAME 則菜單編輯器窗口出現(xiàn)在主界面的右邊 項目Ex MenuSDI相應的菜單資源在菜單編輯器窗口中顯示出來 3 按快捷鍵Ctrl R 彈出 插入資源 對話框 在資源類型中選定 Menu 如圖 5 1 1更改應用程序菜單 單擊 新建 按鈕 系統(tǒng)就會為應用程序添加一個新的菜單資源 并自動賦給它一個默認的標識符名稱 第一次為DR MENU1 以后依次為IDR MENU2 IDR MENU3 同時自動打開這個新的菜單資源 5 1 1更改應用程序菜單 在Menu資源的ID MENU1上右擊鼠標 從彈出的快捷菜單中選擇 Properties 命令 在這里可以重新指定菜單資源ID 設置菜單資源的語言和條件 這個條件用來決定菜單資源包含到哪個環(huán)境中 例如當指定條件為 DEBUG 則菜單資源只存在于Debug編譯環(huán)境中 5 1 1更改應用程序菜單 在菜單的空位置上雙擊鼠標左鍵 則出現(xiàn)它的屬性對話框 通過其屬性對話框為菜單ID MENU1添加一個頂層彈出菜單項 測試 T 并在該菜單下添加一個子菜單項 返回 R ID設為ID TEST RETURN 需要再次強調(diào)的是 符號 用來指定后面的字符是一個助記符 7 打開Ex MenuSDI程序菜單資源IDR MAINFRAME 在 查看 菜單的最后添加一個子菜單項 顯示測試菜單 M ID設為ID VIEW TEST 8 為CMainFrame類添加一個CMenu類型的成員變量m NewMenu CMenu類是用來處理菜單的一個MFC類 5 1 1更改應用程序菜單 按快捷鍵Ctrl W打開MFCClassWizard對話框 切換到MessageMaps頁面 從 Classname 列表中選擇CMainFrame 分別為菜單項ID VIEW TEST和ID TEST RETURN添加COMMAND消息映射 使用默認的消息映射函數(shù)名 并添中下列代碼 voidCMainFrame OnViewTest m NewMenu Detach 使菜單對象和菜單句柄分離m NewMenu LoadMenu IDR MENU1 SetMenu NULL 清除應用程序菜單SetMenu 5 2 2使用鍵盤快捷鍵 加速鍵也往往被稱為鍵盤快捷鍵 加速鍵也是一種資源 它的顯示 編輯過程和菜單相似 例如下面的示例過程是為前面兩個菜單ID VIEW TEST和ID TEST RETURN定義鍵盤快捷鍵 先打開上例的項目工作區(qū)窗口中Accelerator的資源項 雙擊IDR MAINFRAME 出現(xiàn)如圖的加速鍵資源列表 5 2 2使用鍵盤快捷鍵 2 建立一新的加速鍵 雙擊加速鍵列表的最下端的空行 彈出如圖所示的 AccelProperities 對話框 可設置的屬性如表所示 5 2 2使用鍵盤快捷鍵 3 在上述對話框中 選擇Ex MenuSDI添加的 顯示測試菜單 菜單項ID VIEW TEST作為要聯(lián)用的加速鍵的ID號 單擊 下一鍵 按鈕 并按下Ctrl 1作為此加速鍵的鍵值 4 按同樣的方法 為菜單項ID TEST RETURN添加加速鍵Ctrl 2 需要說明的是 為了使其他用戶能查看并使用該加速鍵 還需在相應的菜單項文本后面添加加速鍵內(nèi)容 例如 可將ID VIEW TEST菜單項的標題改成 顯示測試菜 M tCtrl 1 其 t 是將后面的 Ctrl 1 定位到一個表位 5 編譯運行并測試 當程序運行后 按 Ctrl 1 和 Ctrl 2將執(zhí)行相應的菜單命令 5 2 3菜單的編程控制 創(chuàng)建菜單CMenu類的CreateMenu和CreatePopupMenu分別用來創(chuàng)建一個菜單或子菜單框架 它們的原型如下 BOOLCreateMenu 產(chǎn)生一個空菜單BOOLCreatePopupMenu 產(chǎn)生一個空的彈出式子菜單2 裝入菜單資源將菜單資源裝入應用程序中 需調(diào)用CMenu成員函數(shù)LoadMenu 然后用SetMenu對應用程序菜單進行重新設置 BOOLLoadMenu LPCTSTRlpszResourceName BOOLLoadMenu UINTnIDResource 其中 lpszResourceName為菜單資源名稱 nIDResource為菜單資源ID號 5 2 3菜單的編程控制 3 添加菜單項當菜單創(chuàng)建后 用戶可以調(diào)用AppendMenu或InsertMenu函數(shù)來添加一些菜單項 AppendMenu是將菜單項添加在菜單的末尾處 而InsertMenu在菜單的指定位置處插入菜單項 并將后面的菜單項依次下移 BOOLAppendMenu UINTnFlags UINTnIDNewItem 0 LPCTSTRlpszNewItem NULL BOOLAppendMenu UINTnFlags UINTnIDNewItem constCBitmap pBmp BOOLInsertMenu UINTnPosition UINTnFlags UINTnIDNewItem 0 LPCTSTRlpszNewItem NULL BOOLInsertMenu UINTnPosition UINTnFlags UINTnIDNewItem constCBitmap pBmp 4 刪除菜單項調(diào)用DeleteMenu函數(shù)可將指定的菜單項刪除 需要注意的是 調(diào)用該函數(shù)后 不管菜單依附的窗口是否改變 都應調(diào)用CWnd DrawMenuBar使菜單更新 5 2 3菜單的編程控制 函數(shù)DeleteMenu的原型如下 BOOLDeleteMenu UINTnPosition UINTnFlags 其中 參數(shù)nPosition表示要刪除的菜單項位置 它由nFlags進行說明 若當nFlags為MF BYCOMMAND時 nPosition表示菜單項的ID號 而當nFlags為MF BYPOSITION時 nPosition表示菜單項的位置 第一個菜單項位置為0 5 獲取菜單項下面的四個CMenu成員函數(shù)分別獲得菜單的項數(shù) 菜單項的ID號 菜單項的文本內(nèi)容以及彈出式子菜單的句柄 UINTGetMenuItemCount const 該函數(shù)用來獲得菜單的菜單項數(shù) 調(diào)用失敗后返回 1 UINTGetMenuItemID intnPos const 該函數(shù)用來獲得由nPos指定菜單項位置 以0為基數(shù) 的菜單項的標識號 若nPos是SEPARATOR 則返回 1 5 2 3菜單的編程控制 intGetMenuString UINTnIDItem CString該函數(shù)用來獲得指定菜單的彈出式菜單的菜單句柄 該彈出式菜單位置由參數(shù)nPos指定 開始的位置為0 若菜單不存在 則創(chuàng)建一個臨時的菜單指針 下面的示例過程是利用CMenu成員函數(shù)向應用程序菜單中添加并處理一個菜單項 例Ex Menu 菜單項的編程控制 1 創(chuàng)建一個默認的單文檔應用程序Ex Menu 5 2 3菜單的編程控制 選擇 查看 菜單 ResourceSymbols 命令 資源符號 對話框 它能對應用程序中的資源標識符進行管理 程序中添加的菜單項需要一個標識值 最好用一個標識符來代替這個值 因此這里通過 資源符號 對話框來創(chuàng)建一個新的標識符 5 2 3菜單的編程控制 3 單擊 新建 按鈕 在名字 Name 框中輸入一個新的標識符ID NEW MENUITEM 在值 Value 框中 輸入該ID的值 系統(tǒng)要求用戶定義的ID值應大于15 0X000F 而小于61440 0XF000 保留默認的ID值101 單擊 確定 按鈕 NewSymbol 對話框 5 2 3菜單的編程控制 4 關閉 資源符號 對話框 在CMainFrame OnCreate函數(shù)中添加下列代碼 該函數(shù)在框架窗口創(chuàng)建時自動調(diào)用 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct CMenu pSysMenu GetMenu 獲得程序菜單指針CMenu pSubMenu pSysMenu GetSubMenu 1 獲得第二個子菜單的指針CStringStrMenuItem 新的菜單項 pSubMenu AppendMenu MF SEPARATOR 增加一水平分隔線pSubMenu AppendMenu MF STRING ID NEW MENUITEM StrMenuItem 在子菜單中增加一菜單項 允許使用ON UPDATE COMMAND UI或ON COMMAND的菜單項m bAutoMenuEnable FALSE 關閉系統(tǒng)自動更新菜單狀態(tài)SysMenu EnableMenuItem ID NEW MENUITEM MF BYCOMMAND MF ENABL 激活菜單項DrawMenuBar 更新菜單return0 5 2 3菜單的編程控制 5 用MFCClassWizard處理OnCommand消息并檢測用戶菜單的nID參數(shù) BOOLCMainFrame OnCommand WPARAMwParam LPARAMlParam wParam的低字節(jié)表示菜單 控件 加速鍵的命令IDif LOWORD wParam ID NEW MENUITEM MessageBox 你選中了新的菜單項 returnCFrameWnd OnCommand wParam lParam 6 編譯運行并測試 這樣當選擇菜單 編輯 新的菜單項 命令后 就會彈一個對話框 顯示 你選中了新的菜單項 消息 5 2 4使用快捷菜單 1 快捷菜單實現(xiàn)函數(shù)用資源編輯器和MFC庫的CMenu TrackPopupMenu函數(shù)可以很容易地創(chuàng)建這樣的菜單 CMenu TrackPopupMenu函數(shù)原型如下 BOOLTrackPopupMenu UINTnFlags intx inty CWnd pWnd LPCRECTlpRect NULL 該函數(shù)用來顯示一個浮動的彈出式菜單 其位置由各參數(shù)決定 nFlags表示菜單在屏幕顯示的位置以及鼠標按鈕標志 nFlags的值及其對其他參數(shù)的影響 5 2 4使用快捷菜單 2 示例本示例是在前面Ex SDI基礎上進行的 當顯示主菜單IDR MAINFRAME時 右擊鼠標彈出 查看 菜單的子菜單 當顯示菜單IDR MENU1時 右擊鼠標彈出 測試 菜單的子菜單 續(xù)例Ex MenuSDI 使用快捷菜單 1 打開前面的單文檔應用程序Ex MenuSDI 2 用MFCClassWizard在CMainFrame類添加WM CONTEXTMENU消息映射 3 編譯運行并測試 5 3 1使用工具欄編輯器 選擇菜單 文件 打開工作區(qū) 將前面的單文檔應用程序Ex MenuSDI調(diào)入 在項目工作區(qū)窗口中選擇ResourceView頁面 雙擊 Toolbar 項中的IDR MAINFRAME則工具欄編輯器出現(xiàn)在主界面的右邊 5 3 1使用工具欄編輯器 1 創(chuàng)建一個新的工具欄按鈕在新建的工具欄中 最右端總有一個空按鈕 雙擊該按鈕彈出其屬性對話框 在ID框中輸入其標識符名稱 其右端又出現(xiàn)一個新的空按鈕 2 移動一個按鈕在工具欄中移動一個按鈕 用鼠標左鍵點中它并拖動至相應位置即可 如果用戶拖動它離開工具欄位置 則此按鈕從工具欄中消失 3 刪除一個按鈕將選取中的按鈕拖離工具欄 則該按鈕就消失了 但若選中按鈕后 單擊Delete鍵并不能刪除一個按鈕 只是將按鈕中的圖形全部以背景色填充 5 3 1使用工具欄編輯器 4 在工具欄中插入空格在工具欄中插入空格有以下幾種情況 如果按扭前沒有任何空格 拖動該按鈕向右移動并當覆蓋相鄰按鈕的一半以上時 釋放鼠標鍵 則此按鈕前出現(xiàn)空格 如果按鈕前有空格而按鈕后沒有空格 拖動該按鈕向左移動并當按鈕的左邊界接觸到前面按鈕時 釋放鼠標鍵 則此按鈕后將出現(xiàn)空格 如果按鈕前后均有空格 拖動該按鈕向右移動并當接觸到相鄰按鈕時 則此按鈕前的空格保留 按鈕后的空格消失 相反 拖動該按鈕向左移動并當接觸到前一個相鄰按鈕時 則此按鈕前面的空格消失 后面的空格保留 5 工具欄按鈕屬性的設置雙擊某按鈕彈出其屬性對話框 如圖所示 5 3 1使用工具欄編輯器 工具欄按鈕屬性對話框 屬性對話框中的各項說明見表 5 3 2工具按鈕和菜單項相結合 工具按鈕和菜單項相結合是指當選擇工具按鈕或菜單命令時 操作結果是一樣的 Ex MenuSDI基礎上進行的 通過兩個工具按鈕分別顯示主菜單IDR MAINFRAME和菜單IDR MENU1 1 打開前面的單文檔應用程序Ex MenuSDI 2 利用工具欄編輯器設計兩個工具按鈕 位置內(nèi)容如圖所示 3 雙擊剛才設計的第一個工具按鈕 彈出該工具按鈕的屬性對話框 將該工具按鈕的ID號設為ID TEST RETURN 在提示框內(nèi)鍵入 返回應用程序主菜單 n返回主菜單 4 雙擊剛才設計的第二個工具按鈕 彈出該工具按鈕的屬性對話框 將該工具按鈕的ID號設為ID VEW TEST 在提示框內(nèi)鍵入 顯示測試菜單 n顯示測試菜單 5 3 2工具按鈕和菜單項相結合 設計的兩個工具欄按鈕 5 編譯運行并測試 程序運行后 將鼠標移至剛才設計的第一個工具按鈕處 這時在狀態(tài)欄上顯示出 返回應用程序主菜單 信息 若稍等片刻會彈出提示小窗口 顯示出 返回主菜單 字樣 單擊新添加的這兩個按鈕 會執(zhí)行相應的菜單命令 5 3 3多個工具欄的使用 在用MFCAppWizard創(chuàng)建的文檔應用程序中往往只有一個工具欄 但在實際應用中 常常需要多個工具欄 1 將項目工作區(qū)切換到ResourceView頁面 展開Toolbar 工具欄 資源 用鼠標單擊IDR MAINFRAME不松開 按下Ctrl鍵 移動鼠標將IDR MAINFRAME拖到Toolbar資源名稱上 復制了工具欄默認資源IDR MAINFRAME 復制后的資源標識系統(tǒng)自動設為IDR MAINFRAME1 2 右擊工具欄資源IDR MAINFRAME1 從彈出的快捷菜單中選擇Properties命令 如圖所示 將ID設為IDR TOOLBAR1 5 3 3多個工具欄的使用 3 雙擊IDR TOOLBAR1 打開工具欄資源 按圖刪除不要的工具按鈕 4 在CMainFrame類中添加一個成員變量m wndTestBar 變量類型為CToolBar CToolBar類封裝了工具欄的操作 5 在CMainFrame OnCreate函數(shù)中添加工具欄創(chuàng)建代碼 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct if CFrameWnd OnCreate lpCreateStruct 1 return 1 5 3 3多個工具欄的使用 intnRes m wndTestBar CreateEx this TBSTYLE FLAT WS CHILD WS VISIBLE CBRS TOP CBRS GRIPPER CBRS TOOLTIPS CBRS FLYBY CBRS SIZE DYNAMIC CRect 0 0 0 0 AFX IDW TOOLBAR 10 if nRes m wndTestBar LoadToolBar IDR TOOLBAR1 TRACE0 Failedtocreatetoolbar n return 1 failtocreate 在CMainFrame OnCreate函數(shù)中添加下面的工具欄創(chuàng)建代碼 m wndToolBar EnableDocking CBRS ALIGN ANY m wndTestBar EnableDocking CBRS ALIGN ANY EnableDocking CBRS ALIGN ANY DockControlBar 5 3 3多個工具欄的使用 AFX IDW TOOLBAR是系統(tǒng)內(nèi)部的工具欄子窗口標識 并將AFX IDW TOOLBAR 1的值表示默認的狀態(tài)欄子窗口標識 當打開 查看 菜單時 單擊 工具欄 菜單時 顯示或隱藏的工具欄不是原來的工具欄而是新添加的工具欄 我們需要重新指定工具欄子窗口的標識 并使其值等于AFX IDW TOOLBAR 10 6 編譯運行 結果如圖所示 5 3 3多個工具欄的使用 7 本例希望IDR TOOLBAR1工具欄和IDR MENU1菜單欄在一起 不是一開始就出現(xiàn) 還需要調(diào)用CFrameWnd類的成員函數(shù)ShowControlBar來使程序一開始運行時隱藏工具欄IDR TOOLBAR1 在CMainFrame OnCreate函數(shù)中添加下列代碼 intCMainFrame OnCreate LPCREATESTRUCTlpCreateStruct ShowControlBar 代碼中 ShowControlBa函數(shù)有三個參數(shù) 第一個用來指定要操作的工具欄或狀態(tài)欄指針 第二個是一個布爾型 為TRUE時表示顯示 否則表示隱藏 第三個用來表示是否延遲顯示或隱藏 為FALSE時表示立即顯示或隱藏 5 3 3多個工具欄的使用 8 在CMainFrame OnViewTest和CMainFrame OnTestReturn函數(shù)中添加下列代碼 voidCMainFrame OnViewTest ShowControlBar 關閉主工具欄 voidCMainFrame OnTestReturn ShowControlBar 顯示主工具欄 5 3 3多個工具欄的使用 編譯運行并測試 結果如圖所示 左邊是一開始運行的結果 右邊是單擊工具按鈕運行的結果 5 4 1狀態(tài)欄的定義 數(shù)組中的元素是一些標識常量或是字符串資源的ID號 默認的indicator數(shù)組包含了四個元素 ID SEPARATORID INDICATOR CAPSID INDICATOR NUMID INDICATOR SCRL分別顯示出CapsLock NumLock和ScrollLock這三個鍵的狀態(tài) 5 4 2狀態(tài)欄的常用操作 MFC的CStatusBar類封裝了狀態(tài)欄的大部分操作 1 增加和減少窗格狀態(tài)欄中的窗格分為信息行窗格和指示器窗格兩類 在狀態(tài)欄中增加一個信息行窗格 則只需在indicators數(shù)組中的適當位置中增加一個ID SEPARATOR標識即可 若在狀態(tài)欄中增加一個用戶指示器窗格 則在indicators數(shù)組中的適當位置增加一個在字符串表中定義過的資源ID 其字符串的長度表示用戶指示器窗格的大小 若狀態(tài)欄減少一個窗格 操作與增加相類似 需減少indicators數(shù)組元素即可 2 在狀態(tài)欄上顯示文本調(diào)用CStatusBar SetPaneText函數(shù)可以更新任何窗格 包括信息行窗格 中的文本 此函數(shù)原型描述如下 5 4 2狀態(tài)欄的常用操作 BOOLSetPaneText intnIndex LPCTSTRlpszNewText BOOLbUpdate TRUE lpszNewText表示要顯示的字符串 nIndex是表示設置的窗格索引 第一個窗格的索引為0 若bUpdate為TRUE 則系統(tǒng)自動更新顯示的結果 下面來看一個示例 例Ex SDIMouse 將鼠標在窗口客戶區(qū)的位置顯示在狀態(tài)欄上 1 創(chuàng)建一個默認的單文檔應用程序Ex SDIMouse 2 將項目工作區(qū)切換到ClassView頁面 展開CMainFrame所有項 雙擊構造函數(shù)CMainFrame 在文檔窗口中出現(xiàn)該函數(shù)的定義 在它的前面就是狀態(tài)欄數(shù)組的定義 3 將狀態(tài)欄indicators數(shù)組的定義改為下列代碼 staticUINTindicators ID SEPARATOR ID SEPARATOR 5 4 2狀態(tài)欄的常用操作 4 由于鼠標移動消息WM MOUSEMOVE在CMainFrame類映射后不起作用 只能映射到CEx SDIMouseView類中 CMainFrame類定義的成員變量 需要在CEx SDIMouseView類中添加訪問CMainFrame類的代碼 Ex SDIMouseView OnMouseMove函數(shù)代碼如下 voidCEx SDIMouseView OnMouseMove UINTnFlags CPointpoint CStringstr CMainFrame pFrame CMainFrame AfxGetApp m pMainWnd 獲得主窗口指針CStatusBar pStatus 5 4 2狀態(tài)欄的常用操作 5 將MainFrm h文件中的受保護變量m wndStatusBar變成公共變量 6 在Ex SDIMouseView cpp文件的開始處增加下列語句 include Ex SDIMouseView h include MainFrm h 7 編譯并運行 結果如圖所示 5 4 3改變狀態(tài)欄的風格 在MFC的CStatusBar類中 有兩個成員函數(shù)可以改變狀態(tài)欄風格 它們是 voidSetPaneInfo intnIndex UINTnID UINTnStyle intcxWidth voidSetPaneStyle intnIndex UINTnStyle 其中 參數(shù)nIndex表示要設置的狀態(tài)欄窗格的索引 nID用來為狀態(tài)欄窗格指定新的ID cxWidth表示窗格的像素寬度 nStyle表示窗格的風格類型 用來指定窗格的外觀 例如 將OnMouseMove函數(shù)修改為下列代碼 則結果如圖所示 voidCEx SDIMouseView OnMouseMove UINTnFlags CPointpoint CStringstr CMainFrame pFrame CMainFrame AfxGetApp m pMainWnd 獲得主窗口指針CStatusBar pStatus 獲得主窗口中的狀態(tài)欄指針 5 4 3改變狀態(tài)欄的風格 if pStatus pStatus SetPaneStyle 1 SBPS POPOUT str Format X d Y d point x point y 格式化文本pStatus SetPaneText 1 str 更新第二個窗格的文本 CView OnMouseMove nFlags point 狀態(tài)欄窗格的風格類型 習題 1 MFC單文檔和多文檔應用程序一般是由哪些類構成 2 什么是助記符 它是如何在菜單中定義的 3 若對同一個菜單用ClassWizard分別在視圖類和主框架窗口類CMainFrame都處理其COMMAND消息 并在它們的函數(shù)中添加相同的代碼 則當用戶選擇該菜單后 會有什么樣的結果 為什么 4 什么是鍵盤快捷鍵 它是如何定義的 5 什么是快捷菜單 用程序實現(xiàn)一般需要哪些步驟 6 狀態(tài)欄的作用是什么 狀態(tài)欄的窗格分為幾類 如何添加和減少相應的窗格 7 若狀態(tài)欄只有一個用戶定義的指示器窗格 其ID號為ID TEXT PANE 應如何定義 若當用戶在客戶區(qū)雙擊鼠標 在該窗格中顯示 雙擊鼠標 字樣 則應如何編程 8 上機練習本章的示例 6 1框架窗口 1 主框架窗口和文檔窗口 主框架窗口是應用程序直接放置在桌面 DeskTop 上的那個窗口 每個應用程序只能有一個主框架窗口 主框架窗口的標題欄上往往顯示應用程序的名稱 文檔窗口對于單文檔應用程序來說 它和主框架窗口是一致的 即主框架窗口就是文檔窗口 而對于多文檔應用程序 文檔窗口是主框架窗口的子窗口 多文檔應用程序的框架窗口 6 1框架窗口 2 窗口狀態(tài)的改變 MFCAppWizard為每一個文檔應用程序的框架窗口設置了相應的大小和位置 但默認的窗口狀態(tài)有時并不那么令人滿意 這時就需要對窗口狀態(tài)進行適當?shù)母淖?ShowWindow函數(shù)的參數(shù)值 6 1框架窗口 3 窗口風格的設置 6 1框架窗口 2 在MFCAppWizard中進行修改 選擇 文件 新建 菜單 在彈出的 新建 對話框中選擇 工程 標簽 選擇MFCAppWizard exe 的項目類型 指定項目工作文件夾位置 輸入項目名Ex SDI2 單擊 確定 按鈕 2 在向導的第一步中 將應用程序類型選為 單個文檔 新建 對話框 6 1框架窗口 3 單擊 下一個 按鈕 出現(xiàn)向導的第二步對話框 在這里用戶可以選擇程序中是否加入數(shù)據(jù)庫的支持 Step2 對話框 6 1框架窗口 4 單擊 下一個 按鈕 出現(xiàn)向導的第三步對話框 允許用戶在程序中加入復合文檔 自動化 ActiveX控件的支持 6 1框架窗口 5 單擊 下一個 按鈕 出現(xiàn)向導的第四步對話框 對話框的前幾項依次確定對浮動工具條 打印與預覽以及通信網(wǎng)絡等特性的支持 6 1框架窗口 6 單擊 高級 按鈕 出現(xiàn)下圖所示的對話框 分別用于文檔模板字串資源內(nèi)容和窗口風格的修改 6 1框架窗口 7 單擊 關閉 按鈕回到向導對話框 單擊 下一個 按鈕 出現(xiàn)如下圖所示的對話框 6 1框架窗口 8 單擊 下一個 按鈕 出現(xiàn)對話框 在這里 用戶可以對MFCAppWizard提供的默認類名 基類名 各個源文件名進行修改 6 1框架窗口 3 修改CREATESTRUCT結構 當窗口創(chuàng)建之前 系統(tǒng)自動調(diào)用PreCreateWindow虛函數(shù) 在用MFCAppWizard創(chuàng)建文檔應用程序結構時 MFC已為主窗口或文檔窗口類自動重載了該虛函數(shù) BOOLCMainFrame PreCreateWindow CREATESTRUCT 6 1框架窗口 4 使用ModifyStyle和ModifyStyleEx CWnd類中的成員函數(shù)ModifyStyle和ModifyStyleEx也可用來更改窗口的風格 其中ModifyStyleEx還可更改窗口的擴展風格 6 1框架窗口 5 改變窗口的大小和位置 用CWnd類的成員函數(shù)SetWindowPos或MoveWindow可以改變窗口的大小和位置 SetWindowPos是一個非常有用的函數(shù) 它不僅可以改變窗口的大小 位置 而且還可以改變所有窗口在堆棧排列的次序 Z次序 這個次序是根據(jù)它們在屏幕出現(xiàn)的先后來確定的 6 2文檔模板 1 文檔模板類 文檔應用程序框架結構是在程序運行一開始構造的 在單文檔應用程序 設項目名為Ex SDI 的應用程序類InitInstance函數(shù)中 可以看到這樣的代碼 BOOLCEx SDI2App InitInstance CSingleDocTemplate pDocTemplate pDocTemplate newCSingleDocTemplate IDR MAINFRAME 資源ID RUNTIME CLASS CEx SDIDoc 文檔類 RUNTIME CLASS CMainFrame 主框架窗口類 RUNTIME CLASS CEx SDIView 視圖類 AddDocTemplate pDocTemplate returnTRUE 6 2文檔模板 2 文檔模板字符串資源 在MFCAppWizard創(chuàng)建的應用程序資源中 許多資源標識符都是IDR MAINFRAME 這就意味著這些具有同名標識的資源將被框架自動加載到應用程序中 6 2文檔模板 3 使用多個文檔類型 用MFCAppWizard exe 創(chuàng)建一個默認的多文檔應用程序項目Ex MDIDemo 2 打開項目工作區(qū)窗口中StringTable的資源項 雙擊該項下的StringTable 打開字符串表資源 6 2文檔模板 3 雙擊IDR MAINFRAME列表項 彈出字符串屬性對話框 將其標題修改為 多個文檔類型實例 4 雙擊IDR EX MDITYPE列表項 在字符串屬性對話中 將其內(nèi)容修改 5 拖動字符串表編輯器右邊的滾動塊 直到出現(xiàn)最后一個字符串項 雙擊最后的空行 在字符串屬性對話框中將ID設為 修改IDR MAINFRAME字符串標題 添加新的字符串項 6 2文檔模板 6 按快捷鍵Ctrl W 打開MFCClassWizard 單擊 AddClass 按鈕 從彈出的菜單中選擇New 出現(xiàn) NewClass 對話框 在Name框中輸入類名COtherDoc 在Baseclass組合框中選擇基類CDocument 7 單擊 OK 按鈕 新的文檔類COtherDoc就添加到Ex MDIDemo項目中 8 修改CEx MDIDemoApp InitInstance函數(shù)代碼 9 在類CEx MDIDemoApp源代碼文件Ex MDIDemo cpp的開始處 添加包含前面創(chuàng)建的兩個派生類的頭文件 添加新的文檔類COtherDoc 6 2文檔模板 編譯運行并測試 多類型文檔窗口顯示 文檔類型新建對話框 文件打開對話框中的文件類型 6 3 1MFC文檔讀寫機制 1 創(chuàng)建空文檔 文檔應用程序運行到應用程序類的InitInstance函數(shù)時 它會在調(diào)用了AddDocTemplate函數(shù)之后 通過CWinApp ProcessShellCommand間接調(diào)用CWinApp的另一個非常有用的成員函數(shù)OnFileNew 并依次完成工作 2 打開文檔 當MFCAppWizard創(chuàng)建文檔應用程序時 它會自動將 文件 File 菜單中的 打開 Open 命令 ID號為ID FILE OPEN 映射到CWinApp的OnFileOpen成員函數(shù) 3 保存文檔 當MFCAppWizard創(chuàng)建應用程序時 它會自動將 文件 File 菜單中的 保存 Save 命令與文檔類CDocument的OnFileSave函數(shù)在內(nèi)部關聯(lián)起來 但用戶在程序框架中看不到相應的代碼 6 3 1MFC文檔讀寫機制 4 關閉文檔 1 若文檔內(nèi)容已被修改 則彈出一個消息對話框 詢問用戶是否需要將文檔保存 2 調(diào)用CDocument OnCloseDocument虛函數(shù) 關閉所有與該文檔相關聯(lián)的文檔窗口及相應的視圖 調(diào)用文檔類CDocument的DeleteContents清除文檔數(shù)據(jù) 5 文檔讀寫操作 打開和保存文檔時 系統(tǒng)都會自動調(diào)用Serialize函數(shù) 事實上 MFCAppWizard在創(chuàng)建文檔應用程序框架時已在文檔類中重載了Serialize函數(shù) 通過在該函數(shù)中添加代碼可達到實現(xiàn)數(shù)據(jù)序列化的目的 ar中可以使用 運算符的數(shù)據(jù)類型 1 簡單數(shù)組集合類的構造及元素的添加 對簡單數(shù)組集合類構造的方法都是一樣的 均是使用各自的構造函數(shù) 它們的原型如下 CByteArrayCByteArray CDWordArrayCDWordArray CObArrayCObArray CPtrArrayCPtrArray CStringArrayCStringArray CUIntArrayCUIntArray CWordArrayCWordArray 6 3 2 使用簡單數(shù)組集合類 6 3 2 使用簡單數(shù)組集合類 2 訪問簡單數(shù)組集合類的元素 在MFC中 既可以使用GetAt函數(shù) 也可使用 操作符 CObArray operator 示例CObArrayarray CAge pa CAge是一個用戶類array Add newCAge 21 添加一個元素array Add newCAge 40 再添加一個元素pa CAge array 0 獲取元素0ASSERT pa CAge 21 array 0 newCAge 30 替換元素0 ASSERT CAge array 0 CAge 30 CObArray GetAt示例CObArrayarray array Add newCAge 21 元素0array Add newCAge 40 元素1ASSERT CAge array GetAt 0 CAge 21 6 3 2 使用簡單數(shù)組集合類 3 刪除簡單數(shù)組集合類的元素 1 使用函數(shù)GetSize和整數(shù)下標值訪問簡單數(shù)組集合類中的元素 2 若對象元素是在堆內(nèi)存中創(chuàng)建的 則使用delete操作符刪除每一個對象元素 3 調(diào)用函數(shù)RemoveAll刪除簡單數(shù)組集合類中的所有元素 CObArrayarray CAge pa1 CAge pa2 array Add pa1 newCAge 21 array Add pa2 newCAge 40 ASSERT array GetSize 2 for inti 0 i array GetSize i deletearray GetAt i array RemoveAll 下面代碼過程是一個CObArray的刪除示例 6 3 3 建立可序列化的類 使一個類可序列化的目的是使其具有CArchive的序列化功能 即可以在文檔類中的Serialize函數(shù)中直接通過CArchive引用變量進行該類數(shù)據(jù)的讀寫操作 在MFC中 一個可序列化的類必須是CObject的一個派生類 且在類聲明中 需要包含DECLARE SERIAL宏調(diào)用 而在類的實現(xiàn)文件中包含IMPLEMENT SERIAL宏調(diào)用 這個宏有三個參數(shù) 前兩個參數(shù)分別表示類名和基類名 第三個參數(shù)表示應用程序的版本號 最后還需要重載Serialize函數(shù) 使該類的數(shù)據(jù)成員進行相關序列化操作 6 3 4 文檔序列化示例 添加用于學生基本信息記錄輸入的對話框 對話框資源的復制 學生基本信息輸入對話框 6 3 4 文檔序列化示例 2 添加并處理菜單項 在Ex StudentDoc cpp文件的開始處 添加包含CStuInfoDlg類的頭文件包含 2 在菜單資源的主菜單中添加頂層菜單項 學生基本信息 S 在該頂層菜單項中添加子菜單 添加 A ID STUINFO ADD 3 用MFCClassWizard為CEx StudentDoc類添加處理菜單項ID STUINFO ADD的COMMAND消息 并添加代碼 voidCEx StudentDoc OnStuinfoAdd CStuInfoDlgdlg if dlg DoModal IDOK return 添加記錄CStudentInfo pStudent newCStudentInfo dlg m strName dlg m strNo dlg m bMale dlg m tBirth dlg m strSpecial m stuObArray Add pStudent SetModifiedFlag 設置文檔更改標志UpdateAllViews NULL 更新視圖 6 3 4 文檔序列化示例 3 修改CEx StudentDoc類代碼 在Ex StudentDoc h文件的classCEx StudentDoc前面 添加包含CStudentInfo類的頭文件 2 為CEx StudentDoc類添加下列成員變量 public CObArraym stuObArray 對象集合類對象 3 為CEx StudentDoc類添加成員函數(shù)CStudentInfo GetStudentInfoAt intnIndex 用來獲取m stuObArray中指定索引號的CStudentInfo類指針 為CEx StudentDoc類添加成員函數(shù)intGetAllRecNum void 用于獲取集合類中對象的個數(shù)其代碼如下 intCEx StudentDoc GetAllRecNum returnm stuObArray GetSize 6 3 4 文檔序列化示例 5 在CEx StudentDoc類析構函數(shù) CEx StudentDoc添加下列代碼 CEx StudentDoc CEx StudentDoc intnIndex GetAllRecNum while nIndex deletem stuObArray GetAt nIndex 刪除并釋放對象的內(nèi)存空間m stuObArray RemoveAll 6 在CEx StudentDoc Serialize函數(shù)中添加下列代碼 voidCEx StudentDoc Serialize CArchive 6 3 4 文檔序列化示例 4 修改CEx StudentView類代碼 voidCEx StudentView OnDraw CDC pDC CEx StudentDoc pDoc GetDocument ASSERT VALID pDoc inty 0 for intnIndex 0 nIndexGetAllRecNum nIndex pDoc GetStudentInfoAt nIndex Display y pDC y 16 將CEx StudentView OnDraw代碼修改 用來將所有的學生基本信息記錄顯示在視圖中 6 3 4 文檔序列化示例 5 修改文檔的字串資源打開文檔的字串資源IDR MAINFRAME 將其內(nèi)容修改為 6 編譯運行并測試 Ex Student運行結果 Ex Student nStudentRec nEx Stu n記錄文件 rec n rec nExStudent Document nEx StuDocument 6 3 5 使用CFile類 文件的打開和關閉 1 構造一個不帶指定任何參數(shù)的CFile對象 2 調(diào)用成員函數(shù)Open并指定文件路徑以及文件標志 CFile類的文件訪問方式 6 3 5 使用CFile類 2 文件的讀寫和定位 CFile還支持獲取文件狀態(tài) 包括文件是否存在 創(chuàng)建與修改的日期和時間 邏輯大小和路徑等 rStatus用來存放文件狀態(tài)信息 它是一個CFileStatus結構類型 該結構具有下列成員 CTimem ctime文件創(chuàng)建日期和時間CTimem mtime文件最后一次修改日期和時間CTimem atime文件最后一次訪問日期和時間LONGm size文件的邏輯大小字節(jié)數(shù) 就像DOS命令中DIR所顯示的大小BYTEm attribute文件屬性charm szFullName MAX PATH 文件名 3 CFile和CArchive類之間的關聯(lián) 可以將一個外部磁盤文件和一個CArchive對象關聯(lián)起來 6 4 1 一般視圖類的使用 MFC中的CView類及其它的派生類封裝了視圖的各種不同的功能 它們?yōu)橛脩魧崿F(xiàn)最新的Windows特性提供了很大的便利 CView的派生類及其功能描述 6 4 1 一般視圖類的使用 1 CEditView類 CEditView類對象是一種視圖 像CEdit類一樣 它也提供窗口編輯控制功能 可以用來執(zhí)行簡單文本操作 如打印 查找 替換 剪貼板的剪切 復制和粘貼等 更改CEx EditView的基類 Ex Edit運行結果 6 4 1 一般視圖類的使用 2 CRichEditView類 CRichEditView類使用了復文本編輯控件 因此它支持混合字體格式和更大數(shù)據(jù)量的文本 CRichEditView類被設計成與CRichEditDoc和CRichEditCntrItem類一起使用 它們可實現(xiàn)一個完整的ActiveX包容器應用程序 3 CFormView類 1 添加并設計表單 NewForm 對話框 添加表單后的開發(fā)環(huán)境 6 4 1 一般視圖類的使用 2 完善代碼并測試 Ex Form運行結果 Ex Form最終運行結果 3 CHtmlView類 CHtmlView類是在文檔視圖結構中提供WebBrowser控件的功能 4 CScrollView類 5 列表視圖 CScrollView類不僅能直接支持視圖的滾動操作 而且還能管理視口的大小和映射模式 并能響應滾動條消息 鍵盤消息以及鼠標滾輪消息 列表視圖類CListView按照MFC文檔視圖結構封裝了列表控件CListCtrl的功能 6 樹視圖 6 4 2 文檔與視圖的相互作用 CView GetDocument函數(shù) 視圖對象只有一個與之相聯(lián)系的文檔對象 它所包含的GetDocument函數(shù)允許應用程序由視圖得到與之相關聯(lián)的文檔 2 CDocument UpdateAllViews函數(shù) 如果文檔中的數(shù)據(jù)發(fā)生了改變 那么所有的視圖都必須被通知到 以便它們能夠對所顯示的數(shù)據(jù)進行相應的更新 3 CView OnUpdate函數(shù) 這是一個虛函數(shù) 4 CView OnInitialUpdate函數(shù) 當應用程序被啟動時 或當用戶從 文件 菜單中選擇了 新建 或 打開 時 該CView虛函數(shù)都會被自動調(diào)用 5 CDocument OnNewDocument函數(shù) 在文檔應用程序中 當用戶從 文件 菜單中選擇 新建 命令時 框架將首先構造一個文檔對象 然后調(diào)用該虛函數(shù) 6 4 3 應用程序對象指針的互調(diào) 從文檔類中獲取視圖對象指針 在文檔類中有一個與其關聯(lián)的各視圖對象的列表 并可通過CDocument類的成員函數(shù)GetFirstViewPo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論