MyMFC(7-9)对话框 CMainFrame

// MainFrm.cpp : CMainFrame 类的实现
//

#include "stdafx.h"
#include "MyMFC2-Dialog.h"

#include "MainFrm.h"
#include "Splash.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_COMMAND(IDM_VIEW_NEWTOOLBAR, &CMainFrame::OnViewNewtoolbar)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_NEWTOOLBAR, &CMainFrame::OnUpdateViewNewtoolbar)
	ON_WM_PAINT()	
END_MESSAGE_MAP()

static UINT indicators[] =   //系统为创建状态栏而建立的数组,四个元素分别为最长的提示符,键盘上Caps Lock,Num Lock,Scroll Lock的ID
{
	ID_SEPARATOR,           // 状态行指示器
	IDS_TIMER,
	IDS_PROGRESS,
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

// CMainFrame 构造/析构

CMainFrame::CMainFrame()
{
	// TODO:  在此添加成员初始化代码
}

CMainFrame::~CMainFrame()
{
}

//extern CStyleApp theApp;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE0("未能创建工具栏\n");
		return -1;      // 未能创建
	}
	//上面是工具栏的创建,下面是状态栏的创建
	if (!m_wndStatusBar.Create(this))
	{
		TRACE0("未能创建状态栏\n");
		return -1;      // 未能创建
	}
	m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); //SetIndicators函数设置状态栏指示器,
																			   //第一个参数是上面创建的数组,第二个参数是元素的个数

	// TODO:  如果不需要可停靠工具栏,则删除这三行
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);
	// TODO:

/****************************************************************************************************************************/
/*	//在窗口创建之后来修改窗口的外观,在PreCreateWindow中是在窗口创建之前修改
	SetWindowLong(m_hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);  //把窗口命中的“无标题”去掉了
	SetWindowLong(m_hWnd, GWL_STYLE, GetWindowLong(m_hWnd, GWL_STYLE)&~WS_MAXIMIZEBOX);  //去掉最大化按钮,GetWindowLong是获取窗口的现有类型
	//参数1、指定要获取的窗口句柄
	//2、指定要获取的信息类型,是窗口类型、背景、鼠标类型
	//3、要改变成什么类型
	*/



//动态窗口图标
/****************************************************************************************************************************************/
	//创建动态窗口图标,利用定时器和SetClassLong函数,在框架类中的OnCreate函数中可以实现
	//这个功能的实现是在,窗口创建之后完成的,所以在OnCreate函数中
//首先,把几幅图像放到自己工程目录中的res文件夹中
//然后,导入。在资源视图-Icon文件夹-右击-添加资源-选中Icon-再选择导入,选择res目录中刚加载的图
//再,在框架类中定义一个图标句柄数组成员变量,用来存放这三幅图标的句柄

	m_hIcons[0] = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
	m_hIcons[1] = LoadIcon(theApp.m_hInstance, MAKEINTRESOURCE(IDI_ICON2));
	m_hIcons[2] = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDI_ICON3));
	//1.之前使用的都是系统标准图标,所以LoadIcon函数的第一个参数都为NULL,但这里用的是自定义的图标,那么第一个参数应设为应用程序的当前实例句柄
	//上面的三个LoadIcon函数使用三种方法来获得当前实例句柄的
	//2.是图像的名称或者图像资源标识字符串,但这里只有资源的ID号,所以必须用MSKEINTRESOURCE宏将ID号转换为资源标识符字符串

	SetClassLong(m_hWnd, GCL_HICON, (LONG)m_hIcons[0]);  //把第一幅图设置为窗口图标,这样在程序启动以后就不会再显示原来的图标

	SetTimer(1, 500, NULL); //设置定时器500毫秒触发一次
	//1.指定一个非零值的定时器标志。这个标识将作为返回值返回
	//2.指定定时器的时间间隔。指定多长时间发送一次WM_TIMER消息,以毫秒为单位,1000即为1秒
	//3.一个函数指针,并且要求是一个回调函数(CALLBACK类型的),若有则会调用其函数;若设为NULL
	//则定时消息WM_TIMER会被放到应用程序的消息队列中,由响应的窗口函数OnTimer来处理



