vc學習教程界面設計.ppt_第1頁
vc學習教程界面設計.ppt_第2頁
vc學習教程界面設計.ppt_第3頁
vc學習教程界面設計.ppt_第4頁
vc學習教程界面設計.ppt_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章框架窗口界面設計,6.1框架窗口 6.2菜單 6.3工具欄 6.4狀態(tài)欄 6.5交互對象的動態(tài)更新 6.6圖標和光標,6.1框架窗口,6.1.1單文檔和多文檔程序框架窗口 文檔應用程序的MFC類結構 如圖是單文檔應用程序Ex_SDI和多文檔應用程序Ex_MDI的MFC類結構。,CAboutDlg是每一個應用程序框架都有的,用來顯示本程序的有關信息。 CEx_SDIApp和CEx_MDIApp是應用程序類,是從CWinApp類派生而來,負責應用程序創(chuàng)建、運行和終止,每一個應用程序都需要這樣的類。 CEx_SDIDoc和CEx_MDIDoc是文檔類,它們是從CDocument類派生而來,負責

2、應用程序文檔數據管理。 CEx_SDIView和CEx_MDIView是視圖類,它們既可以從基類CView派生,也可以從CView派生類派生,負責數據的顯示、繪制和其他用戶交互。 CMainFrame類是用來負責主框架窗口的顯示和管理,包括工具欄和狀態(tài)欄等界面元素的初始化。對于單文檔應用程序來說,主框架窗口類是從CFrameWnd派生而來的,而對于多文檔應用程序程序,主框架窗口是從CMDIFrameWnd派生的。,6.1框架窗口,CChildFrame類是從CMDIChildWnd派生而來,專門用來管理多文檔應用程序中的文檔窗口。無論是CMDIChildWnd還是CMDIFrameWnd類,它

3、們都是從CFrameWnd派生而來的。 對于基于對話框的應用程序,一般有CAboutDlg類、應用程序類和對話框類。 上述MFC類之間的繼承和派生關系如圖6.2所示。,6.1框架窗口,項目的文件組織 項目中源文件都是采用文件夾的方式進行管理的,將項目名作為文件夾名,此文件夾下包含源程序代碼文件、項目文件以及項目工作區(qū)文件等。每一個類的源代碼均保存同名的h和cpp文件。其他一些文件類型的含義: .opt 關于開發(fā)環(huán)境的參數文件,如工具條位置等信息 .aps(AppStudio File)資源輔助文件,二進制格式 .clw ClassWizard信息文件 .dsp(DeveloperStudio

4、Project)項目文件 .plg 編譯信息文件 .mdp(Microsoft DevStudio Project)舊版本的項目文件 .bsc 用于瀏覽項目信息 .map 執(zhí)行文件的映像信息紀錄文件 .pch(Pre-Compiled File)預編譯文件,可以加快編譯速度,但是文件非常大 .pdb(Program Database)記錄程序有關的一些數據和調試信息 .ncb 無編譯瀏覽文件(no compile browser) 還有相應的Debug(調試)、Res(資源)等子文件夾。用應用程序向導創(chuàng)建項目時,系統(tǒng)自動為項目創(chuàng)建Win32 Debug版本的運行程序,并使用相應的默認配置。程序

5、編連后,用于該項目的可執(zhí)行文件以及其他調試的信息文件都安放在Debug文件夾中。 程序項目有一個Win32 Release版本,與Release的區(qū)別在于:Debug版本的運行程序有相應的調試信息碼,Release版本的運行程序沒有,但Release版本的運行程序經過代碼的優(yōu)化,其程序的運行效率被最大提升。 選擇“編譯”“配置”菜單命令,在“配置”對話框將項目設置成Win32 Release版本。,6.1框架窗口,主框架窗口和文檔窗口 主框架窗口是直接放置在桌面(DeskTop)上的那個窗口,每個應用程序只能有一個主框架窗口。主框架窗口負責管理各個用戶交互對象并根據用戶操作相應地創(chuàng)建或更新文檔

6、窗口及其視圖。 文檔窗口對SDI程序來說,和主框架窗口是一致的,主框架窗口就是文檔窗口;對于MDI程序,文檔窗口是主框架窗口的子窗口,如圖。 文檔窗口一般都有相應的可見邊框,它的客戶區(qū)(除了窗口標題欄、邊框外的區(qū)域)是由相應的視圖來構成的,因此可以說視圖是文檔窗口內的子窗口。文檔窗口時刻跟蹤當前處于活動狀態(tài)的視圖的變化,并將用戶或系統(tǒng)產生的消息傳遞給當前活動視圖。,6.1框架窗口,6.1.2窗口狀態(tài)的改變 MFC AppWizard為每個窗口設置了相應的大小和位置。 運行程序時,會自動調用框架內部的WinMain函數,并自動查找該應用程序類的全局變量theApp,然后自動調用用戶應用程序類的虛

