win32 sdk 环境下创建状态栏

时间:2024-02-01 12:48:53

今天在学习状态栏,出了好多的问题,这里记录下.

要创建状态栏用:CreateStatusWindow

 

CreateStatusWindow函数创建一个状态窗口,通常用于显示应用程序的状态。窗口通常显示在父窗口的底部,它包含指定的文本。

HWND CreateStatusWindow(

LONG,    //状态栏样式

LPCTSTR,  //第一格要显示的字符串指针

HWND,    //父窗口句柄

UINT);    //状态窗口的控制标识符

 

参数

【样式】

状态窗口的窗口样式。此参数必须包含WS_CHILD样式,并且还应包含WS_VISIBLE样式。

【lpszText】

指向指定第一个部分的状态文本的以空值终止的字符串的指针。

【hwndParent】

处理到父窗口。

【wID】

状态窗口的控制标识符。窗口过程使用此值来标识发送到父窗口的消息。

 

返回值

如果函数成功,则返回值是状态窗口的句柄。

如果函数失败,返回值为NULL。

备注

CreateStatusWindow函数调用CreateWindow函数创建窗口。它将参数传递给CreateWindow而不进行修改,并将position,width和height参数设置为默认值。

所以也可以用CreateWindow来创建,这个以后再说.

//我这是创建的全局状态栏句柄HWND hWndStatus
//还要自己定义一个状态栏的ID号
#define IDC_STATUS1 10001

在OnInitDialog()函数中添加:

hWndStatus = ::CreateStatusWindow(WS_CHILD | WS_VISIBLE | SBS_SIZEGRIP,
        NULL, m_hWnd, IDC_STATUS1);  //创建状态栏

RECT rect; GetClientRect(m_hWnd,
&rect);  //获得窗口的尺寸 int nWith = rect.right / 6;    //把窗口分成六份

//这是每格的宽度,搞不明白为啥子是这个样子,头有点大,你说是x坐标值也不对,
//我这是分成三个格子,第一个格子点了4份,所以*了个4,后面二个都是占一份,
//如果是最后一格填满剩余的空间就把最后一个写成-1,数组格式就是:
//int nWiths[3]={nWitch,nWitch*2,-1};
int nWiths[3] = { nWith * 4,nWith * 5,nWith * 6 }; ::SendMessage(hWndStatus, SB_SETPARTS, 3, (LPARAM)(long)nWiths); ::MoveWindow(hWndStatus, 0, 0, 0, 0, TRUE);

 

 基本上就是这个样子了

 

一片空白,没有也东西呢.

//写到状态中相应的格子中,WPARAM参数就是格式的索引值
::SendMessage(hWndStatus, SB_SETTEXT, 0, (long)TEXT("准备就绪"));
::SendMessage(hWndStatus, SB_SETTEXT, 1, (long)TEXT("系统时间"));
::SendMessage(hWndStatus, SB_SETTEXT, 2, (long)TEXT("系统时间2"));

 

 

最后在窗体WM_SIZE消息中通知状态栏自己适应窗体大小,

RECT rect;
    GetClientRect(m_hWnd, &rect);
    int nWith = rect.right / 6;
    int sWiths[3] = { nWith * 4 ,nWith * 5,nWith * 6 };

    ::SendMessage(hWndStatus, SB_SETPARTS, 3, (LPARAM)(long)sWiths);
    ::MoveWindow(hWndStatus, 0, 0, 0, 0, TRUE);

差不多就是这样了,其他的以后再研究吧