visual studiomfc框架結(jié)構(gòu)設(shè)計(jì)_第1頁
visual studiomfc框架結(jié)構(gòu)設(shè)計(jì)_第2頁
visual studiomfc框架結(jié)構(gòu)設(shè)計(jì)_第3頁
visual studiomfc框架結(jié)構(gòu)設(shè)計(jì)_第4頁
visual studiomfc框架結(jié)構(gòu)設(shè)計(jì)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Visual Studio 2021 MFC框架結(jié)構(gòu)設(shè)計(jì)圖解建立一個(gè)類似于fisualStudio2021的界面,總體步驟如下:第一步是建立一個(gè)標(biāo)準(zhǔn)的MFC工程這對(duì)我們學(xué)習(xí)有利第二步是添加必要的資源,當(dāng)然也可以邊做邊參加。第三步是從CDockablePane派生一個(gè)視圖類用于停靠在框架窗口的左邊。為這個(gè)類要?jiǎng)?chuàng)立一個(gè)CViewTree類,它主要是在派生出來的類中參加樹控件。第四步就是設(shè)計(jì)這個(gè)派生的類,為其添加工具欄,彈出菜單等第五步就是將這個(gè)派生類加到框架中去。下面我們開始制作:一、 新建標(biāo)準(zhǔn)的MFC工程點(diǎn)新建工程選擇Visual C+的MFC選擇MFC應(yīng)用程序輸入MyTest工程名位置就自己定

2、吧。這里解決方案名稱會(huì)與名稱同步,你可以修改“解決方案名稱M,它其實(shí)就是工程的總目錄名點(diǎn)擊確定。下一步這里我們使用的是“多信文檔à選項(xiàng)卡式檔,工程類型選擇MFC校準(zhǔn)點(diǎn)擊完成。二、 設(shè)計(jì)左側(cè)??看翱贑DockablePane在類視圖中點(diǎn)擊右鍵,在彈出菜單中選擇“類向?qū)c(diǎn)擊“添加類類名中添加“CPersonView基類選擇“CDockablePane點(diǎn)擊完成,回到類向?qū)е?,我們看到類名已?jīng)是我們剛剛建立的類。點(diǎn)擊確定。這樣我們就建立了一個(gè)由CDockablePane派生的子類“CPersonView。接下類我們?cè)購腃TreeCtrl類派生一個(gè)CViewTree子類,它是有要CPerson

3、View中生成樹形結(jié)構(gòu)。作為系統(tǒng)功能菜單使用。步驟與建立CPersonView上面相同。接下來是為CPersonView??看翱谏戏教硪粋€(gè)獨(dú)特的工具欄,為此我們要生成一類,這個(gè)類不必用向?qū)?,只需要在CPersonView類頭文件中添加如下代碼就可以了,因這個(gè)類不作為其公用類比擬小。CPersonView.h文件#pragma once#include "viewtree.h"class CPersonViewToolBar : public CMFCToolBarvirtual void OnUpdateCmdUI(CFrameWnd* /*pTarget*/, BOO

4、L bDisableIfNoHndler)/此成員函數(shù)由框架類調(diào)用,以便更新狀態(tài)工具欄或狀態(tài)欄,pTarget指向應(yīng)用程序的主窗口,這個(gè)指針用于路由更新消息,bDisablefNoHndler是個(gè)標(biāo)志,指示控件沒有更新處理程序應(yīng)該自動(dòng)顯示為禁用。CMFCToolBar:OnUpdateCmdUI(CFrameWnd*) GetOwner(), bDisableIfNoHndler);virtual BOOL AllowShowOnList() const return FALSE; ;CMFCToolBar是選件類類似于 CToolBar Class,但是,提供用戶界面功能附加支持。

5、 其中包括簡(jiǎn)單的工具欄、工具欄有快捷圖像的,大圖標(biāo)、尋呼機(jī)按鈕、鎖定的工具欄、rebar控件、文本在圖像下,背景圖像和選項(xiàng)卡式工具欄。 CMFCToolBar 選件類還包含內(nèi)置為工具欄的用戶可自定義的支持,并菜單、拖放到工具欄和菜單之間,組合框按鈕,編輯框按鈕、顏色選取器和匯總按鈕。下面是將CViewTree附加到CPersonView中。方法是:在類視圖中右鍵選擇CPersonView類訪問選擇“protected變量類型選擇輸入“CViewTree變量名輸入“m_wndViewTree點(diǎn)擊完成。這樣就在CPersonView類的頭文件中定議一個(gè)名為m_wndV

6、iewTree的變量。代碼如下:protected:DECLARE_MESSAGE_MAP()CViewTree m_wndViewTree;同樣方法為CPersonView添加如下兩個(gè)變量:CImageList m_PersonViewImages;CPersonViewToolBar m_wndToolBar;接下來我們要為CPersonView添加一個(gè)彈出式菜單方法是:選擇資源視圖或者在解決方案視圖中找到資源文件MyTest.rc雙擊進(jìn)入資源視圖右擊“Menu 選擇添加資源點(diǎn)擊新建方法不再贅述,其ID改為IDR_POPUP_EXPLORER,保存。添加位圖資源與菜單相同其ID改為IDB_

7、PERSON_VIEW添加工具欄其ID改為IDR_EXPLORER同法添加IDB_EXPLORER_24及IDB_FILE_VIEW為CPerosnView添加自定義方法OnChangeVisualStyle()和AdjustLayout,方法是,進(jìn)入類向?qū)нx擇“方法點(diǎn)擊添加方法返回類型為void,參數(shù)類型不添加,訪問選擇public 點(diǎn)確定。再添加一個(gè)用于對(duì)樹添加節(jié)點(diǎn)的私有方法:FillFileView方法。下面是三個(gè)方法的代碼void CPersonView:OnChangeVisualStyle(void)m_wndToolBar.CleanUpLockedImages();m_wndT

8、oolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_EXPLORER_24 : IDR_EXPLORER, 0, 0, TRUE /* 鎖?定¡§*/);m_PersonViewImages.DeleteImageList();UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_PERSON_VIEW_24 : IDB_PERSON_VIEW;CBitmap bmp;if (!bmp.LoadBitmap(uiBmpId)TRACE(_T("無T法¤¡§加&

9、#168;®載?位?圖ª?: %xn"), uiBmpId);ASSERT(FALSE);return;BITMAP bmpObj;bmp.GetBitmap(&bmpObj);UINT nFlags = ILC_MASK;nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;m_PersonViewImages.Create(16, bmpObj.bmHeight, nFlags, 0, 0);m_PersonViewImages.Add(&bmp, RGB(255, 0, 2

10、55);m_wndViewTree.SetImageList(&m_PersonViewImages, TVSIL_NORMAL);void CPersonView:AdjustLayout(void)if (GetSafeHwnd() = NULL)return;CRect rectClient;GetClientRect(rectClient);int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top

11、, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);m_wndViewTree.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);void CPersonView:FillFileView(void)HTREEITEM hRoot = m_wndViewTree.Ins

