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

状态栏的编程离不开 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 就完成了启动画面的添加

对于启动时间 画面 我们可以自行在生成的类中设置



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值