Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual C++ 6. Руководство Разработчика [rus]

.pdf
Скачиваний:
303
Добавлен:
16.08.2013
Размер:
4.96 Mб
Скачать

Обработка сообщения WM_DESTROY

Когда пользователь выбирает в системном меню команду Close или нажимает кнодку закрытия окна, Windows посылает приложению сообщение WM_DESTROY. В ответ на это приложение завершает свою работу, вызывая функцию PostQuitMessage (), которая направляет в очередь сообщений приложения сообщение WM_QUIT, вследствие чего цикл обработки завершается.

Функция DefWindowProc( )

Функция DefWindowProcOобычно вызывается в блоке defaultоператора switch. Она возвращает все нераспознанные или необработанные сообщения обратно системе, гарантируя таким образом, что все посылаемые приложению сообщения будут корректно обработаны.

Создание проекта

Чтобы начать новый проект, выберите в окне компилятора в меню File команду New, а затем в открывшемся диалоговом окне New на вкладке Projects активизируйте элемент Win32 Application(рис. 17.1).

Рис. 17.1. Выбор типа проекта

Задайте для проекта имя SWP, щелкните на кнопке ОК, в появившемся окне мастера выберите опцию An empty project и вновь нажмите ОК, после чего будет создан пустой проект.

Чтобы добавить в проект программный файл, выберите в меню Project подменю Add To Project, а в нем — команду New(рис. 17.2).

291

Рис. 17.2. Для добавления в проект нового файла используется команда New из подменю Add

To Project

Воспользовавшись командой New, откройте диалоговое окно New(рис. 17.3), выделите в нем элемент C++ SourceFile и введите имя файла (в нашем примере это SWP.C).

292

Рис.17.3. Выбор типа добавляемого файла

Далее в окне редактора наберите текст программы (рис. 17.4).

293

Рис. 17.4. Исходный текст программы в окне редактора

Завершив ввод текста, сохраните файл, выбрав в меню File команду Save.

Следующий этап создания нового приложения состоит в построении исполняемого файла. Но для начала важно правильно установить опции проекта. Выберите в меню Project команду Settings.... Открывающееся при этом диалоговое окно ProjectSettings содержит множество вкладок, на которых представлены всевозможные опции сборки приложения. Убедитесь в том,

что на вкладке General в списке MicrosoftFoundationClasses выделена опция NotUsingMFC

(рис. 17.5).

294

Рис. 17.5. Установки вкладки General

По умолчанию для проекта создаются две конфигурации — Debug(отладонная) и Release(финальная), из которых активной является первая, поэтому все файлы создаются и сохраняются в папке DEBUG. Когда вы будете уверены в корректности работы приложения и решите создать окончательную версию, выберите в меню Build команду Set Active Configuration иукажитеконфигурациюRelease.

На вкладке Link в поле Output file name указано, в какую папку будет помещен исполняемый файл и как он будет называться (рис. 17.6). Обратите внимание, что по умолчанию выходной папкой является DEBUG.

295

Рис. 17.6. Установки вкладки Link

Текст программы

Мы уже рассмотрели большую часть файла SWP.C. Ниже показан полный его текст.

/*

*swp.c

*Простейшее приложение Windows.

*/

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, DINT, WPARAM, LPARAM); char szProgName[] = "ProgName";

int WINAPI WinMain(HINSTANCE hlnst, HINSTANCE hPrelnst, LPSTR IpszCmdLine, int nCmdShow) {

HWND hWnd;

MSG IpMsg; WNDCLASS wcApp;

wcApp.lpszClassName = szProgName;

wcApp.hlnstance

= hlnst;

wcApp.lpfnWndProc

= WndProc;

wcApp.hCursor

=

LoadCursor(NULL, IDC_ARROW);

wcApp.hlcon

=

0; wcApp.lpszMenuName = 0;

wcApp.hbrBackground = Getstockobject (WHITE_BRUSH) ;

wcApp. style

=

CS_HREDRAW | CS_VREDRAW;

wcApp.cbClsExtra

= 0;

wcApp . obWndExtra

=

0;

if ( IRegisterClass (swcApp) ) return 0;

{

hWnd = CreateWindow(szProgName, "Simple Windows Program", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAOLT,, CWJJSEDEFAULT,

296

CW_USEDEFAULT, (HWND) NULL, (HMENU)NULL, (HANDLE) hlnst, (LPSTR) NULL) ; ShowWindow(hWnd, nCmdShow) ; UpdateWindow(hWnd) ;

while (GetMessage (SlpMsg, 0, 0, 0)){ TranslateMessage(SlpMsg) ; DispatchMessage (SlpMsg) ; }

return (IpMsg.wParam) ;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM IParam) {

HOC hdc; PAINTSTRUCT ps; switch (messg) {case WM_PAINT:

hdc = BeginPaint(hWnd, Sps) ;

MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, 639,429); MoveToEx(hdc, 300, 0, NULL); LineTo(hdc, 50, 300);

TextOut(hdc, 120,-30,"<-a few lines ->",17);. ValidateRect(hWnd, NULL);

EndPaint(hWnd, sps); break; case WM_DESTROY: PostQuitMessage(0); break; default:

return(DefWindowProc(hWnd, messg, wParam, IParam)); break; }

return(0); }

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

MoveToEx(hdc. О, О, NULL);

LineTo{hdc, 639,429);

MoveToEx(hdc, 300, О, NULL);

LineTofhdc, 50, 300);

TextOut(hdc, 120, 30, "<- a few lines ->",17);

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

А пока что скомпилируйте и скомпонуйте приложение с помощью команды Build или RebuildAll меню Build, после чего посредством команды Execute запустите программу на выполнение. Окно приложения показано на рис. 17.7. Программа осуществляет вывод в окно двух линий и небольшого сообщения.

297

Рис. 17.7. Окно программы

Рисование эллипса

Функция Ellipse() используется для построения эллипса или окружности. Центр фигуры будет одновременно и центром воображаемого прямоугольника, в который вписывается эллипс. Координаты этого прямоугольника: xl,ylи х2,у2 .

Эллипс представляет собой замкнутую фигуру. Внутренняя область эллипса закрашивается цветом текущей кисти. Дескриптор контекста устройства задается параметром hdc. Все остальные параметры имеют тип int. Функция в случае успешного завершения возвращает значение true.

Синтаксис функции Ellipse() таков:

Ellipse (hdc, xl, yl, x2, y2}

В приведенном ниже фрагменте программы создаются небольшой эллипс и сопровождающая его надпись (рис. 17.9):

Ellipse(hdc, 200, 200, 275, 250);

TextOut(hdc, 210, 215, "<-an ellipse", 13);

Рис. 17.9. Эллипс, нарисованный в окне приложения

Рисование сегмента

Функция chord() рисует замкнутую дугу, конечные точки которой соединены линией с координатами хЗ,уЗ и х4,у4. Построение фигуры осуществляется против часовой стрелки (от точки хЗ,уЗ до точки х4,у4). Внутренняя область фигуры закрашивается цветом активной кисти. Дескриптор контекста устройства задается параметром hdc. Все остальные параметры имеют тип int. В случае успешного завершения функция возвращает значение

TRUE

298

Синтаксис функции Chord():

Chord (hdc,

xl, yl, x2,

y2,

хЗ,

уЗ, х4, y4)

В приведенном ниже фрагменте программы создается сегмент и сопровождающая его надпись

(рис. 17.11):

Chordfhdc, 550, 20, 630,80, 555, 25,625,70);

TextOutfhdc, 470, 30, " A Chord ->",11);

Рис. 17.11. Сегмент, нарисованный в окне приложения

Рисование сектора

Для рисования сектора предназначена функция Pie(). Центр эллипса, из которого вырезается сектор, будет одновременно и центром воображаемого прямоугольника, в который вписывается эллипс. Координаты этого прямоугольника — x1,y1 и х2,у2. Концы сектора обозначаются точками с координатами хЗ,уЗ и х4,у4. Построение фигуры осуществляется против часовой стрелки (от точки хЗ,уЗ до точки х4,у4). Внутренняя область сектора закрашивается цветом активной кисти. Дескриптор контекста устройства задается параметром hdc. Все остальные параметры имеют тип int. В случае успешного завершения функция возвращает значение true.

Синтаксис функции Pie():

 

 

 

Pie (hdc, xl, yl, x2, y2,

хЗ, уЗ,

х4,

y4)

В приведенном ниже фрагменте программы создается сектор и сопровождающая его надпись

(рис. 17.13):

Pie(hdc, 300, 50,-400, 150, 300, 50,300, 100);

TextOut(hdc, 350, 80, "<-A Pie Wedge", 14);

299

Рис. 17.13. Сектор, нарисованный в окне приложения

Рисование прямоугольника

Функция Rectangle() предназначена для построения прямоугольника или квадрата с использованием двух точек с. координатами xl,ylи х2,у2. Получаемая замкнутая фигура закрашивается цветом текущей кисти. Дескриптор контекста устройства задается параметром hdc. Все остальные параметры имеют тип int. В случае успешного завершения функция возвращает значение true.

Синтаксис функции Rectangle ():

Rectangle (hdc, xl, yl, x2, y2)

В приведенном ниже фрагменте программы создается прямоугольник и сопровождающая его надпись (рис. 17.14):

Rectangle(hdc, 50, 300, 150, 400);

TextOut(hdc, 160,350, "<- A Rectangle", 14);

Рис. 17.14. Прямоугольник, нарисованный в окне приложения

Использование файла SWP.C в качестве шаблона

В предыдущих параграфах описаны принципы разработки простейшего Windows-приложения, которое теперь может послужить шаблоном для создания других приложений. Ниже показан текст приложения, строящего синусоиду.

300