/*********************************************************************************************************************************/
	//创建工具栏
	//在本函数OnCreate中,前面自动生成的那些代码,就是在构建系统窗口的工具栏
	//步骤:
	//1.创建工具栏资源,资源视图-Toolbar-右击-添加资源-Toolbar
	//2.在框架类的头文件中构造CToolBar对象
	//3.在框架类的OnCreate函数中调用CreateEx函数创建工具栏,并把它与已创建的CToolBar对象关联起来
	//4.调用LoadToolBar函数加载工具栏资源
//CreateEx函数的参数
	//1.指定工具栏对象的父窗口
	//2.设置内嵌在工具栏上的CToolBarCtrl对象创建时的扩展风格,默认为TBSTYLE_FLAT
	//3.指定工具栏的样式。如:WS_CHILD子窗口,WS_VISIBLE可视,CBRS_RIGHT显示在框架窗口的右侧
	//4.定义工具栏窗口边框的宽度
	//5.指定工具栏子窗口的ID
	if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_newToolBar.LoadToolBar(IDR_TOOLBAR1))  //LoadToolBar加载所建的工具栏资源
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}
	m_newToolBar.EnableDocking(CBRS_ALIGN_ANY);  //设置工具栏停靠的位置.上面if中的CBRS_RIGHT是设置工具栏产生时的位置,而本句代码的意思
												 //是当工具栏移动以后,可以再次停靠的位置
	EnableDocking(CBRS_ALIGN_ANY);  //这句代码与上一句不同,目的是让主框架窗口可以被停靠的位置。这句可以省略,因为在上面,产生系统工具栏时,自动产生的代码中,就设置好了
	DockControlBar(&m_newToolBar);  //让工具栏停靠在主框架窗口上

	//为该工具栏相关联一个菜单栏上面的菜单项,实现工具栏的显示和隐藏的功能
	//见下面的OnViewNewtoolbar()函数




/**********************************************************************************************************************************/
	//修改状态栏
	//若要添加状态栏,与添加工具栏类似,先在框架类中声明一个CStatusBar的成员变量,再仿照OnCreate函数前面的代码去写.(一般不会去添加,只是修改)
	//修改状态栏的外观,例如:添加和减少状态栏上的窗格,只需在上面的indicators数组中添加或减少相应的字符串资源ID即可
	//添加的步骤:1.在资源视图-String Table中添加 2.把相应的ID号放在indicators数组中即可。(注意数组中元素的顺序即为在状态栏中顺序)
/***************************/
//在状态栏中显示系统的时间
/*	CTime t = CTime::GetCurrentTime();  //获取当前系统时间
	CString str = t.Format("%y-%m-%d %H:%M:%S");  //设置时间格式%y%m%d年月日
	CClientDC dc(this);
	CSize sz = dc.GetTextExtent(str);  //获取文本的长度
	m_wndStatusBar.SetPaneInfo(1, IDS_TIMER, SBPS_NOBORDERS, sz.cx);  //#####把状态栏中的窗格的宽度设为自适应字符串的长度############
	//参数:1.indicators的索引号
	//2.为窗格重新设置的新ID,这里不需要,输入要来的ID号即可
	//3.窗口格式的样式
	//4.指定窗格新的宽度
	m_wndStatusBar.SetPaneText(1,str);  //将字符串显示到状态栏上
	//参数
	//1.indicators数组的索引,即要将字符串输入到状态栏的哪一个窗格中
	//2.所要输出的字符串

	//但是,这样得到的只是一个静止的时间,要让时间动起来,就得把它们放到一个定时器中OnTimer,所以把上面的代码剪切到OnTimer函数中
	//因为程序前面设置过SetTimer(1, 500, NULL)了,所以又OnTimer函数,如果没有设置过,那么先要在这里设置SetTimer(1, 500, NULL)
	*/




/***********************/
//创建进度栏
	//首先在框架类中添加一个CProgressCtrl类型的成员变量
	//在状态栏的窗格中创建进度栏,是把窗格的区域作为进度栏的大小。但是我们可以改变窗格的大小,利用上面的m_wndStatusBar.SetPaneInfo(1, IDS_TIMER, SBPS_NOBORDERS, sz.cx)
/*	CRect rect;
	m_wndStatusBar.GetItemRect(2, &rect);  //获得窗格的大小,保存在rect中。第一个参数是指定indicators数组的索引
	m_progress.Create(WS_CHILD | WS_VISIBLE, rect, &m_wndStatusBar, 221);
	//m_progress.Create(WS_CHILD | WS_VISIBLE, CRect(200, 200, 300, 220), this, 222);
	//参数1.指定进度栏控件的类型,因为进度栏也是窗口,所以她具有窗口所具有的各种类型,同时,它还有自己的类型
	//PBS_VERTICAL垂直显示,默认为水平显示;PBS_SMOOTH
	//2.指定控件的大小和位置
	//3.指定进度栏的父窗口
	//4.指定进度栏控件的ID
	m_progress.SetPos(50);  //设置进度栏上当前的进度显示,100为满。
	*/

	//上面用GetItemRect函数并不能获得窗框的大小,因为此时在构造窗口的应用程序中窗格的摆放操作还没有完成。这时去获得窗框的大小是不可能
	//解决方案:因为框架类的OnCreate函数是在响应框架窗口的WM_CREATE消息时调用的,只有在这个函数执行完成之后,才能够获得窗口状态栏上窗格的大小
	//所以,我们可以自定义一条消息,然后在框架类的OnCreate函数中在其返回之前发送这条消息,最后再自定义的消息响应函数中去用GetItemRect函数来获得窗格的大小
	//自定义消息的具体步骤:1.在框架类的头文件中声明消息,#define UM_PROGRESS WM_USER+1 //为了避免我们自定义的消息与其他消息的ID值发生冲突,利用WM_USER+n来避免
	//(一般Window消息用WM_为前缀,用户自定义的消息一般用UM_为前缀)2.在框架类的头文件中声明响应函数afx_msg void OnProgress()
	//3.在框架类的.cpp中添加消息映射,因为命令消息用ON_COMMAND,对于用户自定义的消息用ON_MESSAGE,ON_MESSAGE(UM_PROGRESS,OnProgress)
	//4.添加消息响应函数void CMainFrame::OnProgress(){...},把上面的代码复制到里面即可。

	//########注意:在OnCreate函数中发送这个自定义的消息,不能用SendMessage(UM_PROGRESS)。因为这样只是类似于一个函数的调用,SendMessage函数
	//发送消息的机制是直接把消息发送给消息响应函数,由消息响应函数处理完成之后,SendMessage函数才返回。这时OnCreate函数还没有执行完成,响应函数就已经执行完了。#######
	//#########应该用PostMessage(UM_PROGRESS)函数,它把消息放到消息队列中就立即返回,继续执行OnCreate函数,这个函数执行完成之后,MFC底层代码
	//调用GetMessage函数才从消息队列中取出UM_PROGRESS消息去执行。
/************************************************************/
	//上面的利用自定义消息的方法可以实现在状态栏的窗格中创建进度栏,但是当窗口的尺寸发生变化后,进度栏的位置会发生错误,因为窗口大小发生变化,会引起窗口的重绘
	//就会发送一个WM_PAINT消息,所以,我们不必去自定义一个消息,利用已有的WM_PAINT消息来代替上面自定义的UM_PROGRESS消息即可。
	//并且不需要在OnCreate函数中发送PostMessage消息,因为当窗口第一次显示时,会调用OnPaint函数




