狀态欄的程式設計離不開 CStatusBar類 CProgressCtrl 進 度條相關的控件 下面我們介紹狀态欄 程式設計技巧 以及在狀态欄添加進度條 應用程式的啟動界面
狀态欄的添加步驟 SDI 單文檔中 下面是MFC給的 狀态欄的建立步驟
Construct the CStatusBar object.
構造一個 CStatusBar對象
Call the Create (or CreateEx) function to create the status-bar window and attach it to the CStatusBar object.
調用CreateEx函數建立一個狀态欄
Call SetIndicators to associate a string ID with each indicator
調用SetIndicators 為每個訓示器附加一個 字元串資源ID static UINT indicators[]={
........
};
1. 下面是在架構類的處理 添加我們自己的狀态欄訓示器 我們可以定義自己的訓示器數組
static UINT indicator[] =
{
ID_SEPARATOR, // status line indicator 最長的那個格索引為 0
ID_INDICATOR_CAPS, //每個代表一個字元串資源
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
...... //這裡增加字元串資源 會反映到狀态欄
};
OnCreate(LPCREATESTRUCTION lp)函數中 有如下代碼
if (!m_wndStatusBar.Create(this) || //建立
!m_wndStatusBar.SetIndicators(indicator, //設定訓示器的個數
sizeof(indicator)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
2.給狀态欄 指定ID号的訓示器 增加時間 這時候用到 CTime類 獲得系統時間 下面是代碼 CStatusBar m_statusBar; 在相應WM_PAINT消息相應函數 OnPaint
SetTimer(1000,1000,NULL);
捕獲WM_TIMER消息 在OnTimer函數中 添加如下代碼
CTime time=CTime::GetCurrentTime();// 經過靜态方法傳回一個CTime對象
CString str=time.Format("%H:%M:%S"); //格式化時間 到str
CClientDC dc(this); //建立一個 架構類的dc
CSize size=dc.GetTextExtent(str); //獲得字元串中在螢幕上顯示的尺寸
int index =m_wndStatusBar.CommandToIndex(IDS_TIMER); //通過ID擷取索引
m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,size.cx); //設定訓示器的寬度
m_wndStatusBar.SetPaneText(index,str); //設定指定索引訓示器的文本
3.在狀态欄的 IDS_PROGRESS上添加一個 進度條 CProgressCtrl 類 在架構類增加變量 CProgressCtrl m_progress;
在OnPaint函數 添加代碼響應 WM_PAINT消息
CRect rect; //建立CRect對象
m_wndStatusBar.GetItemRect(m_wndStatusBar.CommandToIndex(IDS_PROGRESS),&rect); //獲得一個指定索引的訓示器的矩形區域
if(!m_progress.m_hWnd) //判斷句柄是否為空
{
m_progress.Create(PBS_SMOOTH|WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123); //如果句柄為空那麼建立進度條
}
else
m_progress.MoveWindow(&rect); //否則移動到目前區域
m_progress.SetPos(50); //設定進度條初始位置 50
在 OnTimer函數中加上 m_stausBar.StepIt();//進度條按指定步長 一秒 前進一次
4.在最長的訓示器上顯示 視圖的X Y坐标 我們需要相應視圖的 WM_MOUSEMOVE事件 并且調用 架構類的函數執行
#include "MainFrm.h"
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
CString str="";
str.Format("x=%d,y=%d",point.x,point.y);
// (((CMainFrame*)GetParent())->m_wndStatusBar).SetWindowText(str); //直接通過狀态欄指針設定索引為0訓示器
// (((CMainFrame*)GetParent())->m_wndStatusBar).SetPaneText(0,str); //設定按鈕文本 索引為0
// ((CMainFrame*)GetParent())->SetMessageText(str);//架構類的函數 直接設定 索引為0的狀态欄訓示器文本
// ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str); //通過架構類函數獲得 狀态欄指針 然後調用SetWindowText設定文本
GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str); //CWnd類的函數獲得一個子孫窗體的指針 我們可以傳遞狀态欄ID獲得
CView::OnMouseMove(nFlags, point);
}
5.增加啟動畫面 我們可以利用向導增加之後 我們自行設定 啟動畫面的 style
project->add to project ->comments controls 添加-> vc++ components -> splash screen 就完成了啟動畫面的添加
對于啟動時間 畫面 我們可以自行在生成的類中設定