演示瞭如何在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 );
}
#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 );
}