第七講 界面編程_第1頁
第七講 界面編程_第2頁
第七講 界面編程_第3頁
第七講 界面編程_第4頁
第七講 界面編程_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

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

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

WS_OVERLAPPEDWINDOW;或者:更改窗口大小、標(biāo)題、風(fēng)格2/5/20236在窗口創(chuàng)建之后更改其風(fēng)格在應(yīng)用程序窗口創(chuàng)建之后修改它的風(fēng)格屬性,可在CMainFrame類的OnCreate函數(shù)中調(diào)用SetWindowLong函數(shù)實(shí)現(xiàn)。SetWindowLong(HWNDhWnd,intnIndex,LONGdwNewLong)該函數(shù)的作用是改變制定窗口的屬性(包括設(shè)置新的窗口風(fēng)格、設(shè)置新的窗口過程、設(shè)置新的應(yīng)用程序?qū)嵗直龋R淖兇翱诘娘L(fēng)格,則將該函數(shù)的第二個(gè)參數(shù)指定為GWL_STYLE,然后由第三個(gè)參數(shù)指定新的窗口風(fēng)格。更改窗口大小、標(biāo)題、風(fēng)格2/5/20237SetWindowLong實(shí)例更改窗口大小、標(biāo)題、風(fēng)格intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CFrameWnd::OnCreate(lpCreateStruct)==-1) return-1; ……

SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW); return0;}如果是在已有類型的基礎(chǔ)上進(jìn)行修改的話,那么可以利用GetWindowLong這個(gè)函數(shù)獲得這個(gè)窗口的現(xiàn)有類型,然后修改。例如:SetWindowLong(m_hWnd,GWL_STYLE,GetWindowLong(m_hWnd,GWL_STYLE)&~WS_MAXIMIZEBOX);2/5/20238在窗口創(chuàng)建之后更改標(biāo)題與大小在應(yīng)用程序窗口創(chuàng)建之后修改標(biāo)題,可在CMainFrame類的OnCreate函數(shù)中調(diào)用SetWindowText函數(shù)實(shí)現(xiàn)。更改窗口大小、標(biāo)題、風(fēng)格在應(yīng)用程序窗口創(chuàng)建之后修改大小,可在CMainFrame類的OnCreate函數(shù)中調(diào)用SetWindowPos函數(shù)實(shí)現(xiàn)。2/5/20239內(nèi)容安排界面編程更改光標(biāo)、標(biāo)題圖標(biāo)、窗口背景工具欄編程狀態(tài)欄編程更改窗口大小、標(biāo)題、風(fēng)格添加啟動(dòng)界面2/5/202310修改光標(biāo)、圖標(biāo)、背景的思路更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景之前對于窗口的大小、標(biāo)題和風(fēng)格是在創(chuàng)建窗口時(shí)設(shè)定的。而光標(biāo)、圖標(biāo)和背景是在設(shè)計(jì)窗口類時(shí)指定的。窗口類的設(shè)計(jì)與注冊是由MFC底層代碼自動(dòng)完成的,我們不可能、也不應(yīng)該去修改MFC底層代碼。但是我們可以編寫自己的窗口類注冊,然后讓隨后的窗口按照我們編寫的窗口類去創(chuàng)建。2/5/202311在窗口創(chuàng)建之前更改更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景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以上代碼存在的問題、原因及解決方法更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景

上述代碼的運(yùn)行結(jié)果是:僅僅是程序的標(biāo)題欄圖標(biāo)發(fā)生了改變,但窗口的背景和光標(biāo)沒有改變。

原因是:視類窗口覆蓋在主窗口上面,我們看到的窗口實(shí)際上是視類窗口,而上述代碼修改的是框架類窗口的背景和光標(biāo)。應(yīng)用程序的圖標(biāo)屬于框架窗口,因此上述程序運(yùn)行后,圖標(biāo)發(fā)生了改變。

結(jié)論:在MFC中,如果要修改應(yīng)用程序窗口的圖標(biāo),則應(yīng)該框架類中進(jìn)行,因?yàn)榭蚣艽翱诓庞袠?biāo)題欄;如果要修改程序窗口的背景和光標(biāo),則應(yīng)該在視類中進(jìn)行。

