win32 sdk 環境下創建狀態欄

今天在學習狀態欄,出了好多的問題,這裡記錄下.

要創建狀態欄用: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);

差不多就是這樣了,其他的以後再研究吧

 

Tags: