zoukankan      html  css  js  c++  java
  • 用Win32 实现进度条

    转载:http://www.cctry.com/thread-238862-1-1.html

      1     #include <windows.h>
      2     #include <commctrl.h>        //InitCommonControls
      3     #pragma comment(lib, "comctl32") //InitCommonControls
      4     //过程函数的返回值都是LRESULT,类型都是CALLBACK
      5     LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
      6     int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpszCmdLine,int nCmdShow)
      7     {
      8         HWND hwnd;        //主窗口句柄,在CreateWindow中赋值
      9         MSG msg;        //消息变量,在GetMessage中使用
     10         WNDCLASS wndclass;        //窗口类
     11         TCHAR* szAppName = TEXT("ProgressBar");    //类名和窗口名
     12         wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    //窗口背景
     13         wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);        //鼠标
     14         wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);    //图标
     15         wndclass.lpszClassName = szAppName;        //类名
     16         wndclass.cbClsExtra = 0;        //类的额外参数
     17         wndclass.cbWndExtra = 0;        //窗口的额外参数.用于基于同一窗口类的窗口各自区分.
     18                                         //在自定义对话框类时必须指定为DLGWINDOWEXTRA的大小
     19         wndclass.lpszMenuName = NULL;    //菜单名.可以用作子窗口的id
     20         wndclass.style = CS_HREDRAW | CS_VREDRAW;    //窗口风格
     21         wndclass.lpfnWndProc = WndProc;        //窗口过程
     22         wndclass.hInstance = hInstance;        //包含窗口过程的实例句柄
     23 
     24         if( !RegisterClass(&wndclass) )        //注册窗口类
     25             return 0;
     26         hwnd = CreateWindow(                //创建窗口
     27                     szAppName,                //窗口类名
     28                     szAppName,                //窗口标题
     29                     WS_OVERLAPPEDWINDOW,    //窗口风格
     30                     CW_USEDEFAULT,            //初始的x坐标
     31                     CW_USEDEFAULT,            //初始的y坐标
     32                     CW_USEDEFAULT,            //初始的宽度
     33                     CW_USEDEFAULT,            //初始的高度
     34                     NULL,                    //父窗口
     35                     NULL,                    //菜单
     36                     hInstance,                //和窗口相关的实例句柄
     37                     NULL                    //额外参数
     38                     );
     39         ShowWindow( hwnd,nCmdShow );        //显示窗口
     40         UpdateWindow( hwnd );                //更新窗口
     41         while( GetMessage(&msg,NULL,0,0) )    //消息循环
     42         {
     43             TranslateMessage(&msg);            //将WM_XXXKEYXXX消息翻译为WM_CHAR消息
     44             DispatchMessage(&msg);            //传递消息到窗口过程
     45         }   
     46         return msg.wParam;                    //返回
     47     }
     48 
     49     DWORD WINAPI PBThreadProc( LPVOID lpParameter )
     50     {
     51         HWND hwndPB = (HWND) lpParameter;    //进度条的窗口句柄
     52         PBRANGE range;                        //进度条的范围
     53        
     54         SendMessage( hwndPB, PBM_SETRANGE,    //设置进度条的范围
     55             (WPARAM)0, (LPARAM)(MAKELPARAM(0,100)) );
     56        
     57         SendMessage( hwndPB, PBM_GETRANGE,    //获取进度条的范围
     58             (WPARAM)TRUE,                    //TRUE 表示返回值为范围的最小值,FALSE表示返回最大值
     59             (LPARAM)&range );
     60 
     61         while(TRUE)
     62         {
     63             SendMessage( hwndPB, PBM_DELTAPOS, //设置进度条的新位置为当前位置加上范围的1/20
     64                 (WPARAM)((range.iHigh-range.iLow)/20), (LPARAM)0 );
     65             if( SendMessage( hwndPB, PBM_GETPOS, (WPARAM)0, (LPARAM)0 ) //取得进度条当前位置
     66                  == range.iHigh )
     67             {
     68                 SendMessage( hwndPB, PBM_SETPOS, (WPARAM)range.iLow, (LPARAM)0 ); //将进度条复位
     69             }
     70             Sleep(1000);
     71         }
     72     }
     73 
     74 
     75     LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
     76     {
     77         static HWND hwndPB;
     78         switch( message )
     79         {
     80         case WM_CREATE:
     81             {
     82                 InitCommonControls(); //确保已注册了进度条类PROGRESS_CLASS
     83                 hwndPB = CreateWindowEx(
     84                     0,
     85                     PROGRESS_CLASS,
     86                     NULL,
     87                     WS_CHILD | WS_VISIBLE,
     88                     0,0,0,0,            //位置和大小在WM_SIZE中设置
     89                     hwnd,
     90                     (HMENU)0,
     91                     ((LPCREATESTRUCT)lParam)->hInstance,
     92                     NULL);
     93                 CreateThread(            //操作进度条的线程
     94                     NULL,
     95                     0,
     96                     (LPTHREAD_START_ROUTINE)PBThreadProc,
     97                     hwndPB,
     98                     0,
     99                     0
    100                     );
    101                 return 0;
    102             }
    103         case WM_SIZE:
    104             {
    105                 RECT rc;
    106                 GetClientRect(hwnd, &rc);
    107                 MoveWindow(
    108                     hwndPB,
    109                     rc.left,
    110                     (rc.bottom - rc.top )/4,
    111                     rc.right - rc.left,
    112                     (rc.bottom - rc.top )/10,
    113                     TRUE
    114                     );
    115                 return 0;
    116             }
    117         case WM_DESTROY:
    118             PostQuitMessage(0);
    119             return 0;
    120         }
    121         return DefWindowProc( hwnd,message,wParam,lParam );
    122     }
  • 相关阅读:
    JS在文本框光标处插入文本
    nodejs.exe版安装
    JS实现移动层
    JS实现日历
    Ajax相关
    机器学习 目录
    Butterfly 主题魔改记录
    《机器学习》西瓜书习题 第 6 章
    numpy 中判断某字符串 array 是否含有子字符串
    《机器学习》西瓜书习题 第 5 章
  • 原文地址:https://www.cnblogs.com/chechen/p/4106469.html
Copyright © 2011-2022 走看看