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);
差不多就是這樣了,其他的以後再研究吧