状态栏的设计
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,设置一个指示器数组
sizeof(indicators)/sizeof(UINT)))//设定数组中的元素
{
TRACE0("Failed to create status bar/n");
return -1; // fail to create
(indicators的定义为一个数组如下:
static UINT indicators[] =
{
ID_SEPARATOR, // 状态栏的最长的一条
IDS_TIMER,//我们添加的一个时间的项 (要在字符串资源中加入两个项分别表示时间与进度)
IDS_PROGRESS,//我们添加的一个进度的项
ID_INDICATOR_CAPS,//键盘大小写的项
ID_INDICATOR_NUM,//键盘数字的项
ID_INDICATOR_SCRL,//键盘滚动的项
};为了在状态栏里加入一个时间,我们想到了类CTime里有一个GetCurrentTime()成员函数得到当前的时间,然后用我们这个类下的Format方法可以将时间进行格式化返回一个CString的对象,用%D ( Total days in this CTime) %H (Hours in the current day) %M (Minutes in the current hour) %S ( Seconds in the current minute)方式格式化,例子如下
CTime t=CTime::GetCurrentTime();//定义一个CTime 的对象t,并调用CTime::GetCurrentTime()函数对t进行给值.
CString str;//定义一个strr字符串
str=t.Format("%H:%M:%S");//并调用t.Format("%H:%M:%S")函数对strt进行格式化
CClientDC dc(this);//构造一个DC
CSize sz=dc.GetTextExtent(str);//得到
int index=0;
index=m_wndStatusBar.CommandToIndex(IDS_TIMER);
m_wndStatusBar.SetPaneInfo(index,IDS_TIMER,SBPS_NORMAL,sz.cx);//调用SetPaneInfo获得一个时钟的长度
m_wndStatusBar.SetPaneText(index,str);
但是这样子只能得到一个静止的时间,于是我们要调用SetTimer()在CMainFrame::OnTimer(UINT nIDEvent) 下添加以下代码就可以实现一个时间而不再静止时间了.
CTime t=CTime::GetCurrentTime();
CString str=t.Format("%H:%M:%S");
CClientDC dc(this);
CSize sz=dc.GetTextExtent(str);
m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
m_wndStatusBar.SetPaneText(1,str);
在状态栏上加入显示鼠标坐标的位置
我们知道,view窗口始终是在框架窗口之上,所以我们到C**DView类里添加一个OnMouseMove(UINT nFlags, CPoint point)函数的消息响应,在这个函数里,我们的步骤如下.
1、 CString str;
2、 str.Format("x=%d,y=%d",point.x,point.y);//对鼠标点的X,Y坐标进行格式化
3、有四种方法来实现把鼠标移动时坐标点位置显示在状态栏的第一个面板上
A、((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);因为框架窗口是view窗口父类,首先得到一个父窗口GetParent(),又因为GetParent()返回的是CWnd指针,机时这里要得到是一个CMainFrame的指针,所以要用(CMainFrame*)对GetParent()强制转换,然后调用m_wndStatusBar的成员变量,同时要把m_wndStatusBar定义改为Public的成员变量,最后用SetWindowText(str)(设置窗口文本)函数将鼠标移动时坐标点位置到状态栏的面板上,这样就可以把鼠标移动时坐标点位置显示在状态栏的第一个面板上.
B、((CMainFrame*)GetParent())->SetMessageText(str);由于这个函数是将鼠标移动时坐标点位置直接放到状态栏面板上,于是,就不必调用m_wndStatusBar的成员变量,
C、((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);GetMessageBar()可以返回一个指向状态栏窗口的指针,我们就可直接调用GetMessageBar()获得一个状态栏窗口的指针,接着再去调用SetWindowText(str)将鼠标移动时坐标点位置到状态栏的面板上
D、GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);GetDescendantWindow()是CWnd类的一个成员函数,他也就得到了一个CWnd的指针,他通过给定的ID号AFX_IDW_STATUS_BAR(状态栏窗口的ID号)获得一个子孙窗口,他搜索所有的子孙窗口的树,直到找到我们给定的ID号为止.最后用SetWindowText(str)(设置窗口文本)函数将鼠标移动时坐标点位置到状态栏的面板上
在自己的应用程序上加入一个启动画面
我们在菜单下的subject下Add To Subject的Components And Controls....(组件与控件),在弹出的一个对话框里选择VC++ Components下的选择Splash screen,点插入,接着点OK,最后点CLOSE退出.编译创建工程就可以出现一个默认的启动画面,同样子在资源里可以改变位图与修改他的启动时间(找到OnCreate下的SetTimer(1, 750, NULL);).