/*******************************************************************************************************************************/
	//在状态栏上显示鼠标当前位置
	//在视类中的WM_MOUSEMOVE消息响应函数中完成(###################注意一定要在View类中添加WM_MOUSEMOVE消息#######################)




/*******************************************************************************************************************************/
	//创建启动画面(失败)
	//需要新添加一个类Splash,和在bitmap中加载启动画面
	CSplashWnd::ShowSplashScreen(this);	//调用启动画面的程序


	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)  //这是一个虚函数
{//改变CREATRSTRUCT结构体的值,那么调用CreateWindowEx函数时的参数也会发生相应的改变,从而创造出符合我们要求的窗口.(改变窗口的外观)
	if (!CFrameWnd::PreCreateWindow(cs))
		return FALSE;
	// TODO:  在此处通过修改

/******************************************************************************************************************************************************/
	//  CREATESTRUCT cs 来修改窗口类或样式
	// CRREATRSTRUCT结构体中的数据成员与CreateWindowExpect函数中的参数一致,(###只是顺序相反###)
	//CreateWindow函数有11个参数  
	//1.lpszName指定窗口类的名称,即为你在第一步中设计窗口类的名称。表示要产生这一类型的窗口,是注册过的窗口名  
	//2.lpszName指定标题栏的名称  
	//*3.style创建窗口的样式。注意与WNDCLASS中的style成员与CreateWindow函数的dwstyle参数不同,前者是指定窗口类的样式,基于该窗口类创建的窗口都具有这样的样式,  
	//后者是指定某个具体的窗口的样式,如:创建(###一个有标题栏和边框的窗口###)、带有系统菜单的窗口、(###具有可调边框的窗口###)、具有最小化按钮、最大化按钮的窗口  
	//WS_OVERLAPPEDWINDOW参数是所有样式的综合,利用取反~,值&,可以去掉一些功能,如&~WS_THICKFRAME则,窗口不能调节大小了  
	//4,5.x,y指定窗口左上角的x,y坐标。(即出现在屏幕上的位置)  
	//6,7.cx,cy指定窗口的宽度、高度。若任意一个设为CW_USEDEFAULT,系统默认宽高,另外一个参数必须省略  
	//**8.hwndParaent指定被创建窗口的父窗口句柄,当窗口中还有窗口时,必须设置,该参数是HWDN类型的  
	//9.hMenu指定窗口菜单的句柄,可能与上面的参数lpszClassName有关  
	//10.hInstancd指定窗口所属的应用程序实例的句柄,由WinMain函数参数提供的  
	//11.lpCreatrParams作为WM_CREATE消息的附加参数lparam传入的数据指针。在创建多文档界面的客户窗口时,lpParam必须指向CLIENTCREATESTRUCT.一般设为NULL  
	//多了一个参数 dwExStyle
	//顺序相反

/****************************************************************************************************************************/
	//改变MFC自动生成的应用程序外观和大小
/*	cs.cx = 1000;
	cs.cy = 600;
	cs.style &= ~FWS_ADDTOTITLE;  //要为窗口改变名称,必须先把窗口style中的FWS_ADDTOTITLE类型取出掉
	cs.lpszName = _T("呵呵呵");	
	*/
	//对于窗口的类型和大小是在创建窗口时设定的,而图标、光标、和背景是在设计窗口类时指定的,所以要改变它们,就要编写窗口类、注册、创建
//方法一(不好)
/*	WNDCLASS wndcls;
	wndcls.cbClsExtra=0; //类的额外内存
	wndcls.cbWndExtra=0;  //窗口的额外内存
	wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wndcls.hCursor=LoadCursor(NULL,IDC_HELP);
	wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
	wndcls.hInstance=AfxGetInstanceHandle();  //获取当前应用程序的实例句柄
	wndcls.lpfnWndProc=::DefWindowProc;  //窗口过程函数,因为只是修改窗口,可以让它等于这个
	wndcls.lpszClassName=_T("sunxin.org");  //雷明
	wndcls.lpszMenuName=NULL;  //菜单名
	wndcls.style=CS_HREDRAW | CS_VREDRAW;  //窗口类的类型
	RegisterClass(&wndcls); //注册窗口类
	cs.lpszClass=_T("sunxin.org");  //####程序框架窗口类按照我们上面所设计的窗口类来创建
	//但是,窗口的背景颜色、光标的类型没有改变,因为这两项是在视类中,所以要在视类中的PreCreateWindow函数中去修改
	//因为我们设计的这个窗口类已经注册了,所以在视类PreCreateWindow函数中,可以直接使用这个窗口类名。
	//即,在视类中添加cs.lpszClass=_T("sunxing.org");即可

	//综上所述:如要修改窗口的图标,(标题栏上)应该在框架类中;如果要修改窗口的背景、光标,应该在视类
	*/
//方法二(好)
	//方法一太麻烦,MFC中有一个专门的函数用来设定窗口的类型、光标、背景、和图标	
//cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, 0, 0, LoadIcon(NULL, IDI_WARNING));  //返回值为注册之后的类名
	//1.窗口类的类型
	//2,3是光标和背景,应为在框架类中设置它们是毫无意义的,所以这里设为0,在视类中要设置
	//4.窗口的图标设置




	







	return TRUE;

}

