Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОСОБИЕ СозданиеWindowsПриложений.doc
Скачиваний:
21
Добавлен:
01.03.2016
Размер:
3.35 Mб
Скачать
      1. Организовать ввод-вывод числовых данных с применением пользовательского диалогового окна

Создать проект (WinHelloMy2) из шаблона Windows-приложения (тип Hello). Модифицировать меню приложения. По выбору подпункта Enter (Ввод) активизировать диалоговое окно для ввода числа. Введенное вещественное число возводить в квадрат, а полученный результат выводить с помощью окна сообщений. Примерный вид меню, диалогового окна и окна сообщений показан ниже. Результаты привести в ОТЧЕТЕ.

РЕКОМЕНДАЦИИ ПО ВЫПОЛНЕНИЮ ЗАДАНИЯ. Примерный порядок выполнения и используемые средства см. в [ВводДанныхЧерезДиалОкно, ФункцииВводаВывода, ВыводДанных]. В функции-обработчике DialEnter(…) сообщений диалогового окна, используемого для ввода исходного числа, процесс ввода реализовать через окошко редактирования, например, как показано ниже

LRESULT CALLBACK DialEnter (HWND hDlg, UINT message,

WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_INITDIALOG:

return FALSE;

case WM_COMMAND:

switch (wParam)

{

case IDOK:

Ввести Число как Строку

Преобразовать Строку в вещественное Число

EndDialog ( hDlg, TRUE);

Вывести подтверждение о результатах ввода

break;

case IDCANCEL:

EndDialog ( hDlg, FALSE);

break;

default:

return FALSE;

}

break;

default:

return FALSE;

}

return TRUE;

}; .

Инициализацию окна ввода, обработку введенного числа и вывод результата производить в функции WndProc (…)

LRESULT CALLBACK WndProc (…)

{

int wmId;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_COMMAND:

wmId = LOWORD(wParam);

switch (wmId)

{

…………………………

case ID_WORK_ENTER:

DialogBox (hInst, (LPCTSTR) IDD_DIALOG1,hWnd,(DLGPROC) DialEnter);

InvalidateRect (hWnd, NULL, TRUE);

UpdateWindow (hWnd);

break;

……………………..

}

break;

case WM_PAINT:

hdc = BeginPaint ( hWnd, &ps);

Вычислить Квадрат введенного вещественного Числа

Преобразовать числовое значение Квадрата в Строку

Вывести результат как Строку

EndPaint ( hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage (0);

break;

default:

return DefWindowProc ( hWnd, message, wParam, lParam);

}

return 0;

} .

  1. Индивидуальные задания

Примерный перечень: - разработать пользовательский класс (стиль) основного окна (включая его размер, местоположение, дизайн, курсоры, кисти и т.д.); - разработать и реализовать пользовательское меню; - разработать и реализовать интерфейс приложения с использованием диалоговых окон; - разработать и реализовать интерфейс приложения с использованием меню и диалоговых окон; - создать проект Windows-приложения для ввода и вывода строковых, целых (знаковых и беззнаковых), вещественных данных в виде отдельных значений, а также в виде массивов значений. Выполнить обработку значений. Организовать интерфейс ввода-вывода и управления вычислениями посредством меню и окон; - организовать вывод графиков функций (параметры табулирования вводит пользователь); - организовать табулирование заданных функций (параметры табулирования вводит пользователь; результаты выводятся как в табличном так и графическом виде в одном или разных окнах).

ПРИЛОЖЕНИЕ. Режимы отображения

Таблица. Режимы отображения

Режим отображения

Номер режима

по оси X

по оси Y

Логические единицы

ММ_ТЕХТ

1

вправо

вниз

пикселы

MM_LOMETRIC

2

вправо

вверх

0.1 мм

MM_HIMETRIC

3

вправо

вверх

0.01 мм

MM_LOENGLISH

4

вправо

вверх

0.01 дюйма

MM_HIENGLISH

5

вправо

вверх

0.001 дюйма

MM_TWIPS

6

вправо

вверх

1/1440 дюйма

MM_ISOTROPIC

7

любое

любое

произвольные (х = у)

MM_ANISOTROPIC

8

любое

любое

произвольные (х != у)

Таблица. Режимы отображения

Константа

Значение

MM_ANISOTROPIC

Произвольные единицы с произвольным масштабом осей

MM_HIENGLISH

Логическая единица отображается в 0.001 дюйма. Положительные направления осей: X — направо, Y — вверх

MM_HIMETRIC

Логическая единица отображается в 0.01 миллиметра. Положительные направления осей: X — направо, Y — вверх

MM_ISOTROPIC

Произвольные единицы с одинаковым масштабом по осям

MM_LOMETRIC

Логическая единица отображается в 0.1 миллиметра. Положительные направления осей: X — направо, Y — вверх

MM_LOENGLISH

Логическая единица отображается в 0.01 дюйма. Положительные направления осей: X — направо, Y — вверх

MM_TEXT

Логическая единица отображается в пиксел устройства. Положительные направления осей: X — направо, Y — вниз

MM_TWIPS

Логическая единица отображается в 1/20 принтерной точки. Положительные направления осей: X — направо, Y — вверх

ПРИЛОЖЕНИЕ. Стили окна

Таблица. Стили окна

Стиль

Описание

WS_BORDER

Создание окна с рамкой.

WS_CAPTION

Добавление заголовка к окну с рамкой

WS_CHILD

Создание дочернего окна. Не используется с окнами стиля WS_POPUP

WS_CHILDWINDOW

Создание дочернего окна стиля WS_CHILD

WS_CLIPCHILDREN

Используется при создании родительского окна; запрещает рисование родительского окна в облас­ти, занятой любым дочерним окном

WS_CLIPSIBLINGS

Используется только со стилем WS_CHILD. Окна данного стиля исключают области, занятые другими дочерними окнами, из клиентской области дочерне­го окна при получении данным окном сообщения о перерисовке. В противном случае можно было бы рисовать в клиентской области другого дочернего окна

WS_DISABLED

Создание изначально неактивного окна

WS_DLGFRAME

Создание окна с двойной рамкой без заголовка

WS_EX_ACCEPTFILES

Указывает, что создаваемое окно принимает файлы методом ""drag-and-drop"

WS_EX_DLGMODALFRAME

Создание окна с двойной рамкой, в котором может находиться дополнительный заголовок. Этот стиль может использоваться только для значения dwEx-Style

WS_EX_NOPARENTNOTIFY

Указывает, что созданное дочернее окно не будет посылать родительскому окну сообщение WM_PARENTNOTIFY при создании или разрушении дочернего окна

WS_EX_TOPMOST

Указывает, что созданное окно должно располагать­ся поверх всех окон, не имеющих такого стиля, и оставаться выше остальных даже в неактивном состоянии

WS_EX_TRANSPARENT

Указывает, что созданное окно должно быть про­зрачным. Все окна, расположенные под данным окном, не заслоняются им

WS_GROUP

Используется только в диалоговых окнах. Этот стиль окна указывается для первого элемента управления в группе элементов управления. Пользователь может перемещаться от одного элемента управле­ния к другому с помощью клавиш-стрелок

WS_HSCROLL

Создание окна с горизонтальной полосой прокрут­ки

WS_MAXIMIZE WS_MINIMIZE

Создание окна максимального размера Создание окна минимального размера

WS_MAXIMIZEBOX WS_MINIMIZEBOX

Создание окна, которое имеет кнопку максимиза­ции Создание окна, которое имеет кнопку минимизации

WS_OVERLAPPED

Создание перекрывающегося окна

WS_OVERLAPPEDWINDOW

Для создания перекрывающегося окна используют­ся стили WS_OVERLAPPED, WS_THICKFRAME и WS_SYSMENU

WS_POPUP

Создание временного окна. Не используется с окнами стиля WS_CHILD

WS_POPUPWINDOW

Для создания временного окна используются стили WS_BORDER, WS_POPUP и WS_SYSMENU

WS_SYSMENU

Создание окна, которое располагает кнопкой вызова системного меню. При использовании этого стиля для дочернего окна вместо стандартной кнопки вызова системного меню создается кнопка, позволяющая закрыть окно. Стиль WS_SYSMENU используется только для окон, имеющих заголовок

WS_TABSTOP

Используется только в диалоговых окнах. Указывает на произвольное количество элементов управления, между которыми пользователь может перемещаться с помощью клавиши <ТаЬ>. С помощью последова­тельных нажатий <ТаЬ> можно перемещаться между элементами управления со стилем WS_TABSTOP

WS_THICKFRAME

Создание окна с толстой рамкой. Рамка использу­ется для изменения размеров окна

WS_VISIBLE

Создание окна, видимого сразу после создания. Используется для перекрывающихся и временных окон

WS_VSCROLL

Создание окна с вертикальной полосой прокрутки

ПРИЛОЖЕНИЕ. Состояния окна

Таблица. Состояния окна (параметры в ShowWindow)

Состояние

Описание

SW_HIDE

Прячет окно и переводит в активное состояние другое окно

SW_MIINIMIZE

Минимизирует окно и активизирует окно верхнего уровня в списке менеджера окон

SW_RESTORE

Действует так же, как и SW_SHOWNORMAL

SW_SHOW

Активизирует окно и выводит его в текущей позиции и текущего размера

SW_SHOWDEFAULT

Активизирует окно и выводит его с использовани­ем текущих умолчаний

SW_SHOWMAXIMIZED

Активизирует окно и выводит его с максимальным размером

SW_ SHOWMINIMIZED

Активизирует окно и выводит его в виде пикто­граммы

SW_SHOWMINNOACTIVATE

Выводит окно как пиктограмму; бывшее активным в данный момент окно остается активным

SW_SHOWNA

Выводит окно с учетом его состояния в данный момент; активное в данный момент окно остается активным

SW_SHOWNOACTIVATE

Выводит окно в его прежней позиции и прежнего размера; активное в данный момент окно остается активным

SW_SHOWNORMAL

Активизирует окно и выводит его на экран. Если окно было увеличено или уменьшено до пикто­граммы, то система Windows восстановит началь­ное положение и размер окна

SW_SHOWSMOOTH

Выводит окно так, чтобы оно меньше всего перекрывалось с другими окнами

ПРИЛОЖЕНИЕ. Коды виртуальных клавиш

Таблица. Коды виртуальных клавиш

Виртуальная клавиша Windows

Идентификатор WINUSER.H

Клавиша PC

Шестнадца­тиричное значение

VK_LBUTTON

01

VK_RBUTTON

02

Да

VK_CANCEL

<Ctrl> + <Break>

03

VK_MBUTTON

04

Да

VK_BACK

<BackSpace>

08

Да

VK_TAB

<Tab>

09

VK_CLEAR

<5> на цифровой клавиатуре

Да

VK_RETURN

<Enter>

0D

Да

VK_SHIFT

<Shift>

10

Да

VK_CONTROL

<Ctrl>

11

Да

VK_MENU

<Alt>

12

VK_PAUSE

13

Да

VK_CAPITAL

<CapsLock>

14

Да

VK_ESCAPE

<Esc>

Да

VK_SPACE

<Spacebar>

20

Да

VK_PRIOR

<PgUp>

21

Да

VK_NEXT

<PgDn>

22

VK_END

<End>

23

Да

VK_HOME

<Home>

24

Да

VK_LEFT

< <- >

25

Да

VK_UP

<|>

26

Да

VK_RIGHT

< -> >

27

Да

VK_DOWN

<|>

28

VK_SELECT

29

VK_PRINT

VK_EXECUTE

VK_SNAPSHOT

Да

VK_INSERT

<lns>

2D

Да

VK_DELETE

<Del>

VK_HELP

2F

Клавиатура

от 0 до 9

от 30 до 39

от А до Z

от 41 до 5А

VK_NUMPADO

<0> на цифровой клавиатуре

60

VK_NUMPAD9

<9> на цифровой клавиатуре

69

