轉載: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 }