您的位置:首页 > 编程语言

MFC SDI单文档 状态栏 进度条 启动画面编程技巧 ...

2011-07-31 02:11 274 查看
状态栏的编程离不开 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 就完成了启动画面的添加

对于启动时间 画面 我们可以自行在生成的类中设置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: