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

4.5.2. Управление состоянием кнопок панели

Панель инструментов во многом ведет себя как обычное окно. На­пример, в нем, кроме кнопок, можно расположить другие органы управ­ления и управлять ими обычным способом. Но управление кнопками па­нели имеет свои отличия.

Для управления состоянием кнопок вызывают функцию SendMessage со специфиче­скими для кнопок панели инструментов параметрами.

Примеры управления состоянием кнопок.

1. Заблокировать кнопку "Открыть":

SendMessage (hToolbar, TB_SETSTATE, (WPARAM)FILE_OPEN,

(LPARAM)MAKELONG(TBSTATE_INDETERMINATE,0));

2. Разблокировать кнопку "Сохранить":

SendMessage (hToolbar, TB_SETSTATE, (WPARAM)FlLE_SAVE,

(LPARAM)MAKELONG(TBSTATE_ENABLED,0));

3. Кнопку "Найти" отметить и оставить в доступном состоянии:

SendMessage (hToolbar, TB_SETSTATE, (WPARAM)CM_EDIT_FIND,

(LPARAM)MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

4. Скрыть кнопку "Найти":

SendMessage (hToolbar, TB_SETSTATE, (WPARAM)CM_EDIT_FIND,

(LPARAM)MAKELONG(TBSTATE_HIDDEN,0));

4.5.3. Вывод подсказок в панели инструментов

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

Панель инструментов функции родительского окна посылает уведомительное сообщение WM_NOTIFY о том, что с ней что-то сделали или требуется дополнительная информация. Для идентификации отправителя и истолкования сообщения используют параметр lParam. Он указывает на структуру типа NMHDR, которая содержит код и дополнительную информацию сообщения. После обработки сообщения WM_NQTIFY можно возвращать любое значение.

Структура NMHDR описана следующим образом:

typedef struct {

HWND hwndFrom;

UlNT idFrom;

UINT code;

} NMHDR;

Здесь hwndFrom - дескриптор пославшего сообщение органа управления,

idFrom - идентификатор этого органа управления,

code - специфический для органа управления код сообщения.

Структура NMHDR обычно является частью структуры более высокого уровня. В случае панели инструментов она является частью структуры ТООLTIРТЕХТ: typedef struct

{ NMHOR hdr;

LPTSTR lpszText;

char szText|80];

HINSTANCE hinst;

UINT uFlags;

} TOOLTIPTEXT;

Назначение полей этой структуры:

1. hdr – cтруктypa типа NMHDR.

2. lpszText - указатель на строку, которая содержит или получает текст для панели инструментов,

3. szText - буфер для получения текста от панели инструментов.

4. hinst - дескриптор приложения, которое содержит строковый ресурс.

Если 1рszТехt указывает на строку, hinst=NULL.

5. uFlags - флажок, который указывает, как интерпретировать значение

поля idFrom структуры hdr. Если uFlags=TTF_IDISHWND, то idFrom- дескриптор, иначе idFrom - идентификатор кнопки панели инструментов.

Эти структуры обычно описывают и инициируют после получения сообщения WM_NOTIFY. Например, следующим образом:

  1. Описывают указатель на структуру типа TOOLTIPTEXT:

LPTOOLTIPTEXT TTStr;

2 Cвязывают указатель TTStr с параметром lParam:

TTStr=(LPTOOLTIPTEXT)lParam;

3. Далее анализируют код сообщения и принимают соответствующее решение.

Например, в случае организации подсказок, анализ сводится к проверке:

if (TTstr->hdr.code!=TTN_NEEDTEXT) return 0;

То есть обработку завершают, если код не равен TTN_NEEDTEXT. Со­общение TTN_NEEDTEXT говорит, что для панели инструментов требу­ется текст.

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

switch (TTStr->hdr.idFrom) {

case CM_FILE_NEW.

{ TTStr->lpszText="Coздать новый документ";

return 0; }

. . .

default: return 0; }

В качестве подсказки можно посылать любые тексты (даже с управ­ляющими символами типа \n).

Пример. Обеспечить выда­чу подсказок в момент остановки курсора мыши над кнопкой панели.

case WM_NOTIFY:

{ LPTOOLTIPTEXT TTStr;

TTStr=(LPTOOLTIPTEXT)IParam;

if(TTStr->hdr,code!=TTN_NEEDTEXT) return 0;

switch (TTStr->hdr.idFrom)

{ case CM_FILE_NEW:

{ TTStr->lpszText="Coздать новый документ"; return 0;

}

case CM_FILE_OPEN:

{ TTStr ->lpszText=”Открыть существующий документ"; return 0;

}

caseCM_FILE_SAVE:

{ TTStr->lpszText="Coxpaнить текущий документ"; return 0;

}

default: return 0;

} return 0;

}

Для работы этого фрагмента программы необходимо:

  1. Описать идентификатор панели инструментов:

#define ID_TOOLBAR 100

2. Для того чтобы кнопки панели инструментов посылали сообщение WM_NOTIFY, стиль dwStyle окна панели инструментов следует указывать:

dwStyte=WS_CHILD | WS_VISIBLE |TBSTYLE_TOOLTIPS | WS_DLGFRAME;

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

Данный способ обработки сообщения WM_NOTIFY отличается про­стотой, наглядностью и информативностью сообщений. Например, мож­но выдать большее сообщение:

TTStr->lpszText= "Добро пожаловать в справочную систему:\n\n" "

  1. Найдите ответы на возникающие вопросы\n\n"

  2. Просмотрите электронную версию справочника.";