- •Глава 10 Меню и быстрые клавиши
- •Структура меню
- •Шаблон меню
- •Ссылки на меню в вашей программе
- •Меню и сообщения
- •Образец программы
- •Этикет при организации меню
- •Сложный способ определения меню
- •Третий подход к определению меню
- •Независимые всплывающие меню
- •Использование системного меню
- •Изменение меню
- •Другие команды меню
- •Нестандартный подход к меню
- •Использование в меню битовых образов
- •Два способа создания битовых образов для меню
- •Контекст памяти
- •Создание битового образа, содержащего текст
- •Масштабирование битовых образов
- •Соберем все вместе
- •Добавление интерфейса клавиатуры
- •Быстрые клавиши
- •Зачем нужны быстрые клавиши?
- •Некоторые правила назначения быстрых клавиш
- •Загрузка таблицы быстрых клавиш
- •Преобразование нажатий клавиш клавиатуры
- •Получение сообщений быстрых клавиш
- •Программа poppad, имеющая меню и быстрые клавиши
- •Разрешение пунктов меню
- •Обработка опций меню
Два способа создания битовых образов для меню
Чтобы вставить в меню битовый образ используются функции AppendMenu и InsertMenu. Откуда берется битовый образ? Он может находиться в одном из двух мест. Во-первых, вы можете создать битовый образ с помощью редактора изображений, входящего в состав Developer Studio, и включить файл с битовым образом в описание ресурсов. В программе для загрузки ресурса битового образа в память можно использовать функцию LoadBitmap, а для присоединения его к меню — функции AppendMenu и InsertMenu. Однако, при таком подходе возникает одна проблема. Битовый образ не подойдет ко всем типам разрешения видеомониторов и коэффициентам сжатия; для того чтобы это учесть, необходимо соответствующим образом растянуть или сжать битовый образ. Альтернативой является создание и присоединение битового образа к меню прямо в программе.
Оба эти способа кажутся гораздо более трудными, чем это есть на самом деле. Windows обеспечивает нас функциями, которые позволяют легко работать с битовыми образами при помощи контекста памяти.
Контекст памяти
Когда вы используете вызовы функций GDI (такие как TextOut) для записи в рабочую область окна, то фактически запись производится в область памяти (видеопамять), организованную, во многом, как гигантский битовый образ. Ширина и высота этого битового образа равна разрешению дисплея. Способ использования множества битов для определения цветов также определяется видеоадаптером. Если поразмыслить об этом, то окажется, что Windows должна была бы считать определенную область оперативной памяти памятью дисплея и производить запись в эту память точно также, как она пишет на экране. А мы должны были бы использовать эту область памяти в качестве битового образа. Это именно то, чем и является контекст памяти. Он помогает нам рисовать и манипулировать с битовыми образами в программе для Windows. Для этого необходимо сделать следующее:
Вызывая функцию CreateCompatibleDC, создать контекст памяти. В начальный момент поверхность экрана, соответствующая этому контексту памяти, содержит один монохромный пиксель. Можно считать, что этот контекст памяти имеет ширину и высоту по одному пикселю и два цвета (черный и белый).
С помощью функций CreateBitmap, CreateBitmapIndirect или CreateCompatibleBitmap создать неинициализированный битовый образ. При создании битового образа задать его ширину, высоту и цветовую организацию. Однако, пока еще не требуется, чтобы пиксели битового образа что-либо отображали. Сохраните описатель битового образа.
С помощью функции SelectObject выбрать битовый образ в контекст памяти. Теперь контекст памяти имеет поверхность экрана, которая соответствует размеру битового образа с числом цветов, определенным битовым образом.
Использовать функции GDI для рисования в контексте памяти точно так же, как если бы они использовались для рисования в обычном контексте устройства. Все, что рисуется на поверхности экрана контекста памяти, фактически рисуется в битовом образе, выбранном в контекст устройства.
Удалить контекст памяти. Остается описатель битового образа, в котором содержится пиксельное представление того, что было нарисовано в контексте памяти.
