第七講 界面編程_第1頁
第七講 界面編程_第2頁
第七講 界面編程_第3頁
第七講 界面編程_第4頁
第七講 界面編程_第5頁
已閱讀5頁,還剩29頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第七講界面編程2/5/2023內容安排界面編程更改光標、標題圖標、窗口背景工具欄編程狀態欄編程更改窗口大小、標題、風格添加啟動界面2/5/20232在窗口創建之前更改更改窗口大小、標題、風格如果希望在應用程序窗口創建之前修改它的大小、標題和風格,應該在CMainFrame類的PreCreateWindow成員函數進行。該函數有個類型是CREATESTRUCT結構的參數,如果在修改了這個參數中的成員變量的值,那么這種改變會反映到MFC底層代碼中,當MFC底層代碼調用CreateWindowEx函數去創建窗口時,它就會使用改變后的參數值去創建這個窗口。2/5/20233例:更改窗口大小BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE;

cs.cx=300; cs.cy=200; returnTRUE;}更改窗口大小、標題、風格2/5/20234BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE;

cs.lpszName="暨南大學"; returnTRUE;}注意:此時應用程序的標題并未改變,原因及解決方法見下頁。例:更改應用程序標題更改窗口大小、標題、風格2/5/20235在MFC框架程序中更改標題欄文字應注意框架的默認窗口樣式是WS_OVERLAPPEDWINDOW和FWS_ADDTOTITLE樣式的組合。其中FWS_ADDTOTITLE是MFC特定的一種樣式,指示框架將文檔標題添加到窗口標題上。因此,如果想讓窗口顯示自己的標題,只需將窗口的FWS_ADDTOTITLE樣式去掉即可。設置窗口標題的代碼之前加上:cs.style=cs.style&~FWS_ADDTOTITLE;cs.style=

WS_OVERLAPPEDWINDOW;或者:更改窗口大小、標題、風格2/5/20236在窗口創建之后更改其風格在應用程序窗口創建之后修改它的風格屬性,可在CMainFrame類的OnCreate函數中調用SetWindowLong函數實現。SetWindowLong(HWNDhWnd,intnIndex,LONGdwNewLong)該函數的作用是改變制定窗口的屬性(包括設置新的窗口風格、設置新的窗口過程、設置新的應用程序實例局柄等)。要改變窗口的風格,則將該函數的第二個參數指定為GWL_STYLE,然后由第三個參數指定新的窗口風格。更改窗口大小、標題、風格2/5/20237SetWindowLong實例更改窗口大小、標題、風格intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; ……

SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); return0;}如果是在已有類型的基礎上進行修改的話,那么可以利用GetWindowLong這個函數獲得這個窗口的現有類型,然后修改。例如:SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);2/5/20238在窗口創建之后更改標題與大小在應用程序窗口創建之后修改標題,可在CMainFrame類的OnCreate函數中調用SetWindowText函數實現。更改窗口大小、標題、風格在應用程序窗口創建之后修改大小,可在CMainFrame類的OnCreate函數中調用SetWindowPos函數實現。2/5/20239內容安排界面編程更改光標、標題圖標、窗口背景工具欄編程狀態欄編程更改窗口大小、標題、風格添加啟動界面2/5/202310修改光標、圖標、背景的思路更改光標、標題欄圖標、窗口背景之前對于窗口的大小、標題和風格是在創建窗口時設定的。而光標、圖標和背景是在設計窗口類時指定的。窗口類的設計與注冊是由MFC底層代碼自動完成的,我們不可能、也不應該去修改MFC底層代碼。但是我們可以編寫自己的窗口類注冊,然后讓隨后的窗口按照我們編寫的窗口類去創建。2/5/202311在窗口創建之前更改更改光標、標題欄圖標、窗口背景BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){…… WNDCLASSMyWnd; MyWnd.cbClsExtra=NULL;MyWnd.cbWndExtra=NULL; MyWnd.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); MyWnd.hCursor=LoadCursor(NULL,IDC_CROSS); MyWnd.hIcon=LoadIcon(NULL,IDI_WARNING); MyWnd.hInstance=AfxGetInstanceHandle(); MyWnd.lpfnWndProc=::DefWindowProc; MyWnd.lpszClassName="Hello"; MyWnd.lpszMenuName=NULL; MyWnd.style=CS_HREDRAW|CS_VREDRAW;RegisterClass(&MyWnd); cs.lpszClass="hello"; returnTRUE;}2/5/202312以上代碼存在的問題、原因及解決方法更改光標、標題欄圖標、窗口背景

上述代碼的運行結果是:僅僅是程序的標題欄圖標發生了改變,但窗口的背景和光標沒有改變。

原因是:視類窗口覆蓋在主窗口上面,我們看到的窗口實際上是視類窗口,而上述代碼修改的是框架類窗口的背景和光標。應用程序的圖標屬于框架窗口,因此上述程序運行后,圖標發生了改變。

結論:在MFC中,如果要修改應用程序窗口的圖標,則應該框架類中進行,因為框架窗口才有標題欄;如果要修改程序窗口的背景和光標,則應該在視類中進行。

解決方法:在視類的PreCreateWindow函數中添加代碼:cs.lpszClass="hello";2/5/202313一個簡單的修改函數更改光標、標題欄圖標、窗口背景BOOLCMainFrame::PreCreateWindow(CREATESTRUCT&cs){ if(!CFrameWnd::PreCreateWindow(cs)) returnFALSE; cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING)); returnTRUE;}BOOLCUIView::PreCreateWindow(CREATESTRUCT&cs){ cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_CROSS),(HBRUSH)GetStockObject(BLACK_BRUSH),0); returnCView::PreCreateWindow(cs);}2/5/202314在窗口創建之后更改更改光標、標題欄圖標、窗口背景要在應用程序窗口創建之后修改它的光標、圖標和背景,可在OnCreate函數中調用SetClassLong函數實現。SetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong)該函數的作用是:重新設置指定窗口所屬窗口類的WNDCLASS結構體中指定數據成員的屬性(包括設置新的窗口背景畫刷、光標、圖標和窗口類樣式)。2/5/202315SetClassLong實例intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ ……

SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_WARNING)); return0;}intCUIView::OnCreate(LPCREATESTRUCTlpCreateStruct){ ……

SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS)); return0;}更改光標、標題欄圖標、窗口背景2/5/202316動畫圖標更改窗口大小與標題欄文字加載圖標資源、設置定時器、添加定時器消息響應函數intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ …… m_hIcon[0]=::LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1)); m_hIcon[1]=::LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2)); m_hIcon[2]=::LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3)); m_hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON4); SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[0]);

SetTimer(1,1000,NULL); return0;}HICONm_hIcon[4];//MainFrm.h文件2/5/202317動畫圖標(續)更改窗口大小與標題欄文字voidCMainFrame::OnTimer(UINTnIDEvent){ staticintindex=1; SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[index]); index=++index%4; CFrameWnd::OnTimer(nIDEvent);}2/5/202318內容安排界面編程更改光標、標題圖標、窗口背景工具欄編程狀態欄編程添加啟動界面更改窗口大小、標題、風格2/5/202319增加、刪除工具欄按鈕;響應按鈕命令工具欄編程工具欄是把常用的菜單命令集合起來,以按鈕的形式提供給用戶使用,目的是方便用戶的操作。工具按鈕的添加、刪除都在資源編輯器窗口中的工具欄編輯窗口中完成。添加按鈕響應命令的方法與菜單相同。通常工具欄與其對應的菜單項ID相同,這樣,在程序運行時。可以通過單擊工具欄上的按鈕來調用相應菜單項的命令。2/5/202320創建工具欄——4個步驟工具欄編程Step1:創建工具欄資源;Step2:構造CToolBar對象;Step3:調用Create或CreateEx函數創建Window工具欄(工具欄也是窗口)Step4:調用LoadToolBar函數加載工具欄資源。2/5/202321創建自定義工具欄工具欄編程 if(!m_newToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|| !m_newToolBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate } m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_newToolBar);CToolBarm_newToolBar;//主框類頭文件添加工具欄按鈕資源后,在主框類OnCreate函數中加入以下代碼:2/5/202322顯示和隱藏工具欄工具欄編程voidCMainFrame::OnTest(){ if(m_newToolBar.IsWindowVisible()) m_newToolBar.ShowWindow(SW_HIDE); else m_newToolBar.ShowWindow(SW_SHOW);

RecalcLayout();

DockControlBar(&m_newToolBar);}voidCMainFrame::OnUpdateTest(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());}2/5/202323顯示和隱藏工具欄(更簡單的方法)工具欄編程voidCMainFrame::OnTest(){

ShowControlBar(&m_newToolBar, !m_newToolBar.IsWindowVisible(),FALSE);}2/5/202324內容安排界面編程更改光標、標題圖標、窗口背景工具欄編程狀態欄編程添加啟動界面更改窗口大小、標題、風格2/5/202325狀態欄的提示行與指示器狀態欄編程狀態欄分為兩部分:提示行與指示器。

左邊最長的部分為提示行,通常用于顯示菜單項或工具按鈕的提示信息。右邊由若干窗格組成的部分為狀態欄指示器,通常用來顯示大小寫鍵、數字鎖定鍵等信息。框架程序專門提供了一個indicators數組來管理提示行與指示器。如果要修改狀態欄的外觀,則只需在indicators數組中添加或減少相應的字符串資源ID即可。2/5/202326在指示器窗格中添加時鐘顯示狀態欄編程①在資源編輯器中新增字符串資源ID:IDS_TIMER時鐘②將新的字符串資源ID添加到indicators數組中staticUINTindicators[]={ ID_SEPARATOR,//statuslineindicator

IDS_TIMER, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};2/5/202327在指示器窗格中添加時鐘顯示(續)狀態欄編程③獲取系統當前時間(加在CMainFrame的OnCreate函數的后部) CTimet=CTime::GetCurrentTime(); CStringstr=t.Format("%H:%M:%:%S");④將字符串顯示到狀態欄的窗格上,調用CStatusBar類的成員函數SetPaneTextm_wndStatusBar.SetPaneText(1,str);如果不知道窗格的索引,可以調用CStatusBar類的成員函數CommandToIndex獲得。intindex=0;index=m_wndStatusBar.CommandToIndex(IDS_TIMER);m_wndStatusBar.SetPaneText(index,str);2/5/202328在指示器窗格中添加時鐘顯示(續)狀態欄編程⑤調整窗格大小CStatusBar類的成員函數:SetPaneInfo,該函數可以為指定的窗格設置新的ID、樣式和寬度。 CTimet=CTime::GetCurrentTime(); CStringstr=t.Format("%H:%M:%:%S"); CClientDCdc(this); CSizesz=dc.GetTextExtent(str); m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx); m_wndStatusBar.SetPaneText(1,str);⑥在OnTimer中添加代碼2/5/202329在提示行中添加鼠標坐標顯示狀態欄編程方法一:調用SetWindowText函數設置狀態欄提示行文本voidCUIView::OnMouseMove(UINTnFlags,CPointpoint){ //TODO:Addyourmessagehandlercodehereand/orcalldefault CStringstr; str.Format("x=%d,y=%d",point.x,point.y); ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str); CView::OnMouseMove(nFlags,point);}2/5/202330在提示行中添加鼠標坐標顯

溫馨提示

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

評論

0/150

提交評論