日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

MFC状态栏编程(显示系统时间和进度条)

發(fā)布時(shí)間:2023/12/2 windows 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC状态栏编程(显示系统时间和进度条) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


顯示系統(tǒng)時(shí)間

1?在狀態(tài)欄中設(shè)置兩個(gè)新的欄位TimerProgress。首先到ResourceView中編輯String Table,增加IDS_TIMER(時(shí)間),PROGRESS(進(jìn)度)。然后在MainFrame中修改indicators數(shù)組,插入IDS_TIMERIDS_PROGRESS。插入的位置,即為顯示的位置。(添加字符串必須將字符串說明也寫上,不然無法新建)在CMainFrame中添加CProgressCtrl m_Progress;

2?現(xiàn)在我們讓狀態(tài)欄上的IDS_TIMER的位置顯示系統(tǒng)當(dāng)前的時(shí)間。我們只要在MainFrameOnCreate函數(shù)中寫入:

?CTimet=CTime::GetCurrentTime();??????????//獲得當(dāng)前的系統(tǒng)時(shí)間

CClientDC dc(this);
CSizesz=dc.GetTextExtent(str);??????????????//
設(shè)置一個(gè)CClientDC對(duì)象來獲取str的長度
CStringstr=t.Format("%H:%M:%S");???????//
格式可以參考MSDN中的strftime函數(shù)
?int index=0;
?index=m_wndStatusBar.CommandToIndex(IDS_TIMER);?????

//此處也可以直接輸入IDS_TIMERindicators數(shù)組中從0開始的序號(hào)。

//設(shè)置狀態(tài)欄寬度

?m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);????
?m_wndStatusBar.SetPaneText(index,str);????????????//
設(shè)置IDS_TIMER指示器字符串

3?OnCreate函數(shù)中添加SetTimer1,1000,NULL;語句,讓后為CMainFrame類添加WM_TIMER消息相應(yīng)函數(shù),在OnTimer函數(shù)中將上述代碼復(fù)制進(jìn)去,就可以實(shí)現(xiàn)隨時(shí)變化時(shí)間的狀態(tài)欄。?

添加進(jìn)度條:

1?現(xiàn)在我們將狀態(tài)欄中的PROGRESS欄位顯示一個(gè)50%的進(jìn)度欄。如果我們只是簡單的在MainFrameOnCreate函數(shù)中寫入以下代碼:

CRect rect;

?/*獲取IDS_PROGRESS欄位的CRect值,付給rect*/
?m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);???

/*IDS_PROGRESS的位置顯示一個(gè)50%的進(jìn)度欄*/
?m_progress.Create(WS_CHILD|WS_VISIBLE,rect,m_wndStatusBar,123);????

?m_progress.SetPos(50);

2?你會(huì)發(fā)現(xiàn)IDS_PROGRESS欄位仍然顯示的是進(jìn)度兩個(gè)字。這是為什么呢?原因是因?yàn)?#xff0c;在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)度欄。

添加自定義消息

1?MainFrame頭文件中添加自定義消息

#define WM_PROGRESS WM_USER+1

2?然后在頭文件中添加消息響應(yīng)函數(shù)

afx_msg LRESULT OnProgress(WPARAMwParam,LPARAM lParam);

cpp文件中添加消息映射

ON_MESSAGE(WM_PROGRESS,CMainFrame::OnProgress)

3?寫消息響應(yīng)函數(shù):

void CMainFrame::OnProgress()
{
???CRect rect;
???m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect);
???
if(m_Progress.GetSafeHwnd() == nullptr)

?????? m_Progress.Create(WS_CHILD|WS_VISIBLE,rect, &m_wndStatusBar, 123);

??? else m_Progress.ShowWindow(SW_SHOW);

???m_progress.SetPos(50);
}

4?去掉上一個(gè)步驟在OnCreate中添加的語句。

然后在OnCreate函數(shù)最后添加如下語句:

PostMessage(WM_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ù)。

5?這時(shí)就可以看見進(jìn)度跳了,但是還有個(gè)問題,當(dāng)窗口大小改變時(shí),進(jìn)度條會(huì)離開IDS_PROGRESS狀態(tài)欄的位置。可以使用下面的方法解決。

狀態(tài)欄隨窗口改變大小

1?MainFrame添加WM_SIZE消息相應(yīng)函數(shù),并添加如下代碼:

void CMainFrame::OnSize(UINT nType,int cx, int cy)

{

?????? CFrameWndEx::OnSize(nType, cx, cy);

?

?????? // TODO: 在此添加消息處理程序代碼

?????? if(m_wndStatusBar.GetSafeHwnd() != nullptr)

??? {

?????? CRectrect;

?????? m_wndStatusBar.GetItemRect(1,&rect);

?????? if(m_Progress.GetSafeHwnd() != nullptr)

?????? {

?????????? m_Progress.SetWindowPos(&wndTop,rect.left, rect.top,

????????????? rect.right- rect.left, rect.bottom - rect.top, 0);

?????? }

??? }

}

?

顯示鼠標(biāo)位置

1.??????現(xiàn)在我們要讓狀態(tài)欄上顯示鼠標(biāo)在窗口中的坐標(biāo)。由于View窗體在MainFrame框架前,所以我們要響應(yīng)的是View窗體上OnMouseMove事件。

2.??????首先我們?cè)?/span>View類中右鍵新建一個(gè)window消息響應(yīng)函數(shù),添加一個(gè)WM_MOUSEMOVE的消息響應(yīng)函數(shù)。添加如下代碼:

???????CStringstr;
???????str.Format(_T("x=%d,y=%d"),point.x,point.y);????????????????????/*
對(duì)鼠標(biāo)坐標(biāo)進(jìn)行格式化*/
?????((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);??????

/*由于作用的是View窗口的父窗口MainFrame下的m_wndStatusBar對(duì)象,所以必須將m_wndStatusBar設(shè)置為public,然后用(CMainFrame*)指名其為框架類指針,否則->后面不會(huì)出現(xiàn)m_wndStatusBar對(duì)象。注意在View程序中必須包含MainFrame的頭文件*/

也可以將最有一句改為:?((CMainFrame*)GetParent())->SetMessageText(str);直接由框架類函數(shù)中的SetMessageText實(shí)現(xiàn)對(duì)狀態(tài)欄文字的更改。

3.??????第三種實(shí)現(xiàn)方法是:?((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);通過框架類函數(shù)GetMessageBar來獲得指向狀態(tài)欄窗口的指針。這種方法的好處是,不需要再把MainFrame中的m_wndStatusBar設(shè)置為public

4.??????第四種方法:?GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);?因?yàn)?/span>GetDescendantWindow本來就是CWnd的成員函數(shù),所以不需要轉(zhuǎn)換為框架類對(duì)象,并根據(jù)ID號(hào),來獲得子孫窗口的對(duì)象指針,這里的AFX_IDW_STATUS_BAR,是由CStatusBar::Create默認(rèn)產(chǎn)生的。

?

?

總結(jié)

以上是生活随笔為你收集整理的MFC状态栏编程(显示系统时间和进度条)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。