Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Разработка оконного приложения Win32API





Среда программирования Visual C++ 6.0 была разработана в 1998 году. Однако до сих пор ею пользуются многие разработчики консольных и написаннях на чистом Win32 API приложениях, так как она облает отличным компилятором, нетребовательна к компьютерам (можно работать даже на Pentium I), занимает мало места и может работать без установки на компьютер – пут.м простого копирования.

Внешний вид среды представлен на рисунке 1.

Рисунок 1 – Среда программирования Visual C++ 6.0

Перед тем, как начать программировать, необходимо проверить состояние настроек среды, которые находятся в Tools>Options>Directories (Рисунок 2).

Рисунок 2 – Окно настроек директорий

Пути до include и library файлов должны соответствовать их действительному местонахождению. Сюда же вы можете добавлять и свои пути.

Для создания нового проекта выберете File>New, в результате у вас появится окно (Рисунок 3).

Рисунок 3 – Окно создания нового проекта

Выберете из списка пункт «Win32 Application», в графу «Project Name» внесите название проекта и выберите путь до него в графе «Location», после этого нажмите «OK» и у вас появится следующее окно (Рисунок 4).

Рисунок 4 – Окно Шага 1 создания проекта

Нажмите «Finish», и у вас создастся пустой проект.

Теперь можно добавлять файлы в проект. Выберите Project>Add to Project>New – появится окно (Рис. 5).

Выберите «C++ Source File» и наберите в графе «File name» имя файла: main.

Затем нажмите «OK» – у вас добавился файл main.cpp. Аналогичным образом добавьте «C/C++ Header File» – у вас появится файл main.h.

Для создания вашего первого приложения на Win32API заполните эти файлыследующим ниже содержимым.

#ifndef _MAIN_

#define _MAIN_ 1

#include <windows.h>

HINSTANCE hInst;

//функция обработки сообщений

LRESULT CALLBACK WIN32PROC(HWND hWnd,UINT Message,UINT wParam,LONG lParam);

#endif

Листинг 3 – Файл main.h

Рисунок 5 – Окно добавления новых файлов

#include "main.h"

//Главная функция

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,

LPSTR lpszCmdParam,int nCmdShow)

{

hInst=hInstance;

WNDCLASS WndClass;

MSG Msg;

char ClassName[]="MYPROJECT";

HWND hWnd;

WndClass.style=CS_HREDRAW | CS_VREDRAW;

WndClass.lpfnWndProc=WIN32PROC;

WndClass.cbClsExtra=0;

WndClass.cbWndExtra=0;

WndClass.hInstance=hInstance;

WndClass.hIcon=NULL;

WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);

WndClass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);;

WndClass.lpszMenuName=NULL;

WndClass.lpszClassName=ClassName;

if (!RegisterClass(&WndClass))

{

MessageBox(NULL,"Cannot register class","Error",MB_OK | MB_ICONERROR);

return 0;

}

hWnd=CreateWindowEx(0, ClassName,"Моя первая программа",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL);

if (hWnd==NULL)

{

MessageBox(NULL,"Cannot create window","Error",MB_OK | MB_ICONERROR);

return 0;

}

ShowWindow(hWnd,nCmdShow);

UpdateWindow(hWnd);

MSG msg;

while (1) {

while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) == TRUE)

{

if (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

} else {

return TRUE;

}

}

}

return Msg.wParam;

}

//функция обработки сообщений

LRESULT CALLBACK WIN32PROC(HWND hWnd,UINT Message,

UINT wParam,LONG lParam)

{

switch(Message)

{

case WM_DESTROY:

PostQuitMessage(0);

break;

}

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

}

Листинг 4 – Файл main.cpp

Сохраните вс. и откомпилируйте, используя F7 или через пункт меню «Build».

После запуска у вас должно появиться ч.рное окно. Ваша первая программа на Win32 API готова.

Кратко опишем то, что происходит внутри функции WinMain. Первоначально заполняется структура окна WNDCLASS, в которой устанавливаются основне свойства окна.

