




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七講界面編程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類(lèi)的PreCreateWindow成員函數(shù)進(jìn)行。該函數(shù)有個(gè)類(lèi)型是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)題并未改變,原因及解決方法見(jiàn)下頁(yè)。例:更改應(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類(lèi)的OnCreate函數(shù)中調(diào)用SetWindowLong函數(shù)實(shí)現(xiàn)。SetWindowLong(HWNDhWnd,intnIndex,LONGdwNewLong)該函數(shù)的作用是改變制定窗口的屬性(包括設(shè)置新的窗口風(fēng)格、設(shè)置新的窗口過(guò)程、設(shè)置新的應(yīng)用程序?qū)嵗直龋?。要改變窗口的風(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;}如果是在已有類(lèi)型的基礎(chǔ)上進(jìn)行修改的話(huà),那么可以利用GetWindowLong這個(gè)函數(shù)獲得這個(gè)窗口的現(xiàn)有類(lèi)型,然后修改。例如: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類(lèi)的OnCreate函數(shù)中調(diào)用SetWindowText函數(shù)實(shí)現(xiàn)。更改窗口大小、標(biāo)題、風(fēng)格在應(yīng)用程序窗口創(chuàng)建之后修改大小,可在CMainFrame類(lèi)的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)、窗口背景之前對(duì)于窗口的大小、標(biāo)題和風(fēng)格是在創(chuàng)建窗口時(shí)設(shè)定的。而光標(biāo)、圖標(biāo)和背景是在設(shè)計(jì)窗口類(lèi)時(shí)指定的。窗口類(lèi)的設(shè)計(jì)與注冊(cè)是由MFC底層代碼自動(dòng)完成的,我們不可能、也不應(yīng)該去修改MFC底層代碼。但是我們可以編寫(xiě)自己的窗口類(lèi)注冊(cè),然后讓隨后的窗口按照我們編寫(xiě)的窗口類(lèi)去創(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以上代碼存在的問(wèn)題、原因及解決方法更改光標(biāo)、標(biāo)題欄圖標(biāo)、窗口背景
上述代碼的運(yùn)行結(jié)果是:僅僅是程序的標(biāo)題欄圖標(biāo)發(fā)生了改變,但窗口的背景和光標(biāo)沒(méi)有改變。
原因是:視類(lèi)窗口覆蓋在主窗口上面,我們看到的窗口實(shí)際上是視類(lèi)窗口,而上述代碼修改的是框架類(lèi)窗口的背景和光標(biāo)。應(yīng)用程序的圖標(biāo)屬于框架窗口,因此上述程序運(yùn)行后,圖標(biāo)發(fā)生了改變。
結(jié)論:在MFC中,如果要修改應(yīng)用程序窗口的圖標(biāo),則應(yīng)該框架類(lèi)中進(jìn)行,因?yàn)榭蚣艽翱诓庞袠?biāo)題欄;如果要修改程序窗口的背景和光標(biāo),則應(yīng)該在視類(lèi)中進(jìn)行。
解決方法:在視類(lèi)的PreCreateWindow函數(shù)中添加代碼:cs.lpszClass="hello";2/5/202313一個(gè)簡(jiǎn)單的修改函數(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è)置指定窗口所屬窗口類(lèi)的WNDCLASS結(jié)構(gòu)體中指定數(shù)據(jù)成員的屬性(包括設(shè)置新的窗口背景畫(huà)刷、光標(biāo)、圖標(biāo)和窗口類(lèi)樣式)。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)畫(huà)圖標(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)畫(huà)圖標(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)按鈕命令工具欄編程工具欄是把常用的菜單命令集合起來(lái),以按鈕的形式提供給用戶(hù)使用,目的是方便用戶(hù)的操作。工具按鈕的添加、刪除都在資源編輯器窗口中的工具欄編輯窗口中完成。添加按鈕響應(yīng)命令的方法與菜單相同。通常工具欄與其對(duì)應(yīng)的菜單項(xiàng)ID相同,這樣,在程序運(yùn)行時(shí)。可以通過(guò)單擊工具欄上的按鈕來(lái)調(diào)用相應(yīng)菜單項(xiàng)的命令。2/5/202320創(chuàng)建工具欄——4個(gè)步驟工具欄編程Step1:創(chuàng)建工具欄資源;Step2:構(gòu)造CToolBar對(duì)象;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;//主框類(lèi)頭文件添加工具欄按鈕資源后,在主框類(lèi)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顯示和隱藏工具欄(更簡(jiǎn)單的方法)工具欄編程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)欄分為兩部分:提示行與指示器。
左邊最長(zhǎng)的部分為提示行,通常用于顯示菜單項(xiàng)或工具按鈕的提示信息。右邊由若干窗格組成的部分為狀態(tài)欄指示器,通常用來(lái)顯示大小寫(xiě)鍵、數(shù)字鎖定鍵等信息??蚣艹绦?qū)iT(mén)提供了一個(gè)indicators數(shù)組來(lái)管理提示行與指示器。如果要修改狀態(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類(lèi)的成員函數(shù)SetPaneTextm_wndStatusBar.SetPaneText(1,str);如果不知道窗格的索引,可以調(diào)用CStatusBar類(lèi)的成員函數(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類(lèi)的成員函數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《財(cái)務(wù)分析教學(xué)課件》課件
- 2025年江蘇省南京市中考英語(yǔ)第一次模擬測(cè)試卷(一)(南京卷)(含解析)
- 2024-2025年山東省濟(jì)南天橋區(qū)濼口實(shí)驗(yàn)學(xué)校第二學(xué)期八年級(jí)道德與法治期中考試試題(含答案)
- 鐵路旅客運(yùn)輸服務(wù)鐵路旅客運(yùn)輸服務(wù)質(zhì)量規(guī)范76課件
- 鐵路橋隧無(wú)損檢測(cè)任務(wù)一認(rèn)識(shí)無(wú)損測(cè)試課件
- 《Python程序設(shè)計(jì)基礎(chǔ)》課件 第二章 Python 基礎(chǔ)語(yǔ)法
- 《GB 16351-1996醫(yī)用γ射線(xiàn)遠(yuǎn)距治療設(shè)備放射衛(wèi)生防護(hù)標(biāo)準(zhǔn)》(2025版)深度解析
- 《GB 7000.1-2015燈具 第1部分:一般要求與試驗(yàn)》(2025版)深度解析
- 中化經(jīng)典文化課件
- 中專(zhuān)護(hù)理課件
- FCT測(cè)試培訓(xùn)教材
- 2025年遼寧省丹東市公安局招聘輔警22人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年山東海運(yùn)股份有限公司招聘筆試參考題庫(kù)含答案解析
- DBJ33T 1286-2022 住宅工程質(zhì)量常見(jiàn)問(wèn)題控制標(biāo)準(zhǔn)
- DBJ33T 1104-2022 建設(shè)工程監(jiān)理工作標(biāo)準(zhǔn)
- 2025年社會(huì)治安綜合治理工作計(jì)劃范文
- 實(shí)習(xí)生安全教育培訓(xùn)
- 電影音樂(lè)欣賞知到智慧樹(shù)章節(jié)測(cè)試課后答案2024年秋華南農(nóng)業(yè)大學(xué)
- 《四川省聲環(huán)境質(zhì)量自動(dòng)監(jiān)測(cè)系統(tǒng)質(zhì)量保 證及質(zhì)量控制技術(shù)規(guī)范》 編制說(shuō)明
- CEMS培訓(xùn)標(biāo)準(zhǔn)教材
- 職業(yè)培訓(xùn)機(jī)構(gòu)收費(fèi)及退款政策管理制度
評(píng)論
0/150
提交評(píng)論