VK_MULTIPLY

<*> на цифровой клавиатуре

6A

VK_ADD

<+> на цифровой клавиатуре

6B

VK_DIVIDE

</> на цифровой клавиатуре

6F

Да

VK_F1

<F1>

70

Да (по <F10>)

….

VK_F12

<F12>

7B

VK_F24

87

…..

ПРИЛОЖЕНИЕ. Структура WNDCLASS

Таблица. Определения полей структуры WNDCLASS

Имя поля

Константа

Значение

Style

Определяет стиль класса. Различные стили могут комбинироваться при помощи побитовой операции "логическое ИЛИ". Возможны следующие значения поля стиля:

CS_BYTEALIGNCLIENT CS_BYTEALIGNWINDOW

Использовать границы по байту по оси X; выравнивание клиентской области окна. Использовать границы по байту по оси X; выравнивание окна

CS_DBCLKS

Окну будут посылаться сообщения о двойном щелчке кнопки "мыши"

CS_HREDRAW

Обеспечивается перерисовка содержимого клиентской области окна при изменении размера окна по горизонтали

CS_KEYCVTWINDOW

Будет выполняться преобразование виртуальных клавиш

CS_NOCLOSE

В системном меню блокируется выбор пункта для закрытия окна

CS_NOKEYCVT

Отключается преобразование виртуальных клавиш

CS_OWNDC

Каждому экземпляру окна присваи­вается собственный контекст изо­бражения

CS_PARENTDC

Классу окна передается контекст изображения родительского окна

CS_SAVEBITS

Часть изображения на экране, закрытая окном, сохраняется

CS_VREDRAW

Обеспечивается перерисовка содержимого клиентской области окна при изменении размера окна по вертикали

IpfnWndProc

Значение указателя на функцию окна, которая выполняет все задачи, связанные с окном

cbClsExtra