解決方法:在視類的PreCreateWindow函數(shù)中添加代碼:cs.lpszClass="hello";2/5/202313一個(gè)簡單的修改函數(shù)更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景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在窗口創(chuàng)建之后更改更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景要在應(yīng)用程序窗口創(chuàng)建之后修改它的光標(biāo)、圖標(biāo)和背景,可在OnCreate函數(shù)中調(diào)用SetClassLong函數(shù)實(shí)現(xiàn)。SetClassLong(HWNDhWnd,intnIndex,LONGdwNewLong)該函數(shù)的作用是:重新設(shè)置指定窗口所屬窗口類的WNDCLASS結(jié)構(gòu)體中指定數(shù)據(jù)成員的屬性(包括設(shè)置新的窗口背景畫刷、光標(biāo)、圖標(biāo)和窗口類樣式)。2/5/202315SetClassLong實(shí)例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;}更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景2/5/202316動(dòng)畫圖標(biāo)更改窗口大小與標(biāo)題欄文字加載圖標(biāo)資源、設(shè)置定時(shí)器、添加定時(shí)器消息響應(yīng)函數(shù)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動(dòng)畫圖標(biāo)(續(xù))更改窗口大小與標(biāo)題欄文字voidCMainFrame::OnTimer(UINTnIDEvent){ staticintindex=1; SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[index]); index=++index%4; CFrameWnd::OnTimer(nIDEvent);}2/5/202318內(nèi)容安排界面編程更改光標(biāo)、標(biāo)題圖標(biāo)、窗口背景工具欄編程狀態(tài)欄編程添加啟動(dòng)界面更改窗口大小、標(biāo)題、風(fēng)格2/5/202319增加、刪除工具欄按鈕;響應(yīng)按鈕命令工具欄編程工具欄是把常用的菜單命令集合起來,以按鈕的形式提供給用戶使用,目的是方便用戶的操作。工具按鈕的添加、刪除都在資源編輯器窗口中的工具欄編輯窗口中完成。添加按鈕響應(yīng)命令的方法與菜單相同。通常工具欄與其對應(yīng)的菜單項(xiàng)ID相同,這樣,在程序運(yùn)行時(shí)??梢酝ㄟ^單擊工具欄上的按鈕來調(diào)用相應(yīng)菜單項(xiàng)的命令。2/5/202320創(chuàng)建工具欄——4個(gè)步驟工具欄編程Step1:創(chuàng)建工具欄資源;Step2:構(gòu)造CToolBar對象;Step3:調(diào)用Create或CreateEx函數(shù)創(chuàng)建Window工具欄(工具欄也是窗口)Step4:調(diào)用LoadToolBar函數(shù)加載工具欄資源。2/5/202321創(chuàng)建自定義工具欄工具欄編程 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函數(shù)中加入以下代碼: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內(nèi)容安排界面編程更改光標(biāo)、標(biāo)題圖標(biāo)、窗口背景工具欄編程狀態(tài)欄編程添加啟動(dòng)界面更改窗口大小、標(biāo)題、風(fēng)格2/5/202325狀態(tài)欄的提示行與指示器狀態(tài)欄編程狀態(tài)欄分為兩部分:提示行與指示器。

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

IDS_TIMER, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};2/5/202327在指示器窗格中添加時(shí)鐘顯示(續(xù))狀態(tài)欄編程③獲取系統(tǒng)當(dāng)前時(shí)間(加在CMainFrame的OnCreate函數(shù)的后部) CTimet=CTime::GetCurrentTime(); CStringstr=t.Format("%H:%M:%:%S");④將字符串顯示到狀態(tài)欄的窗格上,調(diào)用CStatusBar類的成員函數(shù)SetPaneTextm_wndStatusBar.SetPaneText(1,str);如果不知道窗格的索引,可以調(diào)用CStatusBar類的成員函數(shù)CommandToIndex獲得。intindex=0;index=m_wndStatusBar.CommandToIndex(IDS_TIMER);m_wndStatusBar.SetPaneText(index,str);2/5/202328在指示器窗格中添加時(shí)鐘顯示(續(xù))狀態(tài)欄編程⑤調(diào)整窗格大小CStatusBar類的成員函數(shù):SetPaneInfo,該函數(shù)可以為指定的窗格設(shè)置新的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在提示行中添加鼠標(biāo)坐標(biāo)顯示狀態(tài)欄編程方法一:調(diào)用SetWindowText函數(shù)設(shè)置狀態(tài)欄提示行文本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在提示行中添加鼠標(biāo)坐標(biāo)顯

溫馨提示

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

評論

0/150

提交評論