MFC中添加狀態(tài)欄顯示時(shí)間1_第1頁
MFC中添加狀態(tài)欄顯示時(shí)間1_第2頁
MFC中添加狀態(tài)欄顯示時(shí)間1_第3頁
MFC中添加狀態(tài)欄顯示時(shí)間1_第4頁
MFC中添加狀態(tài)欄顯示時(shí)間1_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論