7、函數InitInstance,該函數會進一步調用相應的函數來完成主窗口的構造和顯示工作,代碼: BOOL CEx_SDIApp:InitInstance() m_pMainWnd-ShowWindow(SW_SHOW);/ 顯示窗口 m_pMainWnd-UpdateWindow();/ 更新窗口 return TRUE; m_pMainWnd是主框架窗口指針變量,ShowWindow是CWnd類的成員函數,用來按指定的參數顯示窗口。,6.1框架窗口,通過指定ShowWindow函數的參數值可以改變改變窗口顯示狀態(tài)。例如下面的代碼是將窗口的初始狀態(tài)設置為“最小化”: BOOL CEx_SDIA

8、pp:InitInstance() . m_pMainWnd-ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd-UpdateWindow(); return TRUE; ,6.1框架窗口,6.1.3窗口風格的設置 窗口風格 通常有一般和擴展兩種形式??稍诤瘮礐Wnd:Create或CWnd:CreateEx參數中指定,CreateEx函數可同時支持以上兩種風格,CWnd:Create只能指定窗口的一般風格。控件和對話框的窗口風格可直接通過其屬性對話框來設置。 除了上述風格外,框架窗口還有以下三個自己的風格。它們都可以在PreCreateWindow重載函數的CR

9、EATESTRUCT結構中指定。 FWS_ADDTOTITLE 該風格指定相關的信息如文檔名添加到框架窗口標題的后面。 FWS_PREFIXTITLE 該風格使得框架窗口標題中的文檔名顯示在應用程序名之前。 FWS_SNAPTOBARS 該風格用來調整窗口的大小,使它剛好包含了框架窗口中的控制欄。,6.1框架窗口,在MFC AppWizard中進行修改 例Ex_SDI 在向導中修改窗口風格。 (1)選擇“文件”“新建”,選擇“工程”,選擇MFC AppWizard(exe)的項目類型,指定項目工作文件夾位置,輸入項目名Ex_SDI,單擊確定按鈕。 (2) 在向導的第一步中,將應用程序類型選為“

10、單個文檔”(SDI)。 (3) 單擊下一個,如圖,可以選擇程序中是否加入數據庫的支持。 (4)單擊下一個,出現向導的第三步對話框,如圖,允許在程序中加入復合文檔、自動化、ActiveX控件的支持。,6.1框架窗口,(5)單擊下一個,如圖,對話框的前幾項依次確定對浮動工具條、打印與預覽以及通信網絡等特性的支持。對話框的最后兩項是最近文件列表數目的設置(默認時為4)和一個高級按鈕 。,6.1框架窗口,(6)在第四步對話框中,單擊高級,如圖,分別用于文檔模板字串資源內容和窗口風格的修改。,6.1框架窗口,(7)單擊關閉,單擊下一個,如圖??蛇x擇:應用程序的主窗口是MFC標準風格還是窗口左邊有切分窗口

11、的瀏覽器風格,在源文件中是否加入注釋用來引導用戶編寫程序代碼,是使用動態(tài)鏈接庫(DLL)還是靜態(tài)鏈接庫。 (8)單擊下一個按鈕,出現如圖6.9所示的對話框。在這里,用戶可以對MFC AppWizard提供的默認類名、基類名、各個源文件名進行修改。,6.1框架窗口,(9)單擊完成,單擊確定,回到主界面。 在向導中作出的選擇,有部分內容反映在CEx_SDIApp:InitInstance函數中,代碼: BOOL CEx_SDIApp:InitInstance() / 若用戶在MFC AppWizard的第三步中,選中了“ActiveX Controls”, / 則表示所創(chuàng)建的應用程序支持Activ

12、eX控件 AfxEnableControlContainer(); / 若用戶在MFC AppWizard的第四步中,選中了“3D controls” / 則表示所創(chuàng)建的應用程序支持3D控件風格 #ifdef _AFXDLL Enable3dControls();/ 使用MFC動態(tài)鏈接庫的3D控件 #else Enable3dControlsStatic();/ 使用MFC靜態(tài)鏈接庫的3D控件 #endif / 在Windows系統(tǒng)注冊表中登記應用程序的主鍵值,以便將一些與應用程序 / 相關的參數存放在該主鍵值下 SetRegistryKey(_T(Local MFC AppWizard-Ge

