Чтение онлайн

на главную

Жанры

Применение Windows API

Легалов А. И.

Шрифт:

Наше меню содержит только три пункта с идентификаторами IDM_EXIT, IDM_HELP, и IDM_ABOUT. Диалоговое окно, которое отображается в ответ на IDM_ABOUT, также создано с использованием редактора ресурсов и имеет id IDD_ABOUT. Его процедура диалога — AboutDlgProc.

И, наконец, чтобы отобразить диалоговое окно, нам нужен дескриптор экземпляра приложения. Стандартный способ восстанавить (отыскать) его состоит в том, чтобы обратиться к внутренней структуре данных Windows, используя соответствующий hwnd.

// Menu command processing

void Controller::Command (int cmd) {

 switch (cmd) {

 case IDM_EXIT:

::SendMessage(_hwnd, wm_close, 0, 0l);

break;

 case IDM_HELP:

::MessageBox(_hwnd, "go figure!", "Generic", MB_ICONINFORMATION | MB_OK);

break;

 case IDM_ABOUT: {

// Instance handle is available through HWND

HINSTANCE hInst = WinGetLong<HINSTANCE>(_hwnd, GWL_HINSTANCE);

::DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUT), _hwnd, AboutDlgProc);

}

break;

 }

}

View, Canvas

Объект "Вид" (Экранный

объект) обычно хранит размеры клиентской области. Они обновляются всякий раз, когда контроллер обрабатывает сообщение WM_SIZE. Первое сообщение WM_SIZE посылается во время создания окна и до посылки WM_PAINT, поэтому мы можем безопасно принимать, его. Когда вызывается Paint, размерности клиентской области уже известны.

Графический вывод к окну осуществляется, вызывом соответствующих методов объекта Canvas. В нашем случае, мы печатаем текст, полученный из модели и рисуем вертикальную строку в десяти пикселах от левого края клиентской области.

class View {

public:

 void SetSize(int cxNew, int cyNew) { _cx = cxNew; _cy = cyNew; }

 void Paint(Canvas& canvas, Model& model);

protected:

 int _cx; int _cy;

};

void View::Paint (Canvas& canvas, Model& model) {

 canvas.Text(12, 1, model.GetText, model.GetLen);

 canvas.Line(10, 0, 10, _cy);

}

Объект "Холст" инкапсулирует то, что, на языке Windows, называется Контекстом устройства. Наш Холст очень прост, он знает только, как печатать текст и рисовать линии, но ваш Холст может иметь много больше методов, которые выполняют творческие функции. Мы больше расскажем о Холсте при описании одной из следующих обучающих программ.

class Canvas {

public:

 operator HDC { return _hdc; }

 void Line(int x1, int y1, int x2, int y2) {

::MoveToEx(_hdc, x1, y1, 0);

::LineTo(_hdc, x2, y2);

 }

 void Text(int x, int y, char const* buf, int cBuf) {

::TextOut(_hdc, x, y, buf, cbuf);

 }

 void Char(int x, int y, char c) {

::TextOut(_hdc, x, y, &c, 1);

 }

protected:

 // Protected constructor: You can't construct

 // a Canvas object, but you may be able

 // to construct objects derived from it.

 Canvas(HDC hdc): _hdc (hdc) {}

 HDC _hdc;

};

Холсты,

который Вы создаете, в ответ на сообщение WM_PAINT, имеет специальный вид. Они получают контекст устройства, вызывая BeginPaint и отдают его, вызывая EndPaint. PAINTSTRUCT содержит дополнительную информацию, о некоторой части рабочей области, которая должна быть перерисована, и т.д. Пока мы игнорируем некоторые подробности, но если вы серьезно относитесь к эффективности, Вы должны изучить это более детально.

// Concrete example of canvas.

// Create this object after WM_PAINT message

class PaintCanvas: public Canvas {

public:

 // Constructor obtains the DC

 PaintCanvas(HWND hwnd) : Canvas (:: BeginPaint(hwnd, &_paint)), _hwnd (hwnd) {}

 // Destructor releases the DC

 ~PaintCanvas {

::EndPaint(_hwnd, &_paint);

 }

protected:

 PAINTSTRUCT _paint;

 HWND _hwnd;

};

Далее: Разве можно программировать в Windows без использования элементов управления?

Классовая обертка для элементов управления

Элементы управления Windows

Перевод А. И. Легалова

Англоязычный оригинал находится на сервере компании Reliable Software

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

Большинство средств управления можно инкапсулировать в объектах, которые внедрены или в соответствующий "Контроллер" (Вы можете иметь отдельные объекты Controller для каждого диалогового окна программы), или, для статических элементов управления, в "Виде".

Поделиться:
Популярные книги

Дракон с подарком

Суббота Светлана
3. Королевская академия Драко
Любовные романы:
любовно-фантастические романы
6.62
рейтинг книги
Дракон с подарком

Наследница Драконов

Суббота Светлана
2. Наследница Драконов
Любовные романы:
современные любовные романы
любовно-фантастические романы
6.81
рейтинг книги
Наследница Драконов

Кровь Василиска

Тайниковский
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Кровь Василиска

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Мятежник

Прокофьев Роман Юрьевич
4. Стеллар
Фантастика:
боевая фантастика
7.39
рейтинг книги
Мятежник

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Темный Лекарь 2

Токсик Саша
2. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 2

Восход. Солнцев. Книга IX

Скабер Артемий
9. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Восход. Солнцев. Книга IX

Попаданка в деле, или Ваш любимый доктор

Марей Соня
1. Попаданка в деле, или Ваш любимый доктор
Фантастика:
фэнтези
5.50
рейтинг книги
Попаданка в деле, или Ваш любимый доктор

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Бремя империи

Афанасьев Александр
Бремя империи - 1.
Фантастика:
альтернативная история
9.34
рейтинг книги
Бремя империи

Элита элит

Злотников Роман Валерьевич
1. Элита элит
Фантастика:
боевая фантастика
8.93
рейтинг книги
Элита элит