Задается количество дополнительных байт, выделяемых структу­ре WNDCLASS (обычно NULL

cbClsExtra

Задается количество дополнительных байт, выделяемых для всех дополнительных структур, которые создаются с использованием данного класса окна (обычно NULL)

hlnstance

Определяется экземпляр приложения, регистрирующий класс окна

hlcon

Задается пиктограмма, которая используется при выводе окна в виде пиктограммы (обычно NULL)

hCursor

Соответствует hlcon за исключением того, что определяет курсор, используемый для данного окна (обычно NULL)

hbrBackGround

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

COLOR_SCROLLBAR

COLOR_BACKGROUND

COLOR_ACTIVECAPTION

….

COLOR_WINDOW

COLOR_WINDOWTEXT

COLOR_CAPTIONTEXT

COLOR_APPWORKSPACE

COLOR_HIGHLIGHT

COLOR_HIGHLIGHTTEXT

….

IpszMenuName

Длинный указатель на строку символов, заканчивающуюся "О", которая определяет имя ресурса меню (может равняться NULL)

IpszClassName

Длинный указатель на строку символов, заканчивающуюся "0", которая определяет имя класса. Имя класса должно быть уни­кальным, чтобы не возникало проблем при разделении класса между приложениями

ПРИЛОЖЕНИЕ. Опции меню

Таблица. Опции, наиболее часто используемые при создании меню

Опция

Использование

CHECKED

Рядом с пунктом меню располагается отметка

END

Данный пункт меню является последним пунктом выпадающего или статического меню

GRAYED

Пункт меню неактивен и выводится в списке пунктов меню бледным

HELP

Пункт меню является выровненным по правому краю статиче­ским меню, выбираемым с клавиатуры

INACTIVE

Пункт меню выводится в списке, но не может быть выбран в данных обстоятельствах

MENUBREAK

Пункт меню помещается в новый столбец

MENUBARBREAK

Пункт меню помещается в новый столбец.. Пункты разделяются чертой

OWNERDRAW

За вывод изображения пункта меню, включая выделенное, неактивное и отмеченное состояния, отвечает владелец меню

POPUP

При выборе данного пункта выводится список пунктов подменю

Таблица. Опции, используемые с операторами MENUITEM и POPUP

Опция

Значение

DISCARDABLE

Меню может быть удалено из памяти, если больше не используется

FIXED

Меню постоянно находится в памяти

LOADONCALL

Меню загружается при обращении

MOVEABLE

Меню может быть перемещено в другую область памяти

PRELOAD

Меню загружается при запуске программы

CHECKED

Рядом с названием пункта меню может стоять метка выбора. (Не используется для меню верхнего уровня.)

GRAYED

Название пункта меню выделяется серым цветом и не может быть выбрано

HELP

Может быть связана с командой вызова помощи. Применяется только с MENUITEM

INACTIVE

Пункт меню не может быть выбран

MENUBARBREAK

Если используется для меню верхнего уровня, то название пункта будет записано с новой строки. Если используется для выпадающих меню, то название пункта будет раз­мещено в новом столбце. В этом случае оно будет отде­лено чертой

MENUBREAK

То же, что и MENUBARBREAK, но разделительная черта не используется

ПРИЛОЖЕНИЕ. Параметры функции CreatePen()

Таблица. Значения первого параметра функции CreatePen() (стили перьев)

Значение

Результат

PS_SOLID

Сплошная линия

PS_DASH

Пунктирная линия (только для линий толщиной 1)

PS_DASHDOT

Линия из точек (только для линий толщиной 1)

PS_DASHD0TD0T

Штрихпунктирная линия (только для линий толщиной 1)

PS_NULL

Нуль-перо (невидимо; удобно для заливки фигур без контура)

PS_INSIDEFRAME

Для замкнутых фигур ограничивающие линии проводятся внутри заданных координат фигуры

ПРИЛОЖЕНИЕ. Функция MessageBox()

Таблица. Наиболее распространенные значения параметра МВТуре

Значение

Результат

MB_ABORTRETRYIGNORE

Отображаются кнопки Abort, Retry и Ignore

MB_ICONEXCLAMATION

Отображается пиктограмма с восклицательным знаком

MB_ICONINFORMATION

Отображается информационная пиктограмма с буквой "I"

MB_HAND

Отображается пиктограмма с надписью "Stop"

MB_ICONQUESTION

Отображается пиктограмма с вопросительным знаком

MB_ICONSTOP

То же, что и MB_HAND

MB_OK

Отображается кнопка ОК

MB_OKCANCEL

Отображаются кнопки ОК и Cancel

MB_RETRYCANCEL

Отображаются кнопки Retry и Cancel

MB_YESNO

Отображаются кнопки Yes и No

MB_YESNOCANCEL

Отображаются кнопки Yes, No и Cancel

Таблица. Значения, возвращаемые функцией MessageBox()

Нажатая кнопка

Возвращаемое значение

Abort

IDABORT

Retry

IDRETRY

Ignore

IDIGNORE

Cancel

IDCANCEL

No

IDNO

Yes

IDYES

OK

IDOK

ПРИЛОЖЕНИЕ. Функция MessageBeep()

Таблица. Символические константы функции MessageBeepQ

Константа

Звук

Обозначение в диалоговом окне "Звук"

0xFFFFFFFF

Сигнал динамика компьютера

MB_ICONASTERISK

SystemAsterisk

Звездочка

MB_ICONEXCLAMATION

SystemExclamation

Восклицание

MB_ICONHAND

SystemHand

Критическая ошибка

MB_ICONQUESTION

SystemQuestion

Вопрос

МВ_ОК

SystemDefault

Стандартный звук

ПРИЛОЖЕНИЕ. Стили диалоговых окон

Таблица. Наиболее распространенные стили диалоговых окон

Значение

Эффект

DS_MODALFRAME

Диалоговое окно с модальной рамкой; этот стиль может использоваться как для модальных, так и для немодаль­ных окон

WS_BORDER

Окно с обычной рамкой

WS_CAPTION

Окно со строкой заголовка

WS_CHILD

Окно создается как дочернее

WS_HSCROLL

Окно с горизонтальной полосой прокрутки

WS_MAXIMIZEBOX

Окно с кнопкой максимизации

WS_MINIMIZEBOX

Окно с кнопкой минимизации

WS_POPUP

Окно отображается поверх всех других окон

WS_SYSMENU

Окно с системным меню

WS_TABSTOP

Элементы управления могут быть выбраны последова­тельным нажатием клавиши [TAB]

WS_VISIBLE

Окно отображается при вызове

WS_VSCROLL

Окно с вертикальной полосой прокрутки

ПРИЛОЖЕНИЕ. Встроенные пиктограммы

Таблица. Встроенные пиктограммы

Константа

Вид пиктограммы

IDI_APPLICATION

Стандартная системная пиктограмма

IDI_ASTERISK

Информационная пиктограмма с буквой "I”

IDI_EXCLAMATION

Пиктограмма с восклицательным знаком

IDI_HAND

Пиктограмма с надписью "Stop"

IDI_QUESTION

Пиктограмма с вопросительным знаком

IDI_WINLOGO

Пиктограмма с логотипом Windows

ПРИЛОЖЕНИЕ. Встроенные курсоры

Таблица. Некоторые стандартные курсоры

Константа

Форма курсора

IDC_ARROW

Стандартный указатель типа "стрелка"

IDC_CROSS

Перекрестие

IDC_IBEAM

Текстовый курсор

IDC_WAIT

Песочные часы

ПРИЛОЖЕНИЕ. Встроенные кисти

Таблица. Некоторые стандартные кисти

Константа

Тип фона

BLACK_BRUSH

Черный

DKGRAY_BRUSH

Темно-серый

HOLLOW_BRUSH

"Прозрачный"

LTGRAY_BRUSH

Светло-серый

WHITE BRUSH

Белый

ПРИЛОЖЕНИЕ. Тексты программ

char MyString[20];

int MyInt;

char WorkString[20];

float MyFloat = 12;

float Square;

char Rezult[50];

char Comment1[]= "Квадрат ";

char Comment2[]= "равен ";

char OutputString[50] = “”;

……………………

LRESULT CALLBACK DialEnter (HWND hDlg, UINT message,

WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_INITDIALOG:

return FALSE;

case WM_COMMAND:

switch (wParam)

{

case IDOK:

//enter MyString from IDC_EDIT1 as text

GetDlgItemText (hDlg, IDC_EDIT1, MyString,15);

//enter MyInt from IDC_EDIT1 as int

MyInt = GetDlgItemInt (hDlg, IDC_EDIT1, NULL, 1);

//wsprintf(WorkString, "%d", MyInt); or

_gcvt (MyInt, 15, WorkString);

//enter MyFloat from IDC_EDIT1 as float

//by transforming text MyString into float MyFloat

MyFloat = atof (MyString);

EndDialog (hDlg,TRUE);

//MessageBox (hWnd, MyString, "TEXT-FLOAT", MB_OK);

//MessageBox (hWnd, WorkString,"INTEGER", MB_OK);

break;

case IDCANCEL:

EndDialog(hDlg,FALSE);

break;

default:

return FALSE;

}

break;

default:

return FALSE;

}

return TRUE;

};

…………………………

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

TCHAR szHello[MAX_LOADSTRING];

LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);

switch (message)

{

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC) About);

break;

case ID_WORK_ENTER:

DialogBox(hInst,(LPCTSTR)IDD_DIALOG1,hWnd,(DLGPROC)DialEnter);

InvalidateRect(hWnd, NULL, TRUE);

UpdateWindow(hWnd);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: Add any drawing code here...

Square = MyFloat * MyFloat;

_gcvt(Square, 15, Rezult);

TextOut(hdc,170, 0, Rezult,strlen(Rezult));

//wsprintf(Rezult,"Квадрат = %d",Square);

//OutputString = wcscat(OutputString,Comment1);

//OutputString = wcscat(OutputString, MyFloat);

//OutputString = wcscat (OutputString,Comment2);

//OutputString = wcscat (OutputString, Rezult);

//TextOut(hdc,150, 40, OutputString,strlen(OutputString));

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

} .