// CMainFrame 诊断

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}
#endif //_DEBUG


// CMainFrame 消息处理程序



void CMainFrame::OnTimer(UINT_PTR nIDEvent)
{
	// TODO:  在此添加消息处理程序代码和/或调用默认值


/****************************************************************************************************************************************/
	//实现窗口图标动态显示
	static int index = 0;
	SetClassLong(m_hWnd, GCL_HICON, (LONG)m_hIcons[index]);
	//参数1.指定要设置新属性的窗口句柄
	//2.指定要设置的属性的索引。
	//GCL_HBRBACKGROUND 设置背景画刷(在视类中设置)
	//GCL_HCURSOR	    设置光标(在视类中设置)
	//GCL_HICON		    设置窗口图标(在框架类中设置)
	//GCL_STYLE		    数值窗口样式(都可以设置)
	//3.指定要设置的新的属性值
	index = ++index % 3;  //在0,1,2三个数中循环



/*****************************************************************************************************************************/
	//在状态栏中“动态的”显示系统的时间
	CTime t = CTime::GetCurrentTime();  //获取当前系统时间
	CString str = t.Format("%y-%m-%d %H:%M:%S");  //设置时间格式%y%m%d年月日
	CClientDC dc(this);
	CSize sz = dc.GetTextExtent(str);  //获取文本的长度
	m_wndStatusBar.SetPaneInfo(1, IDS_TIMER, SBPS_NOBORDERS, sz.cx);  //#####把状态栏中的窗格的宽度设为自适应字符串的长度############
	//参数:1.indicators的索引号
	//2.为窗格重新设置的新ID,这里不需要,输入要来的ID号即可
	//3.窗口格式的样式
	//4.指定窗格新的宽度
	m_wndStatusBar.SetPaneText(1, str);  //将字符串显示到状态栏上
	//参数
	//1.indicators数组的索引,即要将字符串输入到状态栏的哪一个窗格中
	//2.所要输出的字符串

	//但是,这样得到的只是一个静止的时间,要让时间动起来,就得把它们放到一个定时器中OnTimer




/*******************************************************************************************************************************/
	//让状态栏中的进度栏动起来
	m_progress.StepIt();  //默认每个一秒前进一步
	//它是当进度栏达到最大范围后,又从头开始一点一点的前进



	CFrameWnd::OnTimer(nIDEvent);
}