После этого с помощью функции RegisterClass ваш класс регистрируется в Windows. Как вы заметили, у вашей программы отсутствует иконка, чтобы добавить е. необходимо воспользоваться редактором ресурсов.

Для этого выберите Project>Add to Project>New, а там выберите «Resource Script» и в

графе «File name» – res. У вас должно создаться два файл: res.rc и resource.h. Ниже списка файлов в проекте у вас должна появиться закладка «Resource View».

Переключитесь на закладку и, щелкнув правой кнопкой на «res resources», выберите «Insert» – появится окно (Рисунок 6).

Рисунок 6 – Окно добавления ресурсов

Выберите «Icon» и нажмите «New». Отредактируйте и сохраните иконку.

Теперь можно подключать ее к программе.

Сначала подключите к проекту файл resource.h с помощью Project>Add to Project>Files. Добавьте в основную программу строку:

#include "resource.h" (ниже строки #include "main.h").

Замените строку в создании класса

WndClass.hIcon=NULL; на

WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));

Здесь IDI_ICON1 указывает на вашу иконку. Компилируйте проект – иконка присоединена. Описание остальных элементов структуры приведено ниже.

Структура WNDCLASS.

typedef struct tagWNDCLASS

{

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCSTR lpszMenuName;

LPCSTR lpszClassName;

} WNDCLASS;

style – определяет стиль класса. Стили можно объединять, используя |. Вот какие они бывают:

CS_BYTEALIGNCLIENT – (по горизонтали) выравнивание рабочей области окна по границе байта. Влияет на ширину окна и его горизонтальное положение на экране;

CS_BYTEALIGNWINDOW – (по вертикали) выравниается окна по границе байта;

CS_CLASSDC – контекст устройства, который будет разделяться всеми окнами класса. При нескольких потоках операционная система разрешит доступ только одному потоку;

CS_DBLCLKS – посылать сообщение от мыши при двойном щелчке в пределах класса окна;

CS_GLOBALCLASS – Создавать глобальный класс, который можно поместить в динамическую библиотеку DLL;

CS_HREDRAW – перерисовывать вс. окно при изменении ширины;

CS_NOCLOSE – отключить команду «Закрыть»;

CS_OWNDC – у каждого окна уникальный контекст устройства;

CS_PARENTDC – у дочернего окна будет область отсечки от родительского.

Повышает производительность;

CS_SAVEBITS – позволяет сохранять область экрана в виде битовой матрицы закрытую в данный момент другим окном, используется для восстановления экрана;

CS_VREDRAW – перерисовывать окно при изменении вертикальных размеров.

WNDPROC – указатель на процедуру окна вызываемую функцией

CallWindowProc.

cbClsExtra – объем памяти выделяемый за структурой класса.

cbWndExtra – объем дополнительной памяти за экземпляром окна.

hInstance – дескриптор экземпляра.

hIcon – дескриптор иконы окна.

hCursor – дескриптор курсора окна.

hbrBackground – дескриптор для закраски фона.

lpszMenuName – имя меню в ресурсах.

lpszClassName – имя класса.

После регистрации класса окна вызывается функция CreateWindowEx, предназначенная для создания окна.

Функция CreateWindowEx

HWND CreateWindowEx

(

DWORD dwExStyle, // улучшенный стиль окна

LPCTSTR lpClassName, // указатель на зарегистрированное имя класса

LPCTSTR lpWindowName, // указатель на имя окна

DWORD dwStyle, // стиль окна

int x, // горизонтальная позиция окна

int y, // вертикальная позиция окна

int nWidth, // ширина окна

int nHeight, // высота окна

HWND hWndParent, // дескриптор родительского или окна

// собственника

HMENU hMenu, // дескриптор меню или идентификатор

// дочернего окна

HINSTANCE hInstance, // дескриптор экземпляра прикладной

// программы

LPVOID lpParam // указатель на данные создания окна

);

Параметры:

dwExStyle – определяет расширенный стиль окна. Этот параметр может быть одно из следующих значений:

