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

на главную - закладки

Жанры

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

Легалов А. И.

Шрифт:
WinMain

При запуске WinMain, создается класс окна и главное окно нашего приложения. Я инкапсулировал эти действия внутри двух классов: WinClass и WinMaker. WinClass может также сообщать нам о том, что уже выполняются другие экземпляры нашей программы. Когда подобное случается в нашем примере, мы просто активизируем уже выполняющийся экземпляр программы и выходим из запускаемого приложения. Так необходимо поступать тогда, когда Вы хотите, чтобы в один момент времени выполнялся только один экземпляр вашей программы.

При успешном создании главного окна,

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

Другим интересным моментом этой программы является то, что мы больше не используем строки для обозначения наших ресурсов. Мы используем числовые идентификаторы (ids). Более того, мы используем их даже тогда, когда осуществляются API вызовы таких строк, как имя класса окна или заголовок окна. Мы сохраняем все строки в строковых ресурсах и обращаемся к ним через идентификаторы (ids). Ваша среда разработки для Windows скорее всего имеет редактор ресурсов, который позволяет Вам создавать иконки, меню, строковые ресурсы и назначать им соответствующие числовые идентификаторы. Символические имена этих ids сохранены в файле заголовка, сгенерированном таким редактором. В нашем случае он назван "resource.h".

Константа, ID_MAIN, например, ссылается на иконки основной программы (большую и малую в том же самом ресурсе), главное меню, и строку с именем оконного класса. ID_CAPTION ссылается на строку заголовка окна. Такая организация данных поддерживает возможность многократного использования кода, не говоря уже о легкости локализации.

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, char* cmdParam, int cmdShow) {

 _set_new_handler(&NewHandler);

 // Using exceptions here helps debugging your program

 // and protects from unexpected incidents.

 try {

// Create top window class

TopWinClass topWinClass(ID_MAIN, hInst, MainWndProc);

// Is there a running instance of this program?

HWND hwndOther = topWinClass.GetRunningWindow ;

if (hwndOther != 0) {

::SetForegroundWindow(hwndOther);

if (::IsIconic(hwndOther)) ::ShowWindow(hwndOther, SW_RESTORE);

return 0;

}

topWinClass.Register;

// Create top window

ResString caption(hInst, ID_CAPTION);

TopWinMaker topWin(topWinClass, caption);

topWin.Create;

topWin.Show(cmdShow);

// The main message loop

MSG msg;

int status;

while ((status = ::GetMessage(&msg, 0, 0, 0)) != 0) {

if (status == –1) return –1;

::TranslateMessage(&msg);

::DispatchMessage(&msg);

}

return msg.wParam;

 } catch(WinException e) {

char buf [50];

wsprintf(buf, "%s, Error %d", e.GetMessage, e.GetError);

::MessageBox(0, buf, "Exception", MB_ICONEXCLAMATION | MB_OK);

 }

 catch (…) {

::MessageBox(0, "Unknown", "Exception", MB_ICONEXCLAMATION | MB_OK);

 }

 return 0;

}

WinClass

Давайте,

рассмотрим WinClass. Он инкапсулирует предопределенную в Windows структуру WNDCLASSEX и обеспечивает приемлемые значения по умолчанию для всех ее полей. Этот класс получен из более простого класса WinSimpleClass, который Вы могли бы использовать, чтобы инкапсулировать некоторые встроенные в Windows классы (такие как кнопки, списки просмотров, и т.д.).

Я обеспечил примеры методами, которые могут использоваться, чтобы перестроить значения, устанавливаемые по умолчанию. Например, SetBgSysColor изменяет заданный по умолчанию цвет заднего фона окна к одному из предопределенных цветов системы. Метод SetResIcons загружает соответствующие иконки из ресурсов и присоединяетих к оконному классу. Эти иконки затем появятся в верхнем левом углу основного окна и на панели задач Windows.

TopWinClass наследует от WinClass и использует этот метод. Он также подцепляет меню в вершине оконного класса.

class WinSimpleClass {

public:

 WinSimpleClass(char const * name, HINSTANCE hInst) : _name (name), _hInstance (hInst) {}

 WinSimpleClass (int resId, HINSTANCE hInst);

 char const* GetName const { return _name.c_str ; }

 HINSTANCE GetInstance const { return _hInstance; }

 HWND GetRunningWindow;

protected:

 HINSTANCE _hInstance;

 std::string _name;

};

WinSimpleClass::WinSimpleClass(int resid, hinstance hinst) : _hInstance (hInst) {

 ResString resStr (hInst, resId);

 _name = resStr;

}

HWND WinSimpleClass::GetRunningWindow {

 HWND hwnd = ::FindWindow(getname, 0);

 if (::IsWindow(hwnd)) {

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

Бояръ-Аниме. Газлайтер. Том 30

Володин Григорий Григорьевич
30. История Телепата
Фантастика:
альтернативная история
аниме
фэнтези
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 30

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Глэрд IX: Легионы во Тьме

Владимиров Денис
9. Глэрд
Фантастика:
боевая фантастика
попаданцы
фэнтези
5.00
рейтинг книги
Глэрд IX: Легионы во Тьме

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Железный Воин Империи

Зот Бакалавр
1. Железный Воин Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Железный Воин Империи

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Эпоха Опустошителя. Том IV

Павлов Вел
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том IV

Целого Мира Мало

Джиллиан Алекс
Любовные романы:
современные любовные романы
8.88
рейтинг книги
Целого Мира Мало

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Контртеррор

Валериев Игорь
6. Ермак
Фантастика:
альтернативная история
5.00
рейтинг книги
Контртеррор

Изгой Проклятого Клана. Том 3

Пламенев Владимир
3. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 3