进度条的C语言
(来自网络) #include #include //InitCommonControls//过程函数的返回值都是LRESULT,类型都是CALLBACKLRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow){HWND hwnd; //主窗口句柄,在CreateWindow中赋值MSG msg; //消息变量,在GetMessage中使用WNDCLASS wndclass; //窗口类TCHAR* szAppName = TEXT(ProgressBar); //类名和窗口名wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); //鼠标wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //图标wndclass.lpszClassName = szAppName; //类名wndclass.cbClsExtra = 0; //类的额外参数wndclass.cbWndExtra = 0; //窗口的额外参数.用于基于同一窗口类的窗口各自区分.//在自定义对话框类时必须指定为DLGWINDOWEXTRA的大小wndclass.lpszMenuName = NULL; //菜单名.可以用作子窗口的idwndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口风格wndclass.lpfnWndProc = WndProc; //窗口过程wndclass.hInstance = hInstance; //包含窗口过程的实例句柄if( !RegisterClass(&wndclass) ) //注册窗口类return 0;hwnd = CreateWindow( //创建窗口szAppName, //窗口类名szAppName, //窗口标题WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, //窗口风格CW_USEDEFAULT, //初始的x坐标CW_USEDEFAULT, //初始的y坐标480, //初始的宽度200, //初始的高度NULL, //父窗口NULL, //菜单hInstance, //和窗口相关的实例句柄NULL //额外参数);ShowWindow( hwnd,nCmdShow ); //显示窗口UpdateWindow( hwnd ); //更新窗口while( GetMessage(&msg,NULL,0,0) ) //消息循环{TranslateMessage(&msg); //将WM_XXXKEYXXX消息翻译为WM_CHAR消息DispatchMessage(&msg); //传递消息到窗口过程}return msg.wParam; //返回}DWORD WINAPI PBThreadProc( LPVOID lpParameter ){HWND hwndPB = (HWND) lpParameter; //进度条的窗口句柄PBRANGE range; //进度条的范围SendMessage( hwndPB, PBM_SETRANGE, //设置进度条的范围(WPARAM)0, (LPARAM)(MAKELPARAM(0,100)) );SendMessage( hwndPB, PBM_GETRANGE, //获取进度条的范围(WPARAM)TRUE, //TRUE 表示返回值为范围的最小值,FALSE表示返回最大值(LPARAM)&range );while(TRUE){SendMessage( hwndPB, PBM_DELTAPOS, //设置进度条的新位置为当前位置加上范围的1/40(WPARAM)((range.iHigh-range.iLow)/40), (LPARAM)0 );if( SendMessage( hwndPB, PBM_GETPOS, (WPARAM)0, (LPARAM)0 ) //取得进度条当前位置== range.iHigh ){SendMessage( hwndPB, PBM_SETPOS, (WPARAM)range.iLow, (LPARAM)0 ); //将进度条复位}Sleep(1000); //每1秒更新一次进度条}}LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam ){static HWND hwndPB;switch( message ){case WM_CREATE:{InitCommonControls(); //确保已注册了进度条类PROGRESS_CLASShwndPB = CreateWindowEx(0,PROGRESS_CLASS,NULL,WS_CHILD | WS_VISIBLE,0,0,0,0, //位置和大小在WM_SIZE中设置hwnd,(HMENU)0,((LPCREATESTRUCT)lParam)->hInstance,NULL);CreateThread( //操作进度条的线程NULL,0,(LPTHREAD_START_ROUTINE)PBThreadProc,hwndPB,0,0);return 0;}case WM_SIZE:{RECT rc;GetClientRect(hwnd, &rc);MoveWindow(hwndPB,rc.left,(rc.bottom - rc.top )/4,rc.right - rc.left,(rc.bottom - rc.top )/10,TRUE);return 0;}case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc( hwnd,message,wParam,lParam );} 可以用到资源文件(.rc)//// SUPPORT FOR WINDOWS XP THEMES:// THIS WILL MAKE THE PROGRAM USE THE COMMON CONTROLS// LIBRARY VERSION 6.0 (IF IT IS AVAILABLE)//1 24 CtrlProgressBar.exe.Manifest
如何用C语言实现进度条
第一种,用printf模拟输出百分比,在控制台输出,实现进度监控。代码:#include#define N 20void mBar(float fBar){ int i,j,k,m; for ( i=0;i<N+6;i++ ) printf("\b"); k=N*fBar; m=fBar*100; printf("["); for ( i=0;i<k;i++ ) printf("="); for ( j=0;j<N-k;j++ ) printf(" "); printf("]%3d%%",m); }void delay(int n) { int i,j,k; for ( i=0;i<n;i++ ) for ( j=0;j<0x07fff;j++ ) k++; }void main(){ float x; int i; for ( i=0,x=0;i<100;i++,x+=0.01 ) { mBar(x); delay(1024); } mBar(1);}第二种,使用窗口组件。这个要看程序工作环境,纯粹的c语言是无法实现的。可以使VC++。Visual C++中的MFC类提供了标准的进度指示器控件(CProgressCtrl)。m_progress->GetPos(); //获取进度条的当前位置 m_progress->GetRange(int min,int max); //获取进度条控件的范围的下限和上限 m_progress->OffsetPos(int nPos); //用指定的增量推进进度条控件的当前位置,重绘进度条反映新位置 m_progress->SetBkColor(COLORREF clrNew); //设定进度条的背景颜色 m_progress->SerPos(int nPos); //设定进度条控件的当前位置,重绘进度条反映新位置 m_progress->SetRange(int min,int max); //设定进度条控件的范围的下限和上限 m_progress->SetRange32(int min,int max); //设定进度条控件的范围的下限和上限m_progress->SetStep(int nStep); //指定进度条控件的步进增量 m_progress->StepIt(); //通过步进增量,推进进度条控件的当前位置,重绘进度条反映新位置 应用: CProgressCtrl *m_progress; //头文件中声明在OnInitDialog初始化 { m_progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1); m_progress->SetRange(0,1000); m_progress->SetPos(0); UINT m_timer =(UINT) SetTimer(1,200,NULL); } 采用在定时器的消息处理函数WM_TIMER内添加不断更新进度条界面的方法 OnTimer (nIDEvent) { pos = pos + 50; if(pos>500) pos = 0; m_Progress->SetPos(pos); } 或者采用在某种循环体内添加不断更新进展条界面的方法