WS_EX_ACCEPTFILES – Определяет, что окно, созданное с этим стилем принимает файлы при помощи информационной технологии «перетащи и вставь».

WS_EX_APPWINDOW – Активизирует окно верхнего уровня на панель задач, корда окно свернуто.

WS_EX_CLIENTEDGE – Определяет, что окно имеет рамку с углубленным краем.

WS_EX_CONTEXTHELP – Включает вопросительный знак в строку заголовка окна.

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

Если пользователь затем щелкает мышью по дочернему окну, потомок принимает сообщение WM_HELP.

Дочернее окно должно передать сообщение родительской оконной процедуре, которая должна вызваться функцией WinHelp, использующей команду HELP_WM_HELP.

Прикладная программа Справки показывает выскакивающее окно, которое обычно содержит справку для дочернего окна.

WS_EX_CONTEXTHELP не может использоваться со стилями WS_MAXIMIZEBOX или WS_MINIMIZEBOX.

WS_EX_CONTROLPARENT – Позволяет пользователю передвигаться среди дочерних окон основного окна, используя клавишу табуляции (TAB).

WS_EX_DLGMODALFRAME – Создает окно, которое имеет двойную рамку; окно может быть создано (необязательно) со строкой заголовка, которую определяет стиль WS_CAPTION в параметре dwStyle.

WS_EX_LEFT – Окно имеет общеупотребительные свойства «выравнивания по левой границе». Это – по умолчанию.

WS_EX_LEFTSCROLLBAR – Если язык оболочки Еврейский, Арабский или другой язык, который придерживается иного порядка чтения, вертикальная линейка прокрутки (если появляется) – слева от рабочей области. Для других языков, этот стиль игнорируется и не обрабатывается как ошибка.

WS_EX_LTRREADING – Текст окна отображается, используя свойство порядка чтения «Слева – Направо». Это – по умолчанию.

WS_EX_MDICHILD – Создает MDI дочернее окно.

WS_EX_NOPARENTNOTIFY – Определяет, что дочернее окно, созданное с этим стилем не посылает сообщение WM_PARENTNOTIFY родительскому окну, корда оно создается или разрушается.

WS_EX_OVERLAPPEDWINDOW – Объединяет стили WS_EX_CLIENTEDGE и WS_EX_WINDOWEDGE.

WS_EX_PALETTEWINDOW – Объединяет стили WS_EX_WINDOWEDGE,

WS_EX_TOOLWINDOW и WS_EX_TOPMOST.

WS_EX_RIGHT – Окно имеет общеупотребительные свойства «выравнивание по правому краю». Оно зависит от класса окна. Этот стиль имеет эффект только тогда, если язык оболочек Еврейский, Арабский или другой язык, который поддерживает иной порядок выравнивания для чтения; иначе, стиль игнорируется и не обрабатывается как ошибка.

WS_EX_RIGHTSCROLLBAR – Вертикальная линейка прокрутки (если появляется) – справа от рабочей области. Это - по умолчанию.

WS_EX_RTLREADING – Если язык оболочки Еврейский, Арабский или другой язык, который придерживается иного порядка выравнивания для чтения, текст в окне отображается, используя свойства порядка чтения «Справа – Налево». Для других языков, стиль игнорируется и не обрабатывается как ошибка.

WS_EX_STATICEDGE – Создает окно с трехмерным стилем рамки, предполагается использовать для элементов, которые не принимают вводимую информацию от пользователя.

WS_EX_TOOLWINDOW – Создает окно инструментальных средств; то есть окно предполагается использовать как плавающую инструментальную панель. Окно инструментальных средств имеет строку заголовка, которая является короче, чем нормальная строка заголовка, а заголовок окна выводится, с использованием меньшего шрифта. Окно инструментальных средств не появляется в панели задач или в диалоговом окне, которое появляется, когда пользователь нажимает ALT+TAB.

WS_EX_TOPMOST – Определяет, что окно, созданное с этим стилем должно бать размещено выше всех, не самых верхних окон и должно стоять выше их, даже тогда, когда окно дезактивировано. Чтобы добавить или удалить этот стиль, используйте функцию SetWindowPos.

