Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций Часть II.doc
Скачиваний:
14
Добавлен:
20.11.2018
Размер:
1.48 Mб
Скачать

П. 4.6. Строка состояния

Строку состояния используют для отображения текстов о текущем состоянии приложения. Функции для работы со строкой состояния, как и функции для работы с панелью инструментов, объявлены в файле commctrl.h и описаны в файле comctl32.dll.

4.6.1. Создание строки состояния

Для создания окна строки состояния вызывают специальную функ­цию CreateStatusWindow:

HWND CreateStatusWindow( LONG style, LPCTSTR lpszText,

HWND hwndParent, UINT wlD);

Она в нижней части окна hwndParent создает окно строки состояния и возвращает его дескриптор.

Параметры:

1. style - стиль окна строки состояния. Обязательно содержит комбина­цию стилей WS_CHILD | WS_VISIBLE.

2. lpszText - указатель на текст, изначально отображаемый в строке со­стояния, может быть равен NULL.

3. hwndParent - дескриптор родительского окна.

4. wID - идентификатор окна строки состояния. Процедура окна ис­пользует wID для идентификации сообщений от строки состояния.

Задача. Создать строку состояния из трех секций. При нажатии левой и правой клавиш мыши в секциях отображать различный текст.

Листинг Приложение со строкой состояния.

#include <windows.h>

#incdude <commctrl.h>

#pragma comment (lib,"comctl32.!ib")

#define ID_STATUS 200

BOOL RegClass(WNDPROC, LPCTSTR, UlNT);

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

HINSTANCE hlnstance;

char szClass[] ="StatusClass";

int WINAPI WinMain(HINSTANCE hlnstance,

HINSTANCE hPrevlnstance, LPSTR lpszCmdLine, int nCmdShow)

{ }

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg,

WPARAM wParam, LPARAM IParam)

{ static HWNDhStatus;

static int pParts[3];

static short cx;

switch (msg) {

case WM_SIZE:

{ MoveWindow(hStatus, 0,0,0,0, TRUE);

cx=LOWORD(IParam);

pParts[0]=cx-200;

pParts(1]=cx-100;

pParts{2]=cx;

SendMessage(hStatus, SB_SETPARTS, 3,0-PARAM)pParts);

return 0; }

case WM_CREATE.

{ hStatus=CreateStatusWindow( WS_CHlLD | WS_VISIBLE, "Готово",

hwnd, ID_STATUS); retum 0,

}

case WM_LBUTTONDOWN:

{ SendMessage(hStatus,SB_SETTEXT,0,

(LONG)'Первая секция строки состояния”;

SendMessage(hStatus,SB SETTEXT,1,

(LONG)"Cooбщение 2";

SendWtessageOiStatus,SB_SETTEXTA

(LONG)"Сообщение З");

return 0;

}

case WM_RBUTTONOOWN:

{ SendMessage(hStatus, SB_SETTEXT,0, (LONG)"Сообщение 1");

SendMessage(hStatus,SB_SETTEXT,1,(LONG);

return O;

}

case WM DESTROY: {PostQuitMessage(0); return 0;}

}

retum DefWindowProc0wnd, msg, wParam, IParam);

}

Проанализируем это приложение.

1. Функция окна приложения содержит описания дескриптора для окна строки статуса hStatus и массива pParts:

static HWND hStatus;

static lnt pParts[3};

Массив pParts нужен для разбиения окна строки состояния на 3 сек­ции (имя массива и количество секций могут быть другими).

2. На этапе создания окна приложения создают и окно строки состояния:

hStatus=CreateStatusWindow(WS_CHILD|WS VISIBLE, "Готово", hwnd, ID_STATUS);

Здесь второй аргумент "Готово" будет по умолчанию отображен в первой секции. Этот аргумент может быть указан как NULL. Тогда строка состояния изначально не содержит никакого текста.

3. При любых изменениях размеров окна перемещают окно строки со­стояния:

MoveWindow( hStatus, 0,0,0,0, TRUE);

Как и в случае панели инструментов, все координаты перемещения могут быть равны нулю. Предопределенная функция окна строки со­стояния всегда размещает строку состояния в нижней части рабочей об­ласти родительского окна. Ширина строки состояния при этом равна ширине рабочей области.

Далее определены координаты правых границ секций:

cx=LOWORD(lParam);

pParts[0]=cx-200;

pParts[1]=cx-100;

pParts[2]=cx;

Например, правая граница первой секции равна cx-200.

Окну строки состояния сообщают о количестве и правых границах секций: SendMessage( hStatus, SB_SETPARTS, 3, (LPARAM)pParts);

4. После нажатия левой клавиши мыши над рабочей областью окна приложения во все секции строки состояния записывают тексты со­общений. Например:

SendMessage( hStatus, SB_SETTEXT, 0,(LONG)”Первая секция строки состояния");

Здесь третий аргумент вызова функции SendMessage равен номеру секции. Причем номер первой секции равен 0.

Аналогично обрабатывают нажатие правой клавиши мыши.