13、nerated Applications); / 從注冊表中調入應用程序的一些標準參數值,其中包括最近文件列表的文件名 LoadStdProfileSettings(); return TRUE; ,6.1框架窗口,修改CREATESTRUCT結構 窗口創(chuàng)建前,自動調用PreCreateWindow虛函數。用MFC AppWizard創(chuàng)建文檔應用程序結構時,MFC已為主窗口或文檔窗口類自動重載了該虛函數??梢栽诖撕瘮抵型ㄟ^修改CREATESTRUCT結構來設置窗口的絕大多數風格。 對于多文檔應用程序,文檔窗口的風格可用下列的代碼更改: BOOL CChildFrame:PreCreateWin

14、dow(CREATESTRUCT ,6.1框架窗口,使用ModifyStyle和ModifyStyleEx ModifyStyleEx可更改窗口的擴展風格。兩個函數具有相同的參數,含義。 BOOL ModifyXXXX( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 ); 參數dwRemove指定需要刪除的風格,dwAdd指定需要增加的風格,nFlags表示SetWindowPos的標志。 框架窗口設定擴展風格只能通過調用ModifyStyle函數來進行。例如用MFC ClassWizard為一個多文檔應用程序Ex_MDI的子文檔窗口類CChildF

15、rame添加OnCreateClient消息處理,并增加下列代碼: BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) ModifyStyle(0, WS_VSCROLL, 0); return CMDIChildWnd:OnCreateClient(lpcs, pContext);,6.1框架窗口,6.1.4改變窗口的大小和位置 CWnd類的成員函數SetWindowPos或MoveWindow可以改變窗口的大小和位置。SetWindowPos可以改變窗口的大小、位置,還可以改變所有窗口

16、在堆棧排列的次序(Z次序),這個次序是根據它們在屏幕出現的先后來確定的。 BOOL SetWindowPos( const CWnd* pWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags ); 參數pWndInsertAfter表示窗口對象指針,下列預定義窗口對象的地址: wndBottom將窗口放置在Z次序中的底層 wndTop 將窗口放置在Z次序中的頂層 wndTopMost 設置最頂窗口 wndNoTopMost 將窗口放置在所有最頂層的后面,若此窗口不是最頂窗口,則此標志無效。 x和y表示窗口新的左上角坐標,cx和cy分

17、別表示表示窗口新的寬度和高度,nFlags表示窗口新的大小和位置方式。,6.1框架窗口,函數CWnd:MoveWindow也可用來改變窗口的大小和位置,必須在MoveWindow函數中指定窗口的大小。 void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE ); void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE ); 參數x和y表示窗口新的左上角坐標,nWidth和nHeight表示窗口新的寬度和高度,bRepaint用于指定窗口是否重繪,

18、lpRect表示窗口新的大小和位置。 例如,在CEx_SDIApp:InitInstance中return TRUE語句之前添加下列代碼,可以使主框架窗口移動到屏幕的(100,100)處: / 若使用SetWindowPos函數,則可以有 m_pMainWnd-SetWindowPos(NULL,100,100,0,0,SWP_NOSIZE|SWP_NOZORDER); / 或使用MoveWindow函數,則有 CRect rcWindow; m_pMainWnd-GetWindowRect(rcWindow); m_pMainWnd-MoveWindow(100,100,rcWindow.W

19、idth(),rcWindow.Height(),TRUE); CRect是一個矩形類,GetWindowRect是一個CWnd類的成員函數,用來獲取窗口在屏幕的位置和大小。,6.2菜單,許多程序員對于菜單的設計都遵循下列一些規(guī)則: l若選擇某菜單項會彈出一對話框,那么在該菜單項文本后有“”。 l若某項菜單有子菜單,那么在該菜單項文本后有“”。 l若菜單項需要助記符,用括號將帶下劃線的字母括起來。助記符與Alt構成一個組合鍵,當按住“Alt”鍵不放,敲擊該字母時,對應的菜單項就會被選中。 l 若某項菜單需要快捷鍵的支持,則一般將其列在相應菜單項文本之后。所謂“快捷鍵”是一個組合鍵,如Ctrl+

20、N,使用時是先按下“Ctrl”健不放,然后再按“N”鍵。任何時候按下快捷鍵,相應的菜單命令都會被執(zhí)行。,圖6.11 菜單樣例子,6.2菜單,6.2.1更改應用程序菜單 菜單“文件”“打開工作區(qū)”。在工作區(qū)中選擇ResourceView頁面,雙擊資源“Menu”中的IDR_MAINFRAME,通過菜單編輯器修改菜單資源IDR_MAINFRAME ,可以為程序重新指定一個菜單,下面的示例過程: (1)打開前面的單文檔應用程序Ex_SDI。 (2) 按快捷鍵Ctrl+R,在資源類型中選定“Menu”,如圖。 (3) 單擊新建,如圖。,6.2菜單,(4)在Menu的ID_MENU1上右擊鼠標,選擇“P

21、roperties”命令,如圖,可以重新指定菜單資源ID,設置菜單資源的語言和條件,這個條件用來決定菜單資源包含到哪個環(huán)境中,例如當指定條件為_DEBUG,則菜單資源只存在于Debug編譯環(huán)境中。 (5)菜單ID_MENU1添加一個頂層彈出菜單項“測試(/ 使菜單對象和菜單句柄分離 m_NewMenu.LoadMenu( IDR_MENU1 ); SetMenu(NULL); / 清除應用程序菜單 SetMenu( LoadMenu裝載菜單資源,Detach使菜單對象與菜單句柄分離。調用LoadMenu后,菜單對象m_NewMenu就擁有一個菜單句柄,再次調用LoadMenu時,發(fā)生運行時錯誤

22、,當菜單對象與菜單句柄分離后,就可以再創(chuàng)建菜單。SetMenu是CWnd類的一個成員函數,用來設置應用程序的菜單。 (9)編譯運行并測試。,6.2菜單,6.2.2使用鍵盤快捷鍵 通過上述的菜單系統(tǒng),可以選擇幾乎所有可用的命令和選項,保證了菜單命令系統(tǒng)的完整性,菜單系統(tǒng)操作效率不高。對于那些反復使用的命令,有必要進一步提高效率,于是加速鍵應運而生。 一個加速鍵就是一個按鍵或幾個按鍵的組合,用于激活特定的命令。加速鍵也是一種資源。 例如:為前面兩個菜單ID_VIEW_TEST和ID_TEST_RETURN定義鍵盤快捷鍵: (1)打開上例的工作區(qū)窗口中Accelerator的資源項,雙擊IDR_MA

23、INFRAME,如圖。,6.2菜單,(2)建立一新的加速鍵,雙擊加速鍵列表的最下端的空行,彈出如圖的“Accel Properities”(加速鍵屬性)對話框,可設置的屬性如表。,6.2菜單,(3)選擇Ex_SDI添加的“顯示測試菜單”菜單項ID_VIEW_TEST作為要聯(lián)用的加速鍵的ID號,然后單擊下一鍵按鈕,并按下Ctrl+1作為此加速鍵的鍵值。 (4)按同樣的方法,為菜單項ID_TEST_RETURN添加加速鍵Ctrl+2。需要說明的是,為了使其他用戶能查看并使用該加速鍵,還需在相應的菜單項文本后面添加加速鍵內容。例如,可將ID_VIEW_TEST菜單項的標題改成“顯示測試菜單(/ 產生

24、一個空菜單 BOOL CreatePopupMenu( );/ 產生一個空的彈出式子菜單 裝入菜單資源 需調用CMenu成員函數LoadMenu,再用SetMenu對應用程序菜單進行重新設置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); lpszResourceName為菜單資源名稱,nIDResource為菜單資源ID號。 添加菜單項 可以調用AppendMenu或InsertMenu函數來添加菜單項。AppendMenu是將菜單項添加在菜單的末尾處,InsertMenu在指定位置

25、處插入菜單項,將后面的菜單項依次下移。 BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL ); BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL ); BOOL InsertMenu( UINT nPosition,

26、UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); nIDNewItem表示新菜單項的ID號,lpszNewItem表示新菜單項的內容,pBmp用于菜單項的位圖指針,nPosition表示新菜單項要插入的菜單項位置。nFlags表示要增加的新菜單項的狀態(tài)信息。,6.2菜單,注意: l當nFlags為MF_BYPOSITION時,nPosition表示新菜單項要插入的具體位置,為0時表示第一個菜單項,為 -1時,將菜單項添加菜單的末尾處。 lnFlags的標志中,可以用“|”(按位或)來組合。有些組合是不允許的,例如MF_DISABLED、M