WS_EX_TRANSPARENT – Определяет, что окно, созданное с этим стилем долино быть прозрачным. То есть любые окна, которые появляются из-под окна, не затеняются им. Окно, созданное с этим стилем принимает WM_PAINT сообщения только после того, как все сестринские окна под ним модифицировались.

WS_EX_WINDOWEDGE – Определяет, что окно имеет рамку с выпуклым краем.

Использование стиля WS_EX_RIGHT для статического или редактируемого элементов управления имеет тот же самый эффект как и использование стиля SS_RIGHT или ES_RIGHT, соответственно. Использование этого стиля с командными кнопками имеет тот же самый эффект как и использование стилів BS_RIGHT и BS_RIGHTBUTTON.

lpClassName – указывает на строку с нулевым символом в конце или на целочисленный атом.

Если lpClassName – атом, он должен быть глобальным атомом, созданным предыдущим вызовом функции GlobalAddAtom. Атом, 16-разрядное значение меньше чем 0xC000, должно быть младшим словом в lpClassName; старшее слово должно быть нулевое.

Если lpClassName – строка, она определяет имя класса окна. Имя класса может быть любое имя, зарегистрированное функцией RegisterClass или любым из предопределенных имен класса элементов управления.

lpWindowName – указывает на строку с нулевым символом в конце, которая определяет имя окна.

dwStyle – определяет стиль создаваемого окна. Основные стили:

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

WS_CAPTION – Создание окна с заголовком (невозможно использовать одновременно со стилем WS_DLGFRAME).

WS_CHILD, WS_CHILDWINDOW – Создание дочернего окна (невозможно использовать одновременно со стилем WS_POPUP).

WS_CLIPCHILDREN – Исключает область, занятую дочерним окном, при выводе в родительское окно.

WS_CLIPSIBLINGS – Используется совместно со стилем WS_CHILD для обрисовки в дочернем окне областей клипа, перекрываемых другими окнами.

WS_DISABLED – Создает окно, которое недоступно.

WS_DLGFRAME – Создает окно с двойной рамкой, без заголовка.

WS_GROUP – Позволяет объединять элементы управления в группы.

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

WS_MAXIMIZE – Создает окно максимального размера.

WS_MAXIMIZEBOX – Создает окно с кнопкой развертывания окна.

WS_MINIMIZE

WS_ICONIC – Создает первоначально свернутое окно (используется только со стилем WS_OWERLAPPED).

WS_MINIMIZEBOX – Создает окно с кнопкой свертывания.

WS_OVERLAPPED – Создает перекрывающееся окно (которое, как правило, имеет

заголовок и WS_TILED рамку).

WS_OVERLAPPEDWINDOW – Создает перекрывающееся окно, имеющее стили WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX.