void CMainFrame::OnViewNewtoolbar()  //这是添加的command消息
{
	// TODO:  在此添加命令处理程序代码
/******************************************************************************************************************************/
	//实现自定义的工具栏通过在菜单栏中单击实现显示与隐藏
//方法一
/*  if (m_newToolBar.IsWindowVisible())
	{
		m_newToolBar.ShowWindow(SW_HIDE);
	}
	else
	{
		m_newToolBar.ShowWindow(SW_SHOW);
	}
	RecalcLayout();  //若没有这条代码,实现的只是把工具栏上面的按钮隐藏了,但是工具栏依然存在
	DockControlBar(&m_newToolBar);  //若没有这条代码,当把工具栏浮动后,再隐藏,也只是隐藏按钮,工具栏依然存在

	//这种方法最终实现,当工具栏浮动后,隐藏再显示,则会默认的显示在客户区的顶部
	*/
//方法二(简单)并且这种方法最终实现,当工具栏浮动后,隐藏再显示,则显示在原来浮动后的位置
	ShowControlBar(&m_newToolBar, !m_newToolBar.IsWindowVisible(), FALSE);
	//参数
	//1.指向将要显示或隐藏的控制条,即所建的工具栏
	//2.为TRUE则显示指定的控制条;FALSE表示隐藏指定的控制条
	//3.为TRUE表示延迟显示,为FALSE表示立刻显示

	//要实现为菜单项设置复选标记,即前面有对勾的表示。那么就要为这个菜单项再添加一个UPDATE_COMMAND_UI的消息响应
	//见下面的OnUpdateViewNewtoolbar(CCmdUI *pCmdUI)函数

}
void CMainFrame::OnUpdateViewNewtoolbar(CCmdUI *pCmdUI)
{
	// TODO:  在此添加命令更新用户界面处理程序代码
/*********************************************************************************************************************/
	//实现为自己创建的工具栏相关联的菜单项,前面的对勾标识符的显示与隐藏
	pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());
}


void CMainFrame::OnPaint()
{
	CPaintDC dc(this); // device context for painting
	// TODO:  在此处添加消息处理程序代码

/****************************************************************************************************************************/
	//在状态栏的窗格中创建进度栏
	//但是,当改变窗口大小时,会发生错误。因为进行窗口重绘,会调用OnPaint这个消息响应函数,但是,这时程序已经创建了一个进度栏,所以再次创建时
	//就会出错。我们可以进行判断,如果没有创建进度栏,那么我们就创建它。如果已经创建了,那么我们就移动进度栏到目标区域
	//可以利用m_progress.m_hWnd对象的窗口句柄,如果其值为NULL,则说明该对象还没有被创建,否则就是创建了对象	
	CRect rect;
	m_wndStatusBar.GetItemRect(2, &rect);  //获得窗格的大小,保存在rect中。第一个参数是指定indicators数组的索引
	if (!m_progress.m_hWnd)
		m_progress.Create(WS_CHILD | WS_VISIBLE, rect, &m_wndStatusBar, 221);	
	//参数1.指定进度栏控件的类型,因为进度栏也是窗口,所以她具有窗口所具有的各种类型,同时,它还有自己的类型
	//PBS_VERTICAL垂直显示,默认为水平显示;PBS_SMOOTH
	//2.指定控件的大小和位置
	//3.指定进度栏的父窗口
	//4.指定进度栏控件的ID
	else
		m_progress.MoveWindow(rect);  //把进度栏移动到目标矩形区域中
	m_progress.SetPos(50);  //设置进度栏上当前的进度显示,100为满。

/*************************************************************/
	//让这个进度栏动起来,在定时器OnTimer中去设置
	//可以通过成员函数StepIt来完成,它会使进度栏控件的当前位置按照一定的步长前进。步长可以通过成员函数SetStep来设置。还可以通过成员函数
	//SetRange来设置它的范围,如:根据影片的播放时间来设置进度栏的范围









	
	// 不为绘图消息调用 CFrameWnd::OnPaint()
}



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值