12、ertItem(_T("FakeApp 文?件t"), 0, 0);m_wndViewTree.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);HTREEITEM hSrc = m_wndViewTree.InsertItem(_T("FakeApp 源¡ä文?件t"), 0, 0, hRoot);m_wndViewTree.InsertItem(_T("FakeApp.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("Fa

13、keApp.rc"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("FakeAppDoc.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("FakeAppView.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("MainFrm.cpp"), 1, 1, hSrc);m_wndViewTree.InsertItem(_T("StdAfx.cpp"), 1, 1, hSrc);H

14、TREEITEM hInc = m_wndViewTree.InsertItem(_T("FakeApp 頭ª¡¤文?件t"), 0, 0, hRoot);m_wndViewTree.InsertItem(_T("FakeApp.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("FakeAppDoc.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("FakeAppView.h"), 2, 2, hInc

15、);m_wndViewTree.InsertItem(_T("Resource.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("MainFrm.h"), 2, 2, hInc);m_wndViewTree.InsertItem(_T("StdAfx.h"), 2, 2, hInc);HTREEITEM hRes = m_wndViewTree.InsertItem(_T("FakeApp 資Á¨º源¡ä文?件t"), 0,

16、 0, hRoot);m_wndViewTree.InsertItem(_T("FakeApp.ico"), 2, 2, hRes);m_wndViewTree.InsertItem(_T("FakeApp.rc2"), 2, 2, hRes);m_wndViewTree.InsertItem(_T("FakeAppDoc.ico"), 2, 2, hRes);m_wndViewTree.InsertItem(_T("FakeToolbar.bmp"), 2, 2, hRes);m_wndViewTree.Expa

17、nd(hRoot, TVE_EXPAND);m_wndViewTree.Expand(hSrc, TVE_EXPAND);m_wndViewTree.Expand(hInc, TVE_EXPAND);下面為CPersonView類添加消息響應(yīng)函數(shù)右擊CPersonView選擇“類向?qū)нx擇“消息分別添加雙擊WM_CONTEXTMENU鼠標(biāo)右鍵消息WM_CREATE窗口創(chuàng)立消息WM_PAINT窗口刷新消息WM_SETFOCUS窗口得到焦點(diǎn)消息WM_SIZE窗口尺寸變化消息五個(gè)消息,代碼如下void CPersonView:OnContextMenu(CWnd* pWnd, CPoint point

18、)/ TODO: 在¨²此ä?處ä|添¬¨ª加¨®消?息¡é處ä|理¤¨ª程¨¬序¨°代䨲碼?CTreeCtrl* pWndTree = (CTreeCtrl*) &m_wndViewTree;ASSERT_VALID(pWndTree);if (pWnd != pWndTree)CDockablePane:OnContextMenu(pWnd, point);re

19、turn;if (point != CPoint(-1, -1)/ 選?擇?已°?單Ì£¤擊¡Â的Ì?項(xiàng)?:CPoint ptTree = point;pWndTree->ScreenToClient(&ptTree);UINT flags = 0;HTREEITEM hTreeItem = pWndTree->HitTest(ptTree, &flags);if (hTreeItem != NULL)pWndTree->SelectItem(hTreeItem);pWndTree->

20、SetFocus();theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EXPLORER, point.x, point.y, this, TRUE);int CPersonView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CDockablePane:OnCreate(lpCreateStruct) = -1)return -1;/ TODO: 在¨²此ä?添¬¨ª加¨®您¨²專&#

21、193;¡§用®?的Ì?創(chuàng)ä¡ä建¡§代䨲碼?CRect rectDummy;rectDummy.SetRectEmpty();/ 創(chuàng)ä¡ä建¡§視º¨®圖ª?:const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;if (!m_wndView

22、Tree.Create(dwViewStyle, rectDummy, this, 4)TRACE0("未¡ä能¨¹創(chuàng)ä¡ä建¡§文?件t視º¨®圖ª?n");return -1; / 未¡ä能¨¹創(chuàng)ä¡ä建¡§/ 加¨®載?視º¨®圖ª?圖ª?像?:m_PersonViewImages.

23、Create(IDB_PERSON_VIEW, 16, 0, RGB(255, 0, 255);m_wndViewTree.SetImageList(&m_PersonViewImages, TVSIL_NORMAL);m_wndToolBar.Create(this, AFX_DEFAULT_TOOLBAR_STYLE, IDR_EXPLORER);m_wndToolBar.LoadToolBar(IDR_EXPLORER, 0, 0, TRUE /* 已°?鎖?定¡§*/);OnChangeVisualStyle();m_wndToolBar.SetP

24、aneStyle(m_wndToolBar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY);m_wndToolBar.SetPaneStyle(m_wndToolBar.GetPaneStyle() & (CBRS_GRIPPER | CBRS_SIZE_DYNAMIC | CBRS_BORDER_TOP | CBRS_BORDER_BOTTOM | CBRS_BORDER_LEFT | CBRS_BORDER_RIGHT);m_wndToolBar.SetOwner(this);/ 所¨´有®D命¨&#

25、185;令¢?將?通ª¡§過y此ä?控?件t路¡¤由®¨¦,ê?而?不?是º?通ª¡§過y主¡Â框¨°架¨¹路¡¤由®¨¦:m_wndToolBar.SetRouteCommandsViaFrame(FALSE);/ 填入一些靜態(tài)樹視圖數(shù)據(jù)此處只需填入虛擬代碼,而不是復(fù)雜的數(shù)據(jù))FillFileView();AdjustLayout();

26、return 0;void CPersonView:OnPaint()CPaintDC dc(this); / device context for painting/ TODO: 在¨²此ä?處ä|添¬¨ª加¨®消?息¡é處ä|理¤¨ª程¨¬序¨°代䨲碼?/ 不?為a繪?圖ª?消?息¡é調(diào)Ì¡Â用®?

27、CDockablePane:OnPaint()CRect rectTree;m_wndViewTree.GetWindowRect(rectTree);ScreenToClient(rectTree);rectTree.InflateRect(1, 1);dc.Draw3dRect(rectTree, :GetSysColor(COLOR_3DSHADOW), :GetSysColor(COLOR_3DSHADOW);void CPersonView:OnSetFocus(CWnd* pOldWnd)CDockablePane:OnSetFocus(pOldWnd);/ TODO: 在

28、8;²此ä?處ä|添¬¨ª加¨®消?息¡é處ä|理¤¨ª程¨¬序¨°代䨲碼?m_wndViewTree.SetFocus();void CPersonView:OnSize(UINT nType, int cx, int cy)CDockablePane:OnSize(nType, cx, cy);/ TODO: 在¨²此ä?處ä|添¬

29、;¨ª加¨®消?息¡é處ä|理¤¨ª程¨¬序¨°代䨲碼?AdjustLayout();我們現(xiàn)在就以完成了CPersonView類的設(shè)計(jì),可以編譯運(yùn)行一下,如查沒有發(fā)生錯(cuò)誤就可以接著將CPersonView加到框架中去了。三、 將新視圖添加到框架窗口中添加一個(gè)字符串資源ID為IDS_PERSON_VIEW 標(biāo)題為“人力資源。保存再添加一個(gè)空ID為ID_VIEW_PERSONVIEW點(diǎn)擊新建再添加兩個(gè)圖標(biāo)資源IDI_PERSO

30、N_VIEW_HC 和 IDI_PERSON_VIEW接下來我們?cè)陬愐晥D中找到CMainFrame類,點(diǎn)擊右鍵,為其添加CPersonView變量m_wndPersonView。下面為CMainFrame添加兩個(gè)自定義方法,代碼如下:BOOL CMainFrame:CreateDockingWindow(void)BOOL bNameValid;/ 創(chuàng)立類視圖CString strClassView;bNameValid = strClassView.LoadString(IDS_PERSON_VIEW);ASSERT(bNameValid);if (!m_wndPersonView.Crea

31、te(strClassView, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PERSONVIEW, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI)TRACE0("未能創(chuàng)立“人力資源視圖窗口n");return FALSE; / 未能創(chuàng)立SetDockingWindowIcons(theApp.m_bHiColorIcons);return TRUE;void CMainFrame:SetDocking

32、WindowIcons(bool bHiColorIcons)HICON hFileViewIcon = (HICON) :LoadImage(:AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PERSON_VIEW_HC : IDI_PERSON_VIEW), IMAGE_ICON, :GetSystemMetrics(SM_CXSMICON), :GetSystemMetrics(SM_CYSMICON), 0);m_wndPersonView.SetIcon(hFileViewIcon, FALSE);雙擊框架類的成

33、員函數(shù)OnCreate添加代碼int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CMDIFrameWndEx:OnCreate(lpCreateStruct) = -1)return -1;BOOL bNameValid;/ 基于持久值設(shè)置視覺管理器和樣式OnApplicationLook(theApp.m_nAppLook);CMDITabInfo mdiTabParams;mdiTabParams.m_style = CMFCTabCtrl:STYLE_3D_ONENOTE; / 其他可用樣式.mdiTabParams.m_

34、bActiveTabCloseButton = TRUE; / 設(shè)置為 FALSE 會(huì)將關(guān)閉按鈕放置在選項(xiàng)卡區(qū)域的右側(cè)mdiTabParams.m_bTabIcons = FALSE; / 設(shè)置為 TRUE 將在 MDI 選項(xiàng)卡上啟用文檔圖標(biāo)mdiTabParams.m_bAutoColor = TRUE; / 設(shè)置為 FALSE 將禁用 MDI 選項(xiàng)卡的自動(dòng)著色mdiTabParams.m_bDocumentMenu = TRUE; / 在選項(xiàng)卡區(qū)域的右邊緣啟用文檔菜單EnableMDITabbedGroups(TRUE, mdiTabParams);if (!m_wndMenuBar.Cr

35、eate(this)TRACE0("未能創(chuàng)立菜單欄n");return -1; / 未能創(chuàng)立m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);/ 防止菜單欄在激活時(shí)獲得焦點(diǎn)CMFCPopupMenu:SetForceMenuFocus(FALSE);if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS

36、_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)TRACE0("未能創(chuàng)立工具欄n");return -1; / 未能創(chuàng)立CString strToolBarName;bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);ASSERT(bNameValid);m_wndT

37、oolBar.SetWindowText(strToolBarName);CString strCustomize;bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);ASSERT(bNameValid);m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);/ 允許用戶定義的工具欄操作:InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);if (!m_w

38、ndStatusBar.Create(this)TRACE0("未能創(chuàng)立狀態(tài)欄n");return -1; / 未能創(chuàng)立m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT);/ TODO: 如果您不希望工具欄和菜單欄可???,請(qǐng)刪除這五行m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockPane(&

39、amp;m_wndMenuBar);DockPane(&m_wndToolBar);/ 啟用 Visual Studio 2005 樣式??看翱谛袨镃DockingManager:SetDockingMode(DT_SMART);/ 啟用 Visual Studio 2005 樣式??看翱谧詣?dòng)隱藏行為EnableAutoHidePanes(CBRS_ALIGN_ANY);/ 啟用增強(qiáng)的窗口管理對(duì)話框EnableWindowsDialog(ID_WINDOW_MANAGER, ID_WINDOW_MANAGER, TRUE);/ 啟用工具欄和停靠窗口菜單替換EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);/ 啟用快速(按住 Alt 拖動(dòng))工具欄自定義CMFCToolBar:EnableQuickCustomization();if (CMFCToolBar:GetUserImages() = NULL)/ 加載用戶定義的工具欄

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論