WS_POPUP – Создает popup-окно (невозможно использовать совместно со стилем WS_CHILD.

WS_POPUPWINDOW – Создает popup-окно, имеющее стили WS_BORDER, WS_POPUP, WS_SYSMENU.

WS_SYSMENU – Создает окно с кнопкой системного меню (можно использовать только с окнами имеющими строку заголовка).

WS_TABSTOP – Определяет элементы управления, переход к которым может быть выполнен по клавише TAB.

WS_THICKFRAME – Создает окно с рамкой, используемой для изменения раз мера окна.

WS_VISIBLE – Создает первоначально неотображаемое окно.

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

x – определяет начальную горизонтальную позицию окна.

Для перекрывающего или выскакивающего окна параметр x – начальная x-координата левого верхнего угла окна, в экранных координатах устройства.

Для дочернего окна x – x-координата левого верхнего угла окна относительно левого верхнего угла рабочей области родительского окна.

Если x установлен как CW_USEDEFAULT, Windows выбирает заданную по умолчанию позицию для левого верхнего угла окна и игнорирует y параметр.

Стиль CW_USEDEFAULT допустим только для перекрывающих окон; если он определен для всплывающего или дочернего окна параметры x и y устанавливаются в нуль.

y – определяет начальную вертикальную позицию окна.

Для перекрывающего или выскакивающего окна, параметр y – начальная y-координата левого верхнего угла окна, в экранных координатах устройства.

Для дочернего окна, y – начальная y- координата левого верхнего угла дочернего окна относительно левого верхнего угла рабочей области родительского окна.

Для окна со списком, y – начальная y-координата левого верхнего угла рабочей области окна со списком относительно левого верхнего угла рабочей области родительского окна. Если перекрывающее окно создано в стиле WS_VISIBLE с набором битов, а параметр x установлен как CW_USEDEFAULT, Windows игнорирует параметр y.

nWidth – определяет ширину окна в единицах измерения устройства.

Для перекрывающих окон nWidth – ширина окна в экранной системе координат или CW_USEDEFAULT.

Если nWidth – CW_USEDEFAULT, Windows выбирает заданную по умолчанию ширину и высоту для окна; заданная по умолчанию ширина простирается от начальных x-координат до правого края экрана; заданная по умолчанию высота простирается от начальной y-координаты до верхней части области значка.

Стиль CW_USEDEFAULT допустим только для перекрывающих окон; если CW_USEDEFAULT определен для выскакивающего или дочернего окна, параметры nWidth и nHeight устанавливаются в нуль.

nHeight – определяет высоту окна в единицах измерения устройства.

Для перекрывающих окон, nHeight – высота окна в экранной системе координат.

Если параметр nWidth установлен как CW_USEDEFAULT, Windows игнорирует nHeight.

hWndParent – идентифицирует родительское окно или владельца создаваемого окна.

Допустимый дескриптор окна должен быть дан, когда дочернее окно или находящееся в собственности окно созданы. Дочернее окно ограничено раб очей областью родительского окна. Находящееся в собственности окно – перекрывающее окно, которое разрушается, когда окно его владельца разрушено или скрыто, корда его владелец свернут; оно всегда отображается на верхней части окна его владельца.

Несмотря на то, что этот параметр должен определять правильный дескриптор, если параметр dwStyle включает в себя стиль WS_CHILD, это необязательно, если dwStyle включает в себя стиль WS_POPUP.

hMenu – идентифицирует меню или, в зависимости от стиля окна, определяет идентификатор дочернего окна.

Для перекрывающего или выскакивающего окна, hMenu идентифицирует меню, которое будет использоваться окном; этот параметр может быть значением NULL, если меню класса будет использовано. Для дочернего окна, hMenu определяет идентификатор дочернего окна, целочисленное значение, используемое элементом управления диалогового окна, что-бы сообщать родителю о событиях. Прикладная программа определяет идентификатор дочернего окна; он должно быть уникальным для всех дочерних окон того же самого родительського окна.

hInstance – идентифицирует экземпляр модуля, который будет связан с окном.

lpParam – указывает на значение, переданное окну через структуру CREATESTRUCT, вызванную параметром lParam сообщения WM_CREATE.

Если прикладная программа вызвала CreateWindow, чтобы создать пользовательское окно многодокументной среды, lpParam должен указывать на структуру CLIENTCREATESTRUCT.

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

Если функция успешно завершила работу, возвращаемое значение – дескриптор для созданного окна.

Если функция потерпела неудачу, возвращаемое значение – NULL.

После успешного создания окна вызываются функции включения отображения окна ShowWindow и обновления окна UpdateWindow.

Затем происходит вход в цикл обработки сообщений. Сообщения обрабатываются в функции WIN32PROC, которую предварительно указали в классе окна.

Задание:

1. Ознакомиться со средой программирования Visual C++ 6.0.

2. Разработать программу создающую окно с иконкой средствами Win32 API.

Контрольные вопросы:

1. Каково назначение структуры WNDCLASS?

2. Какие операции производит функция CreateWindowEx?

3. Зачем нужен цикл по при.му сообщений?

4. Что происходит в функции обработки сообщений?

Для самостоятельного изучения:

1. Различные способы построения циклов обработки сообщений.







Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.