实际应用中,通常一个程序都有一个底部状态栏来显示一些信息,比如绘图软件,通常是在状态栏上显示鼠标位置。
我们使用CreateWindow来创建一个状态栏窗口,尽管其内部也是调用CreateWindowEX,但具体没有什么差别。
hwndStatus=CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,int y,
int nWidth,int nHeight,
HWND hWndParent,
HMENU hMenu,
HANDLE hInstance,
PVOID lpParam
)
LPCTSTR lpClassName 是一直字符串指针,指定创建的窗口类名,状态栏的窗口类名是STATUSCLASSNAME,
LPCTSTR lpWindowName,也是字符串指针,指定窗口名称,创建状态栏的话,这个可以为空。
DWORD dwStyle 执行窗口风格,作为子窗口控件,WS_CHILD | WS_VISIBLE 一定要有,多种风格用|符号链接。
int x,int y,int nWidth,int nHeight。指定窗口创建的坐标位置,状态栏可以使用0,0,0,0。只要样式中不包含CCS_NOPARENTALIGN或CCS_NORESIZE风格,状态栏就会自动调整大小。
HWND hWndParent,,指定一个父窗口句柄。
HMENU hMenu,菜单句柄,状态栏等子窗口也设置为NULL,
HANDLE hInstance, 模块实例句柄,WinMain函数传递过来的句柄。
PVOID lpParam CREATESTRUCT结构,传递给WM_CREATE 消息的lParam参数,状态栏也可以设置为NULL。
//创建一个状态栏
hwndStatus=CreateWindow(STATUSCLASSNAME,"",SBS_SIZEGRIP|WS_CHILD | WS_VISIBLE,
0,0,0,0,hwnd,NULL,hInst,NULL);
//移动初始化状态栏
moveStatus(hwnd);
//设置状态栏分栏文本,WPARAM指定栏目
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)TEXT("就绪"));
//使用格式化字符串来设置状态栏文本
wsprintf(status_line,staformat,1,1);
wsprintf(status_size,sizeformat,0);
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)1, (LPARAM)status_line);
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)2, (LPARAM)status_size);
执行状态栏分割几部分。
void moveStatus(HWND hwnd)
{
RECT rcClient;
int width[3]; //状态栏分割数组
GetClientRect(hwnd, &rcClient); //获取父窗口矩形
int length=rcClient.right/3; //根据父窗口宽度来分割指定大小
width[0]=length; //状态栏第一栏宽度,为分割长度length
width[1]=length*2; //状态栏往后栏目宽度,为length*栏目标号
width[2]=length*3;
//根据width数组来设置状态栏
SendMessage(hwndStatus, SB_SETPARTS, 3, (LPARAM)(LPINT)width);
MoveWindow(hwndStatus,0,0,0,0,TRUE);
}
SendMessage(hwndStatus, SB_SETPARTS, 3, (LPARAM)(LPINT)width);
SB_SETPARTS消息用于来设置状态栏,第一个参数是状态栏句柄,第三个参数是用于讲状态栏分割几部分,这个3是分3栏显示。
(LPARAM)(LPINT)width ,width是一个int数组,里面元素保存了每个状态栏栏目的宽度。
等量把状态栏分三栏的话,第二栏为第一栏的2倍,同样,第三栏宽度为第一栏3倍。这个是状态栏宽度表示的方法。
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM)0, (LPARAM)TEXT("就绪"));
SB_SETTEXT消息用于设置指定栏目的文本。WPARAM为栏目标号,从0开始。LPARAM表示字符串指针。