vc 进度条控件(一)

方法1:
单线程方式。
将你的任务分成多个部分,每运行一部分,就更新一下进度条。
这种方法就是很烦人。

方法2:
双线程方式。
主线程负责完成你想要的工作。副线程负责更新进度条。
更新进度条可以按照计时方法,或者根据主线程完成任务的状态来更新。
因此,你的主线程在完成任务时,还得用一个临界区随时报告任务的完成状态。

方法3:
双线程方式
主线程负责更新进度条,并且创建副线程完成任务的某部分工作。但这和单线程很像。


 

 


 

图一 例子效果

玩过破天的朋友知道,游戏更新时进度是用位图表示的,我觉的挺漂亮的,于是自己动手做了一个类来实现那种效果。

这个类的名字叫CBmpProgCtrl,继承于CStatic,使用方法如下。

1、首先要将BmpProgCtrl.h和BmpProgCtrl.cpp添加到工程中。

2、导入两幅位图,作为前景和背景。资源标识分别为IDB_FORE和IDB_BACK.

3、在对话框上,放置一个"Static Text"控件,修改其ID,只要不是默认的IDC_STATIC就可以了。

4、让这个控件和一个Control类型的变量关联,如变量名可以叫m_bmpprog。

5、找到该变量定义的地方,应该是CStatic m_bmpprog,修改CStatic为CBmpProgCtrl。并将头文件BmpProgCtrl.h包含进来。

6、调用该类的方法。

类成员方法介绍

void GetRange(int &lower,int &upper)返回进度条范围。
int GetPos()获得当前位置
int StepIt( )以当前步长使进度条增长
int SetStep( int nStep )设置步长
int SetPos( int nPos )设置位置
void SetRange( int nLower, int nUpper )设置进度条范围。

具体的可以看源代码。你可以修改它以符合自己的需要。你可能觉的这些方法很熟悉,是的,我参考了CProgressCtrl的方法名。

结束语

这个东西,比较简单,你可以很容易就使用。


  

 

在VC里想改变进度条颜色,在网上找了很多方法,都很麻烦,觉得很郁闷。后来想起在用VB做时,增经用API实现过,很简单。后来再一查,原来是SendMessage这个函数,几经试验,终于成功,高兴,与大家分享!!!!
       代码如下:    
      m_Progress1.SendMessage(PBM_SETBKCOLOR, 0, RGB(0, 0, 255));//背景色为蓝色
m_Progress1.SendMessage(PBM_SETBARCOLOR, 0, RGB(255, 0, 0));//前景色为红色
 
       至于别的控件能不能按这种办法来改变颜色,我还没试过,大家可以试一试,如果可以,请留言告诉我,先谢谢了 。
以下摘自《新编win32API大全》:
函数功能:该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。

     函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);

     参数:

     hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。

     Msg:指定被发送的消息。

     wParam:指定附加的消息指定信息。

     IParam:指定附加的消息指定信息。

     返回值:返回值指定消息处理的结果,依赖于所发送的消息。

     备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。

     如果指定的窗口是由调用线程创建的,则窗口程序立即作为子程序调用。如果指定的窗口是由不同线程创建的,则系统切换到该线程并调用恰当的窗口程序。线程间的消息只有在线程执行消息检索代码时才被处理。发送线程被阻塞直到接收线程处理完消息为止。

     Windows CE:Windows CE不支持Windows桌面平台支持的所有消息。使用SendMesssge之前,要检查发送的消息是否被支持。

     速 查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。
以下摘自MSDN:
RGB(redgreenblue)
Arguments
red
Required. Number in the range 0-255 representing the red component of the color.
green
Required. Number in the range 0-255 representing the green component of the color.
blue
Required. Number in the range 0-255 representing the blue component of the color.
 
二、         去掉进度条边框
m_Progress1.ModifyStyleEx(WS_EX_STATICEDGE,0);
m_Progress.Invalidate(false);
posted @ 2012-06-01 19:55  zearin  阅读(3061)  评论(0编辑  收藏  举报