27、F_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位圖,MF_CHECKED和MF_UNCHECKED 都不能組合在一起。 l當菜單項增加后,不管菜單依附的窗口是否改變,都應調用CWnd:DrawMenuBar來更新菜單。,6.2菜單,刪除菜單項 DeleteMenu函數可將菜單項刪除,注意:調用該函數后,不管菜單依附的窗口是否改變,都應調用CWnd:DrawMenuBar使菜單更新。函數原型: BOOL DeleteMenu( UINT nPosition, UINT nFlags ); nPosition表示要刪除菜單項位置,由

28、nFlags進行說明。nFlags為MF_BYCOMMAND時,nPosition表示菜單項ID號,nFlags為MF_BYPOSITION時,nPosition表示菜單項的位置。 獲取菜單項 下面四個CMenu成員函數分別獲得菜單的項數、菜單項的ID號、菜單項的文本內容以及彈出式子菜單的句柄。 UINT GetMenuItemCount( ) const;/用來獲得菜單的菜單項數。 UINT GetMenuItemID( int nPos ) const;/用來獲得由nPos指定菜單項位置的菜單項的標識號。 int GetMenuString( UINT nIDItem, CString/用

29、來獲得指定菜單的彈出式菜單的菜單句柄。,6.2菜單,示例 示例過程利用CMenu成員函數向應用程序菜單中添加并處理一個菜單項: (1)打開前面的單文檔應用程序Ex_SDI或重新創(chuàng)建。 (2) “查看”菜單“Resource Symbols”,如圖。 (3) 單擊新建,如圖。在名字框中輸入標識符ID_NEW_MENUITEM。在值框中輸入ID的值,單擊確定。,6.2菜單,(4) 關閉“資源符號”對話框,在CMainFrame:OnCreate函數中添加下列代碼。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . CMenu* pSy

30、sMenu = GetMenu();/ 獲得程序菜單指針 CMenu* pSubMenu = pSysMenu-GetSubMenu(1);/ 獲得第二個子菜單的指針 CString StrMenuItem(新的菜單項); pSubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔線 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);/ 在子菜單中增加一菜單項 / 允許使用ON_UPDATE_COMMAND_UI或ON_COMMAND的菜單項 m_bAutoMenuEnable = FALSE; /

31、 關閉系統(tǒng)自動更新菜單狀態(tài) pSysMenu-EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); / 激活菜單項 DrawMenuBar();/ 更新菜單 return 0; ,6.2菜單,(5) 用MFC ClassWizard處理OnCommand消息并檢測用戶菜單的nID參數。 BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字節(jié)表示菜單、控件、加速鍵的命令ID if (LOWORD(wParam) = ID_NEW_MENUITEM) Mes

32、sageBox(你選中了新的菜單項); return CFrameWnd:OnCommand(wParam, lParam); (6)編譯運行并測試。這樣當選擇菜單“編輯”“新的菜單項”命令后,就會彈一個對話框,顯示“你選中了新的菜單項”消息。,6.2菜單,6.2.4使用快捷菜單 快捷菜單實現函數 用資源編輯器和MFC庫的CMenu:TrackPopupMenu函數可以創(chuàng)建這樣的菜單,CMenu:TrackPopupMenu函數原型: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NUL

33、L ); 用來顯示一個浮動的彈出式菜單。nFlags表示菜單在屏幕顯示的位置以及鼠標按鈕標志,如表。x和y表示菜單的水平坐標和菜單的頂端的垂直坐標。pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的WM_COMMAND消息。lpRect是一個RECT結構或CRect對象指針,表示一個矩形區(qū)域,單擊這個區(qū)域時,彈出菜單不消失。lpRect為NULL時,在菜單外面單擊鼠標,菜單立刻消失。,6.2菜單,示例 顯示主菜單IDR_MAINFRAME時,右擊鼠標彈出“查看”菜單的子菜單,顯示菜單IDR_MENU1時,右擊鼠標彈出“測試”菜單的子菜單。具體步驟: (1) 打開前面的單文檔應用程序Ex_SDI

