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