- •Московская финансово-промышленная академия
- •Содержание
- •Глава 1. Модель программирования приложений
- •1.1. Потребительские свойства Windows
- •1.2. Процессы в Windows и потоковая многозадачность
- •1.3. Динамические библиотеки
- •1.4. Программное обеспечение для создания Win-приложений
- •Спецификация префиксов венгерской нотации
- •Глава 2. Обзор возможностей программирования
- •2.1. Общий взгляд на программирование в Windows
- •2.2. Взаимодействие Windows с программой
- •2.3. Win32 api: прикладной интерфейс для Windows
- •2.4. Компоненты окна
- •2.5. Основы приложений Windows
- •2.6. Каркас приложения Windows
- •2.7. Определение класса окна
- •Значения параметра lpszName
- •Наиболее употребляемые макросы для встроенных курсоров
- •Типы системных кистей
- •2.8. Создание окна
- •Наиболее распространенные стили
- •Параметры способа отображения nHow
- •2.9. Цикл обработки сообщений
- •2.10. Оконная функция
- •Типы префиксов
- •Глава 3. Обработка сообщений Windows
- •3.1. Что такое сообщения?
- •3.2. Обработка нажатая клавиш
- •Битовая карта lParam
- •3.3. Обработка сообщений wm_paint
- •3.4. Обработка сообщений «мыши»
- •3.5. Генерация сообщения wm_paint
- •3.6. Генерация сообщений таймера
- •Глава 4. Ресурсы и меню
- •4.1. Окна сообщений MessageBox
- •Значения функции MessageBox
- •Значения wMbType
- •4.2. Представляем меню
- •4.3. Использование ресурсов
- •Параметры menu
- •Параметры элементов меню
- •4.4. Включение меню в программу. Обработка команд
- •4.5. Включение акселераторов сменю
- •4.6. Загрузка таблицы акселераторов
- •Глава 5. Создание диалогов
- •5.1. Взаимодействие Win-диалогов с пользователем
- •5.2. Модальные диалоги: обработка сообщений
- •5.3. Активизация и создание простейшего диалога
- •5.4. Определение ресурсов диалога
- •Стили диалога
- •5.5. Оконная функция диалога
- •5.6. Основы работы со списками
- •Типы сообщений
- •5.7. Инициализация списка и выбор элементов
- •5.8. Окно ввода
- •5.9. Использование немодального диалога
- •Глава 6. Графические образы, иконки и курсоры
- •6.1. Иконка и курсор
- •6.2. Определение малой иконки
- •6.3. Работа с растровыми изображениями
- •Значения параметра dwRaster
- •6.4. Работа с несколькими растровыми изображениями
- •Глава 7. Более подробно об элементах управления
- •7.1. Работа с контрольными переключателями
- •7.2. Статические элементы
- •7.3. Работа с селекторными кнопками
- •7.4. Линейки прокрутки
Спецификация префиксов венгерской нотации
№ |
Префикс |
Тип данных (базовый тип) |
1 |
c |
char |
2 |
by |
BYTE (unsigned char) |
3 |
n |
short int, int |
4 |
i |
int |
5 |
x, у |
short (в качестве координат х и у) |
6 |
сx, су |
short (в качестве длины вдоль координат х и у) |
7 |
b |
BOOL (int) |
8 |
w |
UINT (unsigned int) или WORD (unsigned short int) |
9 |
l |
LONG (long) |
10 |
dw |
DWORD (unsigned long) |
11 |
fn |
Указатель на функцию |
12 |
s |
Строка |
13 |
sz, str |
Строка, завершающаяся нулевым байтом |
14 |
lp |
32-битовый указатель |
15 |
h |
Дескриптор (используется для обращения к объектам Windows |
16 |
msg |
Сообщение |
Именование переменных. При использовании венгерской нотации переменные имеют префиксы, указанные в табл. 2.1. Кроме того, если имя переменной состоит из одного или нескольких слов, то каждое из них записывается с прописной буквы. Вот несколько примеров:
char *szFileName; // Строка с завершающим нулем
int *lpiData; // 32-битовый указатель на int
BOOL bSemaphore; // Логическое значение
DWORD dwMaxCount; // 32-битовое беззнаковое целое
Хотя специальное обозначение для локальных переменных мне неизвестно, для глобальных обычно используется префикс g_ (или просто g):
int g_iXPos; // Глобальная позиция по координате х
int g_Timer; // Глобальный таймер
char *g_szString; // Глобальная строка с
// завершающим нулем
Именование функций. Функции именуются так же, как и переменные, но только без префиксов. Другими словами, в именах функций составляющие их слова пишутся с прописных букв, и не более того.
int PlotPixel(int ix, int iy, int ic);
void *MemScan(char *szString);
Использование подчеркиваний считается неверным. Например, следующая функция не соответствует венгерской нотации:
int Get_Pixel(int ix, int iy);
Именование типов и констант. Имена всех типов и констант состоят только из прописных букв, но при этом Вы можете использовать в именах подчеркивание:
const LONG NUM_SECTORS = 100; // Константа в стиле C++
#define MAX_CELLS 64 // Константа в стиле С
#define POWERUNIT 100 // Константа в стиле С
typedef unsigned char UCHAR; // Пользовательский тип
Здесь нет ничего необычного – обыкновенные стандартные определения. Хотя большинство программистов Microsoft не используют подчеркивания, предпочтительно пользоваться ими с тем, чтобы имена были более удобочитаемы.
В C++ ключевое слово const имеет несколько значений, но в приведенном выше коде оно использовано просто для создания константной переменной. Этот способ похож на использование макроопределения #define, но при этом содержит информацию о типе. Использование const позволяет, таким образом, обеспечить проверку типов в процессе компиляции и выполнить необходимые преобразования.
Именование классов. Соглашение об именовании классов может Вас несколько удивить, но я видел множество программистов, настолько привыкших к нему, что используют его в повседневной работе. Просто все классы C++ должны иметь имена с префиксом, состоящим из одной прописной буквы С.
class CVector
{
public:
CVector() { ix = iy = iz = imagnitude = 0; }
CVector(int x, int y, int z)
{ ix = x; iy = y; iz = z; }
...
private:
int ix, iy, iz; // Направление вектора int
imagnitude; // Размер вектора
}
Именование параметров. Имена параметров функций следуют тем же соглашениям, что и обычные переменные, хотя это и не обязательно. Например, Вы можете увидеть объявление функции, выглядящее так:
UCHAR GetPixel(int x, int y);
При использовании венгерской нотации это объявление должно выглядеть следующим образом:
UCHAR GetPixel(int ix, int iy);
Кроме того, в объявлении функции имена параметров могут не указываться вовсе – указываются только их типы:
UCHAR GetPixel(int, int);
Конечно, такое допустимо только в объявлении функции; в определении функции должны использоваться не только типы, но и имена переменных.
Знакомство с венгерской нотацией еще не означает, что Вы в обязательном порядке должны ее использовать. Таким образом, код в этой книге будет использовать венгерскую нотацию при рассмотрении функций Win32 API, но в других местах будем пользоваться собственным стилем.
Программы, приведенные в этой книге, создавались в среде Microsoft Visual C ++ 6.0. Во время работы с книгой, разбирая приведенные примеры, или при создании собственных приложений Вы, вероятно, будете применять какой-либо другой компилятор, который сможет строить программы для Windows. Демонстрационные программы должны правильно транслироваться любым компилятором, совместимым с Visual C ++. Примеры, приведенные в книге, написаны на стандартном C/C++, так что они должны транслироваться любым компилятором C/C++.
Обычно создается проект типа Win32-Application. В состав «рабочего пространства» (Workspace) проекта (на рис. 1.4 – это проект Ex_02_01) обязательно входят файлы (Sourse Files):
текст программы с суффиксом .cpp (на рис.1.4 – это текст программы Example-02-01.cpp);
стандартная библиотека вызовов Windows (на рис.1.4 – это библиотека Comctl32.lib);
стандартный заголовочный h-файл (на рис. 1.4 – это Windows.h).
Как показано на рис. 1.4, первые два файла включаются разработчиком программы в явном виде. Третий файл (Header Files), если на него есть ссылка в тексте программы с помощью макроса
#include <Windows.h>,
который подключается автоматически.
Рис. 1.4. Типовой состав проекта