34、。 (2)在CMainFrame類添加WM_CONTEXTMENU消息映射,函數代碼。 void CMainFrame:OnContextMenu(CWnd* pWnd, CPoint point) CMenu* pSysMenu = GetMenu();/ 獲得程序菜單指針 int nCount = pSysMenu-GetMenuItemCount();/ 獲得頂層菜單個數 int nSubMenuPos = -1; for (int i=0; iGetMenuString(i, str, MF_BYPOSITION); if (str.Left(4) = “查看”) | (str.Lef

35、t(4) = “測試”)nSubMenuPos = i; break; if (nSubMenuPosGetSubMenu( nSubMenuPos) -TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this); (3)編譯運行并測試。,6.3工具欄,6.3.1使用工具欄編輯器 創(chuàng)建一個新的工具欄按鈕 雙擊新建的工具欄中最右端的空按鈕彈出屬性框,在ID框中輸入名稱,右端出現一個空按鈕。單擊該按鈕,在資源編輯器的工具按鈕設計窗口內進行編輯,這個編輯就是繪制一個工具按鈕的位圖。 移動一個按鈕 鼠標左鍵點中它并拖動至相

36、應位置。如果用戶拖動它離開工具欄位置,則此按鈕從工具欄中消失。若在移動一個按鈕的同時,按下Ctrl鍵,則在新位置復制一個按鈕,新位置可以是同一個工具欄中的其他位置,也可以在不同的工具欄中。 刪除一個按鈕 將選取中的按鈕拖離工具欄就消失了。若選中按鈕,Delete鍵不能刪除,將按鈕中的圖形全部以背景色填充。 在工具欄中插入空格 如果按扭前沒有任何空格,拖動該按鈕向右移動并當覆蓋相鄰按鈕的一半以上時,釋放鼠標鍵,則此按鈕前出現空格。 如果按鈕前有空格而按鈕后沒有空格,拖動該按鈕向左移動并當按鈕的左邊界接觸到前面按鈕時,釋放鼠標鍵,則此按鈕后將出現空格。 如果按鈕前后均有空格,拖動該按鈕向右移動并當

37、接觸到相鄰按鈕時,則此按鈕前的空格保留,按鈕后的空格消失。相反,拖動該按鈕向左移動并當接觸到前一個相鄰按鈕時,則此按鈕前面的空格消失,后面的空格保留。,6.3工具欄,工具欄按鈕屬性的設置,6.3工具欄,6.3.2工具按鈕和菜單項相結合 指選擇工具按鈕或菜單命令時,操作結果是一樣的。使它們結合的具體方法是在工具按鈕的屬性對話框中將按鈕的ID號設置為相關聯(lián)的菜單項ID。 例如:示例是在前面Ex_SDI上進行的,通過兩個工具按鈕分別顯示主菜單IDR_MAINFRAME和菜單IDR_MENU1。具體步驟: (1) 打開前面的單文檔應用程序Ex_SDI。 (2) 利用工具欄編輯器設計兩個工具按鈕,如圖。

38、,6.3工具欄,(3)雙擊設計的第一個工具按鈕,將工具按鈕的ID號設為ID_TEST_RETURN,在提示框內鍵入“返回應用程序主菜單n返回主菜單”。 (4)雙擊設計的第二個工具按鈕,將工具按鈕的ID號設為ID_VEW_TEST,在提示框內鍵入“顯示測試菜單n顯示測試菜單”。 (5) 編譯運行并測試。將鼠標移至設計的第一個工具按鈕處,這時在狀態(tài)欄上顯示出“返回應用程序主菜單”信息,若稍等片刻后,還會彈出提示小窗口,顯示出“返回主菜單”字樣,如圖。單擊新添加的這兩個按鈕,會執(zhí)行相應的菜單命令。,6.3工具欄,6.3.3多個工具欄的使用 操作步驟如下: (1)打開前面的單文檔應用程序Ex_SDI。

39、 (2)將工作區(qū)切換到ResourceView,展開Toolbar(工具欄)資源,用鼠標單擊IDR_MAINFRAME不松開,按Ctrl,將IDR_MAINFRAME拖到Toolbar資源名稱上。 (3)右擊工具欄資源IDR_MAINFRAME1,選擇Properties命令,如圖。 (4)雙擊IDR_TOOLBAR1,按圖刪除不要的工具按鈕。 (5)在CMainFrame類中添加一個成員變量m_wndTestBar,變量類型為CToolBar。CToolBar類封裝了工具欄的操作。,6.3工具欄,(6) 在CMainFrame:OnCreate函數中添加下面的工具欄創(chuàng)建代碼: int CMa

40、inFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1; int nRes = 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 (!nR

41、es | !m_wndTestBar.LoadToolBar(IDR_TOOLBAR1) TRACE0(Failed to create toolbarn); return -1; / fail to create m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar( ,6.3工具欄,(7)編譯運行,如圖。 (8) 需要調用CFrameWnd類的成員函數ShowControlBar

42、來使程序一開始運行時隱藏工具欄IDR_TOOLBAR1。在CMainFrame:OnCreate中添加代碼: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) ShowControlBar( ,6.3工具欄,(9) 在CMainFrame:OnViewTest和CMainFrame:OnTestReturn中添加代碼: void CMainFrame:OnViewTest() ShowControlBar( / 顯示主工具欄 (10) 編譯運行并測試,如圖,左邊開始運行的結果,右邊是單擊按鈕運行的結果。,6.4狀態(tài)欄,6.4.1狀態(tài)欄

43、的定義 AppWizard創(chuàng)建的SDI或MDI應用程序框架中,有一個靜態(tài)的indicator數組,是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。 數組中的元素是一些標識常量或是字串資源的ID號。圖列出了indicators數組元素與標準狀態(tài)欄窗格的關系。,6.4狀態(tài)欄,6.4.2狀態(tài)欄的常用操作 增加和減少窗格 在狀態(tài)欄中增加信息行窗格,在indicators數組中增加一個ID_SEPARATOR標識;在狀態(tài)欄中增加指示器窗格,在indicators數組中增加一個在字符串表中定義過的資源ID。狀態(tài)欄減少一個窗格,只需減少indicators數組元素。 在狀態(tài)欄上顯示文本 調

44、用CStatusBar:SetPaneText函數更新任何窗格中的文本。函數原型: BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE ); 示例 (1) 創(chuàng)建一個默認的單文檔應用程序Ex_SDIMouse。 (2)將工作區(qū)切換到ClassView頁面,展開CMainFrame,雙擊CMainFrame,在文檔窗口中出現該函數的定義,在它的前面就是狀態(tài)欄數組的定義。 (3) 將狀態(tài)欄indicators數組的定義改為下列代碼: static UINT indicators = ID_SEPARATOR,

45、ID_SEPARATOR, ;,6.4狀態(tài)欄,(4)在CEx_SDIMouseView類中添加CMainFrame類的代碼。CEx_SDIMouseView:OnMouseMove代碼: void CEx_SDIMouseView:OnMouseMove(UINT nFlags, CPoint point) CString str; CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 獲得主窗口指針 CStatusBar* pStatus= ,6.4狀態(tài)欄,(5) 將MainFrm.h文件中的受保護變量m_wndStatusBar

46、變成公共變量。 (6) 在Ex_SDIMouseView.cpp文件的開始處增加下列語句: #include Ex_SDIMouseView.h #include MainFrm.h“ (7)編譯并運行,如圖。,6.4狀態(tài)欄,6.4.3改變狀態(tài)欄的風格 在MFC的CStatusBar類中,有兩個成員函數可以改變狀態(tài)欄風格,它們是: void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); void SetPaneStyle( int nIndex, UINT nStyle ); 參數nIndex表示要設置的狀態(tài)欄窗格

47、的索引,nID為狀態(tài)欄窗格指定新的ID,cxWidth表示窗格的像素寬度,nStyle表示窗格的風格類型,指定窗格的外觀,例如SBPS_POPOUT表示窗格是凸起來的,見表。,6.5交互對象的動態(tài)更新,在前面Ex_SDI基礎上,單擊工具按鈕,該按鈕被按下,按鈕彈起,單擊工具按鈕時,該按鈕被按下,按鈕彈起,如此反復。具體步驟: (1) 打開上例的單文檔應用程序項目Ex_SDI。 (2)為CMainFrame添加一個BOOL型的成員變量m_bMainWork,將m_bMainWork的初值設為TRUE。 (3)在CMainFrame類中添加工具按鈕ID_VIEW_TEST和ID_TEST_RETU

48、RN的UPDATE_COMMAND_UI消息映射函數,添加代碼: void CMainFrame:OnUpdateViewTest(CCmdUI* pCmdUI) pCmdUI-Enable( TRUE ); pCmdUI-SetCheck( !m_bMainWork ); void CMainFrame:OnUpdateTestReturn(CCmdUI* pCmdUI) pCmdUI-Enable( TRUE ); pCmdUI-SetCheck( m_bMainWork );,6.5交互對象的動態(tài)更新,(4)在CMainFrame:OnViewTest和CMainFrame:OnTest

49、Return添加代碼: void CMainFrame:OnViewTest() m_bMainWork = FALSE; void CMainFrame:OnTestReturn() m_bMainWork = TRUE; (5)編譯運行并測試,如圖。,6.6圖標和光標,6.6.1使用圖形編輯器 創(chuàng)建一個新的圖標或光標 創(chuàng)建應用程序后,按快捷鍵Ctrl+R打開“插入資源”,選擇Cursor(光標)或Icon(圖標)資源類型,單擊新建。如圖。 創(chuàng)建新圖標或光標的時,圖形編輯器先創(chuàng)建的是一個適合于VGA環(huán)境中的圖像,開始的時候它以屏幕色(透明方式)來填充。如表。,新設備按鈕,6.6圖標和光標,選

50、用和定制顯示設備 圖形編輯器上,有一個New Device Image按鈕,單擊,如圖。 單擊定制,如圖。 設置光標熱點 借助光標“熱點”確定光標實際的位置。如圖。,設置熱點按鈕,6.6圖標和光標,6.6.2圖標 圖標的調入和清除 CWinApp:LoadIcon可將一個圖標資源調入并返回一個圖標句柄。原型: HICON LoadIcon( LPCTSTR lpszResourceName ) const; HICON LoadIcon( UINT nIDResource ) const; 不想創(chuàng)建新的圖標資源,可使用預定義的標準圖標,調用CWinApp:LoadStandardIcon ,原

51、型: HICON LoadStandardIcon( LPCTSTR lpszIconName ) const; lpszIconName可以是下列值之一: IDI_APPLICATION 默認的應用程序圖標 IDI_HAND 手形圖標(用于嚴重警告) IDI_QUESTION 問號圖標(用于提示消息) IDI_EXCLAMATION 警告消息圖標(驚嘆號) IDI_ASTERISK 消息圖標 DestroyIcon可以用來刪除一個圖標,釋放為圖標分配的內存,原型: BOOL DestroyIcon( HICON hIcon );hIcon用來指定要刪除的圖標句柄。 圖標的繪制 函數CDC:D

52、rawIcon將一個圖標繪制在指定的位置處,原型: BOOL DrawIcon( int x, int y, HICON hIcon ); BOOL DrawIcon( POINT point, HICON hIcon );,6.6圖標和光標,應用程序圖標的改變 使用GetClassLong和SetClassLong重新指定應用程序窗口的圖標,原型: DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong); DWORD GetClassLong( HWND hWnd, int nIndex); hWnd用來指定窗口類句柄,dwNew

53、Long 用來指定新的32位值。nIndex用來指定與WNDCLASSEX結構相關的索引,它可以是下列值之一: GCL_HBRBACKGROUND 窗口類的背景畫刷句柄 GCL_HCURSOR 窗口類的的光標句柄 GCL_HICON窗口類的的圖標句柄 GCL_MENUNAME 窗口類的的菜單資源名稱 示例 例Ex_Icon 改變應用程序圖標。 (1)用MFC AppWizard創(chuàng)建一個默認的單文檔應用程序Ex_Icon。 (2) 新添四個圖標資源,通過圖像設備選擇對話框(參見圖6.32)。圖標資源ID號分別為默認的IDI_ICON1 IDI_ICON4。,6.6圖標和光標,(3) 用圖形編輯器

54、繪制圖標,如圖。 (4) CMainFrame類添加成員函數ChangeIcon。函數代碼: void CMainFrame:ChangeIcon(UINT nIconID) HICON hIconNew = AfxGetApp()-LoadIcon(nIconID); HICON hIconOld = (HICON)GetClassLong(m_hWnd, GCL_HICON); if (hIconNew != hIconOld) DestroyIcon(hIconOld); SetClassLong(m_hWnd, GCL_HICON, (long)hIconNew); RedrawWin

55、dow();/ 重繪窗口 ,6.6圖標和光標,(5) 在CMainFrame:OnCreate函數的最后添加計時器設置代碼: int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1; . SetTimer(1, 500, NULL); return 0; (6)為CMainFrame類添加WM_TIMER的消息映射函數,增加代碼: void CMainFrame:OnTimer(UINT nIDEvent) static int icons = IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4; static int index = 0; ChangeIcon(iconsindex); index+; if (index3) index = 0; CFrameWnd:OnTimer(nIDEvent); ,6.6圖標和光標,(7) 為CMainFrame類添加WM_DESTROY的消息映射函數,增加代碼: void CMainFrame:OnDestroy() CFrameWnd:On

溫馨提示

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

最新文檔

評論

0/150

提交評論