在sdk中使用進度條

演示瞭如何在sdk中創建進度條.並演示了相關的幾個消息的使用

#include <windows.h>
#include 
<commctrl.h>        //InitCommonControls
#pragma comment(lib, "comctl32") //InitCommonControls
//過程函數的返回值都是LRESULT,類型都是CALLBACK
LRESULT 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;    //菜單名.可以用作子窗口的id
    wndclass.style = CS_HREDRAW | CS_VREDRAW;    //窗口風格
    wndclass.lpfnWndProc = WndProc;        //窗口過程
    wndclass.hInstance = hInstance;        //包含窗口過程的實例句柄

    
if!RegisterClass(&wndclass) )        //註冊窗口類
        return 0;
    hwnd 
= CreateWindow(                //創建窗口
                szAppName,                //窗口類名
                szAppName,                //窗口標題
                WS_OVERLAPPEDWINDOW,    //窗口風格
                CW_USEDEFAULT,            //初始的x座標
                CW_USEDEFAULT,            //初始的y座標
                CW_USEDEFAULT,            //初始的寬度
                CW_USEDEFAULT,            //初始的高度
                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/20
            (WPARAM)((range.iHigh-range.iLow)/20), (LPARAM)0 ); 
        
if( SendMessage( hwndPB, PBM_GETPOS, (WPARAM)0, (LPARAM)0 ) //取得進度條當前位置
             == range.iHigh )
        {
            SendMessage( hwndPB, PBM_SETPOS, (WPARAM)range.iLow, (LPARAM)
0 ); //將進度條復位
        }
        Sleep(
1000);
    }
}


LRESULT WINAPI WndProc( HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam )
{
    
static HWND hwndPB;
    
switch( message )
    {
    
case WM_CREATE:
        {
            InitCommonControls(); 
//確保已註冊了進度條類PROGRESS_CLASS
            hwndPB = 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 );
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章