Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Создание строки состоянияДля создания окна строки состояния вызывают специальную функцию CreateStatusWindow:
HWND CreateStatusWindow( LONG style, LPCTSTR lpszText, HWND hwndParent, UINT wID);
Она в нижней части окна hwndParent создает окно строки состояния и возвращает его дескриптор. Параметры: 1. style – стиль окна строки состояния. Обязательно содержит комбинацию стилей WS_CHILD | WS_VISIBLE. 2. lpszText – указатель на текст, изначально отображаемый в строке состояния, может быть равен NULL. 3. hwndParent – дескриптор родительского окна. 4. wID – идентификатор окна строки состояния. Процедура окна использует wID для идентификации сообщений от строки состояния. Задача. Создать строку состояния из трех секций. При нажатии левой и правой клавиш мыши в секциях отображать различный текст. Листинг 5.4. Приложение со строкой состояния #include <windows.h> #include <commctrl.h>
#pragma comment (lib, "comctl32.lib")
#define ID_STATUS 200
BOOL RegClass(WNDPROC, LPCTSTR, UINT); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hInstance; TCHAR szClass[] = TEXT("StatusClass");
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; HWND hMainWnd; hInstance = hInst; if (!RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hMainWnd = CreateWindow(szClass, TEXT("Строка состояния"), WS_VISIBLE | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (!hMainWnd) return FALSE; while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg); return msg.wParam; }
BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground) { WNDCLASS wc; wc.style = wc.cbClsExtra = wc.cbWndExtra = 0; wc.lpfnWndProc = Proc; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(brBackground + 1); wc.lpszMenuName = NULL; wc.lpszClassName = szName; return (RegisterClass(&wc)!= 0); }
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { static HWND hStatus; static int pParts[3]; static short cx; switch (msg) { case WM_SIZE: { MoveWindow(hStatus, 0, 0, 0, 0, TRUE); cx=LOWORD(lParam); pParts[0]=cx-200; pParts[1]=cx-100; pParts[2]=cx; SendMessage(hStatus, SB_SETPARTS, 3, (LPARAM)pParts); return 0; } case WM_CREATE: { hStatus = CreateStatusWindow(WS_CHILD | WS_VISIBLE, TEXT("Готово"), hwnd, ID_STATUS); return 0; } case WM_LBUTTONDOWN: { SendMessage(hStatus, SB_SETTEXT, 0, (LONG)TEXT("Первая секция строки состояния")); SendMessage(hStatus, SB_SETTEXT, 1, (LONG)TEXT("Сообщение 2")); SendMessage(hStatus, SB_SETTEXT, 2, (LONG)TEXT("Сообщение 3")); return 0; } case WM_RBUTTONDOWN: { SendMessage(hStatus, SB_SETTEXT, 0, (LONG)TEXT("Сообщение 1")); SendMessage(hStatus, SB_SETTEXT, 1, (LONG)TEXT("Нет сообщения")); SendMessage(hStatus, SB_SETTEXT, 2, (LONG)TEXT("")); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); }
Проанализируем это приложение. 1. Функция окна приложения содержит описания дескриптора для окна строки статуса hStatus и массива pParts:
static HWND hStatus; static int pParts[3];
2. Массив pParts нужен для разбиения окна строки состояния на 3 секции (имя массива и количество секций могут быть другими). На этапе создания окна приложения создают и окно строки состояния:
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;
Например, правая граница первой секции равна сх-200. Окну строки состояния сообщают о количестве и правых границах секций:
SendMessage(hStatus, SB_SETPARTS, 3, (LPARAM)pParts);
4. После нажатия левой клавиши мыши над рабочей областью окна приложения во все секции строки состояния записывают тексты сообщений: " Первая секция строки состояния ", " Сообщение 2 " и " Сообщение 3 ":
SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Первая секция строки состояния"); SendMessage(hStatus, SB_SETTEXT, 1, (LONG)"Сообщение 2"); SendMessage(hStatus, SB_SETTEXT, 2, (LONG)"Сообщение 3");
Здесь третий аргумент вызова функции SendMessage равен номеру секции. Причем номер первой секции равен 0. Аналогично обрабатывают нажатие правой клавиши мыши.
|