用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     }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM