版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
/MFC中添加狀態(tài)欄1.首先在stringtable里添加兩個(gè)字串,ID分別為IDS_INDICATOR_MESSAGEandIDS_INDICATOR_TIME2.在你的dlg.h類里面加個(gè)CStatusBarm_bar;3.在dlg.cpp開頭加上staticUINTindicators[]={
IDS_INDICATOR_MESSAGE,
IDS_INDICATOR_TIME};4.OnInitDialog里面加上m_bar.Create(this);//Wecreatethestatusbarm_bar.SetIndicators(indicators,2);//SetthenumberofpanesCRectrect;GetClientRect(&rect);//Sizethetwopanesm_bar.SetPaneInfo(0,IDS_INDICATOR_MESSAGE,
SBPS_NORMAL,rect.Width()-100);
m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH,0);//ThisiswhereweactuallydrawitonthescreenRepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
ID_INDICATOR_TIME);5.時(shí)間顯示OnInitDialog里面加SetTimer(1,1000,NULL);為你的dlg類添加WM_TIMER的響應(yīng)函數(shù),在其中添加代碼:
CTimet1;
t1=CTime::GetCurrentTime();
m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));
CDialog::OnTimer(nIDEvent);這樣添加的程序剛開始運(yùn)行時(shí)在時(shí)間一欄中顯示的是初始設(shè)置的字符,為了使程序在剛開始運(yùn)行時(shí)就顯示系統(tǒng)時(shí)間,可在m_bar.SetPaneInfo(1,IDS_INDICATOR_TIME,SBPS_STRETCH,0);后添加如下代碼:CTimet1;
t1=CTime::GetCurrentTime();
m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));這樣在程序剛啟動(dòng)時(shí)就會(huì)顯示系統(tǒng)時(shí)間,然后實(shí)時(shí)更新。以上編譯完成后,可能會(huì)彈不出程序需要清理解決方案,重新生成解決方案同時(shí)狀態(tài)欄顯示的是:設(shè)置字符串的時(shí)候的文字信息///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////本來以為自己對MFC有所了解的,最近再寫程序的時(shí)候才發(fā)現(xiàn),原來我對MFC一竅不通,記錄一下吧:
第一步、先件兩個(gè)字符串資源:IDS_STATESTRING1,IDS_STATESTRING2,分別用來顯示提示信息和版權(quán)信息!
第二步、創(chuàng)建一個(gè)數(shù)組,分別將上面的兩個(gè)字符串資源ID寫到里面:staticUINTindicators[]={IDS_STATESTRING1,IDS_STATESTRING2};
第三步、再M(fèi)FC的對話框類中添加成員變量:CStatusBar
m_wndStatusBar;
第四步、由于創(chuàng)建狀態(tài)欄要再主對話框創(chuàng)建成功以后創(chuàng)建,所以就再對話框初始化的時(shí)候添加吧!
到這里就創(chuàng)建好了!
如果要調(diào)整狀態(tài)欄每個(gè)窗格的大小可以這樣,比如我要調(diào)整第一個(gè)窗格的大?。簃_WndStatusBar.SetPaneInfo(0,m_WndStatusBar.GetDlgCtrlID(),SBPS_NORMAL,650);
在程序中,如果要改變制定窗格中文字的化,這樣:m_WndStatusBar.SetPaneText(0,"提示:恭喜你,參數(shù)設(shè)置成功...");
如果出現(xiàn)字符不能正常顯示等問題的話,需要給這個(gè)控件添加Update處理函數(shù):
CRectrect;
GetClientRect(rect);
if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Can'tcreatestatusbar\n");
returnfalse;
}
m_wndStatusBar.MoveWindow(0,rect.bottom-20,rect.right,20));//調(diào)整狀態(tài)欄的位置和大小例如:在MainFrm.h中添加
afx_msgvoidOnUpdate1(CCmdUI*pCmdUI);
在MainFrm.cpp中添加
ON_UPDATE_COMMAND_UI(ID_INDICATOR_1(要顯示字的欄),OnUpdate1)
實(shí)現(xiàn)函數(shù):
voidCMainFrame::OnUpdate1(CCmdUI*pCmdUI)
{
pCmdUI->Enable();
好了,就這么多~~~//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////1、在狀態(tài)欄中設(shè)置兩個(gè)新的欄位Timer和Progress。首先到ResourceView中編輯StringTable,增加IDS_TIMER(時(shí)間),PROGRESS(進(jìn)度)。然后在MainFrame的OnCreate函數(shù)中修改indicators數(shù)組,插入IDS_TIMER和PROGRESS。插入的位置,即為顯示的位置。2、現(xiàn)在我們讓狀態(tài)欄上的IDS_TIMER的位置顯示系統(tǒng)當(dāng)前的時(shí)間。我們只要在MainFrame的OnCreate函數(shù)中寫入:CTimet=CTime::GetCurrentTime();
//獲得當(dāng)前的系統(tǒng)時(shí)間CClientDCdc(this);
CSizesz=dc.GetTextExtent(str);
//設(shè)置一個(gè)CClientDC對象來獲取str的長度
CStringstr=t.Format("%H:%M:%S");
//格式可以參考MSDN中的strftime函數(shù)
intindex=0;
index=m_wndStatusBar.CommandToIndex(IDS_TIMER);
//此處也可以直接輸入IDS_TIMER在indicators數(shù)組中從0開始的序號(hào)。m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);
//設(shè)置狀態(tài)欄寬度
m_wndStatusBar.SetPaneText(index,str);
//設(shè)置IDS_TIMER指示器字符串如果我們在MainFrame的OnCreate函數(shù)中,添加一個(gè)SetTimer(1,1000,NULL);并在OnTimer消息響應(yīng)函數(shù)中,插入以上代碼,便可實(shí)現(xiàn)隨時(shí)變化時(shí)間的狀態(tài)欄。3、在窗口中創(chuàng)建一個(gè)進(jìn)度欄首先,在MainFrame中新建一個(gè)成員變量private:CProgressCtrm_progress;然后在OnCreate函數(shù)中,寫入:m_progress.Create(WS_CHILD|WS_VISIBLE,CRect(100,100,200,130),this,123);
/*在MainFrame的10,40位置,產(chǎn)生一個(gè)長100,高30的進(jìn)度欄,注意在CRect中,后兩個(gè)數(shù)一定要大于前兩個(gè),否則會(huì)產(chǎn)生一個(gè)虛框,看不見任何東西。如果產(chǎn)生一個(gè)垂直的進(jìn)度欄,只要在第一個(gè)參數(shù)中或一個(gè)PBS_VERTICAL參數(shù)即可*/
m_progress.SetPos(50);
/*進(jìn)度欄顯示為50%*/4、現(xiàn)在我們將狀態(tài)欄中的PROGRESS欄位顯示一個(gè)50%的進(jìn)度欄。如果我們只是簡單的在MainFrame的OnCreate函數(shù)中寫入以下代碼:CRectrect;
m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
/*獲取IDS_PROGRESS欄位的CRect值,付給rect*/
m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);
/*在IDS_PROGRESS的位置顯示一個(gè)50%的進(jìn)度欄*/
m_progress.SetPos(50);你會(huì)發(fā)現(xiàn)IDS_PROGRESS欄位仍然顯示的是“進(jìn)度”兩個(gè)字。這是為什么呢?原因是因?yàn)?,在OnCreate函數(shù)中,窗臺(tái)和狀態(tài)欄并沒有真正創(chuàng)建完畢,所以GetItemRect函數(shù)無法獲取IDS_PROGRESS欄位的CRect值。解決的辦法是,添加一個(gè)自定義的消息,把消息放入消息隊(duì)列,等窗體和狀態(tài)欄創(chuàng)建完畢后,再通過消息響應(yīng),創(chuàng)建進(jìn)度欄。步驟如下:4.1在MainFrame的頭文件中,自定義個(gè)消息#includeUM_PROGRESSWM_USER+1
//自定義的消息ID,注意要在WM_USER=0x0400之后。4.2然后添加消息響應(yīng)原型protected:
//{{AFX_MSG(CMainFrame)
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnTimer(UINTnIDEvent);
afx_msgvoidOnViewNewtool();
afx_msgvoidOnUpdateViewNewtool(CCmdUI*pCmdUI);
//}}AFX_MSG
afx_msgvoidOnProgress();
//定義消息響應(yīng)原形
DECLARE_MESSAGE_MAP()4.3接著在MainFrame中添加消息映射BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_COMMAND(IDM_VIEW_NEWTOOL,OnViewNewtool)
ON_UPDATE_COMMAND_UI(IDM_VIEW_NEWTOOL,OnUpdateViewNewtool)
//}}AFX_MSG_MAP
ON_MESSAGE(UM_PROGRESS,OnProgress)
//添加消息映射
END_MESSAGE_MAP()4.5然后再return0;之前發(fā)布消息:PostMessage(UM_PROGRESS);
/*注意這里要用PostMessage不能用SendMessage,否則系統(tǒng)會(huì)先處理OnProgress消息響應(yīng),然后再創(chuàng)建窗體,出現(xiàn)仍看不見進(jìn)度欄的情況。必須用PostMessage先把消息放入消息響應(yīng)隊(duì)列當(dāng)中,等窗體創(chuàng)建完畢后,系統(tǒng)再處理OnProgress函數(shù)。*/4.4最后寫OnProgress函數(shù)voidCMainFrame::OnProgress()
{
CRectrect;
m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);
m_progress.SetPos(50);
}
這時(shí)在IDS_PROGRESS狀態(tài)欄中就能看到進(jìn)度欄了。但是還存在問題,當(dāng)改變窗口大小時(shí),進(jìn)度欄會(huì)離開IDS_PROGRESS欄位位置。5、另一種簡單的方法可以實(shí)現(xiàn)以上相同的功能,并且可以解決以上的問題,是利用windows窗體發(fā)生重繪時(shí)的消息響應(yīng)函數(shù)。在MainFrame中右鍵增加一個(gè)windows的WM_PAINT消息響應(yīng)函數(shù),然后加入一下代碼:CRectrect;
m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
if(!m_progress.m_hWnd)
/*注意這里必須增加一個(gè)判斷,否則在窗體再次發(fā)生重繪時(shí),
由于已經(jīng)存在m_progress實(shí)例,會(huì)出現(xiàn)一個(gè)錯(cuò)誤。*/
{
m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,123);
}
else
{
m_progress.MoveWindow(rect);
/*移動(dòng)窗口,比SetWindowPos簡單。*/
}
m_progress.SetPos(50);6、現(xiàn)在我們要讓狀態(tài)欄上顯示鼠標(biāo)在窗口中的坐標(biāo)。由于View窗體在MainFrame框架前,所以我們要響應(yīng)的是View窗體上OnMouseMove事件。首先我們在View類中右鍵新建一個(gè)window消息響應(yīng)函數(shù),添加一個(gè)WM_MOUSEMOVE的消息響應(yīng)函數(shù)。添加如下代碼:CStringstr;
str.Format("x=%d,y=%d",point.x,point.y);
溫馨提示
- 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機(jī)器人輔助管道維修-深度研究
- 機(jī)器人檢測數(shù)據(jù)分析-深度研究
- 智能交通系統(tǒng)風(fēng)險(xiǎn)評估-深度研究
- 無線網(wǎng)絡(luò)安全態(tài)勢研究-深度研究
- 智能化地磅數(shù)據(jù)管理-深度研究
- 2025年廣西體育高等??茖W(xué)校高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 圖書館空間設(shè)計(jì)研究-深度研究
- 2025年山西財(cái)貿(mào)職業(yè)技術(shù)學(xué)院高職單招語文2018-2024歷年參考題庫頻考點(diǎn)含答案解析
- 2025年山東化工職業(yè)學(xué)院高職單招高職單招英語2016-2024歷年頻考點(diǎn)試題含答案解析
- 基礎(chǔ)設(shè)施公募REITs融資模式研究
- 2024-2025學(xué)年山東省濰坊市高一上冊1月期末考試數(shù)學(xué)檢測試題(附解析)
- 數(shù)學(xué)-湖南省新高考教學(xué)教研聯(lián)盟(長郡二十校聯(lián)盟)2024-2025學(xué)年2025屆高三上學(xué)期第一次預(yù)熱演練試題和答案
- 決勝中層:中層管理者的九項(xiàng)修煉-記錄
- 幼兒園人民幣啟蒙教育方案
- 高考介詞練習(xí)(附答案)
- 單位就業(yè)人員登記表
- 衛(wèi)生監(jiān)督協(xié)管-醫(yī)療機(jī)構(gòu)監(jiān)督
- 記錄片21世紀(jì)禁愛指南
- 腰椎間盤的診斷證明書
- 移動(dòng)商務(wù)內(nèi)容運(yùn)營(吳洪貴)任務(wù)七 裂變傳播
- 單級(jí)倒立擺系統(tǒng)建模與控制器設(shè)計(jì)
評論
0/150
提交評論