Программирование для окон
Вам еще не надоело создавать консольные приложения? Я так и знал: Ну что ж, тогда я не зря старался при написании данного материала, который обязан пролить свет на программирование в среде Windows, и научить вас создавать полноценные оконные приложения, в зависть вашему соседу, который еще этого не умеет.
Система, основанная на сообщениях
Windows можно назвать объектно-ориентированной системой, хотя формально она таковой не является. Представьте себе систему в виде набора объектов, основным из которых является окно. В процессе работы, Windows «общается» с каждым объектом посредством системных сообщений. При возникновении определенных событий, Windows сообщает об этом окну приложения, посылая ему соответствующее сообщение. Окно, после получения сообщения, должно обработать его и возвратить результат обратно в систему.
Как программа узнает о том, что ее окну послано сообщение? Ответ напрашивается сам. На протяжении всей работы программы необходимо проверять, имеются ли в очереди сообщения. Делается это, конечно-же, с помощью цикла, который выполняется в течении всей работы программы. При каждом проходе цикла проверяется наличие сообщений в очереди, и если таковые имеются, тогда программа поочередно получает их и обрабатывает.
Win32 API
Win32 API (Application Programming Interface — интерфейс прикладного программирования) — это набор функций, позволяющих программисту создавать приложения для Windows. Win32 API является основой для каждой Windows-программы.
Программисты, пишущие на С++ уже привыкли, что точкой входа в программу является функция main(). Но в системе Windows это не так. Все Win32-приложения используют в качестве точки входа в программу функцию WinMain. Ее объявление можно найти в заголовочном файле winbase.h:
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd );
Давайте рассмотрим все ее аргументы:
- hInstance — идентификатор экземпляра приложения.
- hPrevInstance — идентификатор предыдущего экземпляра приложения. В Win32 он всегда равен нулю.
- lpCmdLine — указатель на командную строку.
- nShowCmd — флаги для окна.
Как видите — все не так сложно! Вас, наверное, удивили только какие-то непонятные типы данных. Не волнуйтесь — разберемся.
Типы данных в Windows
При первом взгляде на исходный код Windows-приложения, начинающих программистов начинают пугать «странные» типы данных, используемые в программе. Но это только на первый взгляд. На самом, деле разобраться в них вам не составит особого труда. Основные типы данных Win32 API приведены в таблице 1.
BOOL, BOOLEAN | Булев. Имеет только 2 значения: TRUE или FALSE |
CHAR | 8-битный символ (ANSI Windows) |
WCHAR | 16-битный символ (Unicode) |
TCHAR | CHAR или WCHAR (если используется Unicode) |
USHORT, WORD | Целое беззнаковое 16-битное число |
DWORD, DWORD32, UINT32 | Целое беззнаковое 32-битное число |
DWORD64, UINT64, ULONGLONG | Целое беззнаковое 64-битное число |
FLOAT | Число с плавающей точкой |
SHORT | Целое знаковое 16-битное число |
INT, INT32, LONG, LONG32 | Целое знаковое 32-битное число |
INT64, LONG64, LONGLONG | Целое знаковое 64-битное число |
VOID | Пустой тип |
Структура Windows-программ
Каждая Windows-программа состоит как минимум из двух основных функций. Это WinMain и функция окна.
Давайте напишем простую программу, создающую пустое окно. Для этого в Visual C++ создайте пустой проект Win32 Application, добавьте новый файл (например, myprog.cpp), и вставьте туда следующий код:
// Включаем необходимый заголовочный файл для Windows-программ #include // Объявление функции окна (оконной процедуры) LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); HINSTANCE hInst; // Идентификатор приложения // Указатель на константную строку символов - имя программы и класса окна LPCSTR AppName = "MyProgramm"; // Точка входа в программу - функция WinMain int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) < HWND hWnd; // Уникальный идентификатор окна (handle) MSG msg; // Объявление структуры типа MSG, для работы с сообщениями hInst = hInstance; // Сохраняем идентификатор приложения // Заполняем структуру WNDCLASS WNDCLASS wc; // Инициализируем выделенную для структуры память нулями ZeroMemory(&wc, sizeof(wc)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.hInstance = hInst; wc.hIcon = LoadIcon(hInst, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = AppName; RegisterClass(&wc); // Создаем и регистрируем оконный класс // Создаем окно программы hWnd = CreateWindow( AppName, // Имя класса окна AppName, // Заголовок окна WS_OVERLAPPEDWINDOW, // Стиль окна CW_USEDEFAULT, 0, // Горизонтальная и вертикальная позиции окна 300, 300, // Ширина и высота окна NULL, // Хендл родительского окна NULL, // Хендл меню hInst, // Идентификатор приложения NULL); // Дополнительные данные окна ShowWindow(hWnd, SW_SHOW); // Отображаем окно UpdateWindow(hWnd); // Перерисовываем окно // Стандартный цикл обработки сообщений while(GetMessage(&msg, NULL, 0, 0)) < TranslateMessage(&msg); DispatchMessage(&msg); >return msg.wParam; > // Оконная процедура LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) < switch(msg) < case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); >return 0; >
Теперь давайте рассмотрим приведенный код подробнее.
К сожалению, привести здесь описания всех типов данных, структур, функций и т.д., используемых в Win32 API, не представляется возможным, поэтому советую обратиться к официальному источнику, где можно найти всю необходимую информацию о программировании под Windows — Microsoft Developer Network (msdn.microsoft.com).
Для того чтобы создать окно, сначала необходимо зарегистрировать в системе новый оконный класс. Для этого нужно заполнить структуру WNDCLASS и передать указатель на область памяти, содержащую эту стуктуру, функции RegisterClass(). Данная функция создает и регистрирует новый оконный класс, используя значения элементов переданной ей структуры для определения характеристик класса. Ниже приведены описания всех элементов структуры WNDCLASS.
- style — стиль окна данного класса.
- lpfnWndProc — указатель на функцию окна, которая вызывается каждый раз при получении окном нового сообщения.
- cbClsExtra и cbWndExtra — дополнительный размер резервируемой памяти (в байтах) для структур класса и окна.
- hInstance — идентификатор приложения.
- hIcon — идентификатор иконки, связанной с классом.
- hCursor — идентификатор курсора, связанного с классом.
- hbrBackground — идентификатор кисти, которой будет закрашен фон окна.
- lpszMenuName — имя меню.
- lpszClassName — имя создаваемого класса окна.
Как вы, наверное, заметили, в приведенном выше коде явно заполняются не все поля структуры, а только те, которые необходимы в для данного класса. Все остальные поля инициализируются нулевыми значениями с помощью функции ZeroMemory(), которая выполняет аналогичное ее имени действие.
После регистрации класса окна можно приступать к созданию самого окна. Для этого используется функция CreateWindow(), которая возвращает хендл создаваемого окна.
Создав окно, нам необходимо отобразить его на экране. Этим занимается функция ShowWindow(), которая принимает в качестве аргументов идентификатор окна, и флаг, указывающий на способ отображения окна (в данном случае SW_SHOW, определяющий, что окно необходимо показать на экране). Затем, с помощью функции UpdateWindow() мы посылаем нашему окну сообщение WM_PAINT, указывающее на необходимость перерисовать клиентскую область окна.
Далее следует цикл обработки сообщений. Он состоит из управляющей структуры while, которая при каждом проходе цикла получает очередное сообщение из очереди, посредством функции GetMessage(), затем переводит все сообщения от виртуальных клавиш в символьные сообщения с помощью функции TranslateMessage() (о предназначении данной операции мы поговорим позже), и после этого отсылает полученное сообщение на обработку оконной процедуре, используя функцию DispatchMessage().
Функция GetMessage() возвращает ненулевое значение, поэтому цикл не завершается до момента завершения программы. При завершении программы окну посылается сообщение WM_QUIT, которое является единственным сообщением, при получении которого функция GetMessage() возвращает ноль, и цикл обработки сообщений завершается, а код выхода из программы, хранящийся в элементе wParam структуры MSG, возвращается функцией WinMain.
И наконец, пора разобраться каким же образом оконная процедура обрабатывает переданные ей сообщения. У функции окна имеется четыре аргумента:
- hWnd — идентификатор окна.
- msg — код текущего сообщения.
- wParam и lParam — дополнительная информация о сообщении.
В Windows существует более тысячи стандартных сообщений. Конечно же, программист не должен обрабатывать их все. Для этого существует функция DefWindowProc(), которая обрабатывает переданное ей сообщение по умолчанию. Таким образом, вы должны обрабатывать только те сообщения, обработка по умолчанию которых вас не устраивает. Также, функция DefWindowProc() не обрабатывает сообщение WM_DESTROY, поэтому вы должны предусмотреть его обработку самостоятельно. В приведенном примере, при получении окном сообщения WM_DESTROY, мы, с помощью функции PostQuitMessage(), ставим в очередь сообщение WM_QUIT, чтобы завершить работу программы.
Заметьте, каким образом сообщения обрабатываются по умолчанию. В структуре switch оконной процедуры предусмотрена метка default, которая пересылает все необрабатываемые нашей программой сообщения функции DefWindowProc() и возвращает результат этой функции. А если сообщение обрабатывается нашей программой, тогда возвращается ноль.
Вот оно, чудо
Теперь, разобравшись с кодом программы, откомпилируйте созданный проект и запустите приложение. Вы увидите пустое окно, с которым уже можно выполнять стандартные действия — перемещать, изменять размеры, сворачивать/разворачивать, и даже закрыть! : Все это достигается одним единственным стилем окна WS_OVERLAPPEDWINDOW, определенным при создании окна функцией CreateWindow().
Примечание: в элементе style, структуры WNDCLASS, определяется общий стиль для всех окон данного класса. Следует заметить, что стиль класса это не тоже самое что и стиль окна, указанный в вызове функции CreateWindow(). Тот стиль, который устанавливается посредством функции CreateWindow(), является индивидуальным стилем окна, а не общим стилем, определенным в классе.
Ресурсы программы
Практически в каждой Windows-программе можно увидеть различные элементы управления, меню, и другие ресурсы программы. Создать в окне какой либо элемент управления, например, кнопку, можно двумя способами. Первый, это создать новое окно используя функцию CreateWindow() с предопределенным в системе оконным классом «button». Второй способ, это использовать файлы ресурсов, в которых содержится описания всех ресурсов программы, будь то меню, элементы управления, иконки и даже диалоговые окна. Каждый элемент управления имеет свой уникальный идентификатор (хендл) определяемый программистом. Когда пользователь совершает какие либо действия над элементом управления, сообщение об этом поступают окну, и после этого выполняются соответствующие действия. К примеру, при нажатии на кнопку окно получает сообщение WM_COMMAND, которое в параметре wParam содержит идентификатор кнопки.
Подробнее о ресурсах приложения и работе с сообщениями мы поговорим несколько позже.
Создать Windows окно с кнопкой в вижуал студио
Как можно создать окно без использования c++. Net?
Я знаю 2 варианта: win32api, mfc.
Но слышал что в 15ой студии появился конструктор формы. Как его запустить?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Используя иерархию и наследование, создать классы окно, окно с заголовком и окно с кнопкой
Используя иерархию и наследование, создать классы окно, окно с заголовком и окно с кнопкой. C++
файлы в Вижуал студио
крч. надо доделать код, что бы он открывал фаил, и удалял элементы в файле. и что бы можно было.
програма в вижуал студио С++
Помогите мне зделать програму в вижуал С++, пробовала сама и оказалось что я полный 0. .
Шаблоны в вижуал студио
Здравствуйте, уважаемые форумчане! Недавно столкнулся с такой проблемой: раньше я использовал.
6578 / 4563 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
Сообщение от Dimarik__1
Но слышал что в 15ой студии появился конструктор формы. Как его запустить?
Он был всегда и называется «Редактор ресурсов»
Твоё окно можно создать например так: New Project -> MFC App -> Application Type = Dialog Based
https://docs.microsoft.com/en-. w=msvc-160
Либо на голом WinAPI https://docs.microsoft.com/en-. alog-boxes
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь
подсказки в вижуал студио
у меня стоит VS2008 Expres раньше все было нормально, но потом (я наверно куда то не туда.
Модуль с++ для вижуал студио
Скачал с киберфорума вижуал студио, но не запускаются программы, опишите, как сделать, чтобы все.
Создание программ в вижуал студио
Приветствую всех. Я не знаю, к какой теме конкретно относится моя проблема, поскольку, она довольно.
Ошибка LNK2019 в вижуал студио
Написал программу: есть 2 класса 1)Dannie и 2)Anotacii есть третий клас 3)St (статья) который.
Жуткая ошибка в Вижуал Студио !
Записал Microsoft Visual Studio 2008 при нажатии Rebuild Solution выдает кучу ошибое, хотя все.
Нужно ли подключать FLTK в вижуал студио
1Подскажите. Нужно ли подключать обязательно FLTK в вижуал студио?и почему?и зачем?Можно ли.
Как создать окно в c visual studio
На этом шаге мы рассмотрим алгоритм создания проекта с помощью AppWizard .
Запустите AppWizard . Выберите опцию MFC AppWizard (exe) . В поле Project Name введите МуAрр и щелкните кнопку ОК :
Рис.1. Диалоговое окно New
Замечание . По умолчанию AppWizard разместит проект каталоге C:\Program Files\Microsoft Visual Studio\My Projects . Если Вы хотите изменить местоположение проекта, введите новый путь в поле Location .
Появится первое диалоговое окно мастера MFC AppWizard , показанное на рисунке 2:
Рис.2. MFC AppWizard — окно 1
В первом окне мастера MFC AppWizard Вам предлагается выбрать тип приложения: однодокументное ( Single Document Interface — SDI , переключатель Single document ), многодокументное ( Multiple Document Interface — MDI , переключатель Multiple documents ) или на основе диалогового окна (переключатель Dialog based ). В SDI -приложениях может быть открыт только один документ в главном окне, в то время как в MDI -приложениях — несколько, каждый документ в отдельном дочернем окне. В третьем типе приложения в качестве главного окна используется диалоговое окно. Все эти типы приложения подробно будут описаны позже.
Вы можете получить справку о каждом переключателе, выбрав его и нажав клавишу F1 .
Далее показано, как создать SDI -приложение МуАрр.ехе .
Измените тип приложения с Multiple documents на Single document . Щелкните кнопку Next , чтобы перейти к следующему диалоговому окну (рисунок 3).
Рис.3. MFC AppWizard — окно 2
Вопросы поддержки баз данных будут рассмотрены позже. Оставьте None выбранным и щелкните кнопку Next , чтобы перейти к следующему диалоговому окну (рисунок 4).
Рис.4. MFC AppWizard — окно 3
В этом диалоговом окне представлены параметры, связанные с технологией ActiveX , использующей СОМ для взаимодействия программных компонентов друг с другом независимо от языка, на котором они написаны. Существует еще одна технология, основанная на СОМ , — OLE , которая применяется для создания составных документов (включающих данные разных форматов и созданных разными приложениями) и работы с ними. Не изменяя никакие параметры, щелкните кнопку Next , чтобы перейти к следующему диалоговому окну (рисунок 5).
Рис.5. MFC AppWizard — окно 4
Параметры данного диалогового окна позволяют задать функции, которые должны поддерживать Ваше приложение. Не изменяя никакие параметры, щелкните кнопку Advanced .
Рис.6. Вкладка Document Template Strings диалогового окна Advanced Options
В диалоговом окне Advanced Options две вкладки. На одной из них, Document Template String (рис. 6), Вы вправе задать параметры типа документа, связанного с приложением. Это позволит Windows связать тип документа с приложением. В дальнейшем, когда пользователь дважды щелкнет имя файла, Windows автоматически запустит приложение, которое может работать с ним.
Рис.7. Вкладка Window Styles диалогового окна Advanced Options
На вкладке Window Styles (рис. 7) определяются характеристики окна приложения.
На вкладке Document Template Strings в поле File extension введите mya и щелкните кнопку Close . Щелкните кнопку Next , чтобы перейти к следующему диалоговому окну (рисунок 8):
Рис.8. MFC AppWizard — окно 5
Первый параметр этого диалогового окна позволяет Вам создать приложение с интерфейсом, подобным интерфейсу Windows Explorer , — элементы управления для просмотра дерева и списка, расположенные рядом в разделенном на две части окне. Оставьте пункт MFC Standard выбранным, не изменяйте и второй параметр.
Последний параметр отвечает за то, как вместе с Вашим приложением будут распространяться библиотеки MFC . Оставьте переключатель As a shared DLL помеченным и щелкните кнопку Next , чтобы перейти к последнему диалоговому окну мастера AppWizard 1 (рисунок 9).
Рис.9. MFC AppWizard — окно 6
Последнее диалоговое окно мастера AppWizard содержит информацию о классах и файлах, которые будут созданы. Вы можете изменить их названия, если недовольны стандартными. Заметьте, что Вы имеете право изменить и базовый класс, от которого наследуется Ваш класс представления. Этот класс используется в MFC -приложениях для отображения данных. Щелкните раскрывающийся список Base Class , чтобы просмотреть доступные параметры. Этот список очень важен. Перечисленные в нем базовые классы включают все функции стандартных элементов управления, средствами которых организуется отображение данных. Если Вы выберите CRichEditView , то Ваше приложение будет основано на полнофункциональном текстовом редакторе. Используя CHtmlView , Вы можете написать программу на базе HTML -браузера. Предлагаемый по умолчанию класс CView отображает пустое окно, в котором можно выводить данные в любой форме. Класс CScrollView отличается от CView только наличием функции прокрутки, что позволяет отобразить данные, полностью не умещающиеся на экране монитора.
В раскрывающемся списке Base Class выберите CScrollView . Щелкните кнопку Finish , чтобы перейти к диалоговому окну New Project Information , в котором появится информация о проекте. Проверьте еще раз все определенные Вами параметры, так как после создания проекта его нельзя переделать, запустив AppWizard повторно. Прочитав данное резюме, щелкните кнопку ОК , после чего проект будет создан и открыт в новой рабочей области.
В окне Workspace появится значок МуАрр Classes . Щелкнув значок «+» рядом с ним, Вы можете увидеть классы, созданные мастером AppWizard . На следующем шаге Вы скомпилируете из них работающее приложение. Дважды щелкните значок СМуАррАрр Class и просмотрите объявление этого класса:
Рис.10. Объявление класса СМуАррАрр
На следующем шаге мы рассмотрим среду разработки .
Как создать окно в c visual studio
Для создания графических приложений на C# можно использовать .NET CLI, но также можно использовать бесплатную и полнофункциональную среду разработки — Visual Studio Community 2022 , которая в ряде случаев облегчает проектирование приложения. Так, загрузим установщик Visual Studio по адресу: https://www.visualstudio.com/en-us/downloads.
Чтобы добавить в Visual Studio поддержку проектов для Windows Forms и C# и .NET 7, в программе установки среди рабочих нагрузок нужно выбрать только пункт Разработка классических приложений .NET . Можно выбрать и больше опций или вообще все опции, однако стоит учитывать свободный размер на жестком диске — чем больше опций будет выбрано, соответственно тем больше места на диске будет занято.
После установки среды и всех ее компонентов, запустим Visual Studio и создадим проект графического приложения. На стартовом экране выберем Create a new project (Создать новый проект)
На следующем окне в качестве типа проекта выберем Windows Forms App :
Стоит отметить, что среди шаблонов можно увидеть еще тип Windows Forms App (.NET Framework) — его НЕ надо выбирать, необходим именно тип Windows Forms App .
Далее на следующем этапе нам будет предложено указать имя проекта и каталог, где будет располагаться проект.
В поле Project Name дадим проекту какое-либо название. В моем случае это HelloApp .
На следующем окне Visual Studio предложит нам выбрать версию .NET, которая будет использоваться для проекта. Выберем последнюю на данный момент версию — .NET 7.0 и нажмен на кнопку Create (Создать) для создания проекта.
После этого Visual Studio откроет наш проект с созданными по умолчанию файлами:
Справа находится окно Solution Explorer, в котором можно увидеть структуру нашего проекта. Практически этот тот же проект, который создается с помощью .NET CLI:
- Dependencies — это узел содержит сборки dll, которые добавлены в проект по умолчанию. Эти сборки как раз содержат классы библиотеки .NET, которые будет использовать C#
- Form1.Designer.cs : он содержит определение компонентов формы, добавленных на форму в графическом дизайнере
- Далее идет файл единственной в проекте формы — Form1.cs , который по умолчанию открыт в центральном окне.
- Program.cs определяет точку входа в приложение
Запуск приложения
Чтобы запустить приложение в режиме отладки, нажмем на клавишу F5 или на зеленую стрелочку на панели Visual Studio.
После этого запустится пустая форма Form1 по умолчанию.
После запуска приложения студия компилирует его в файл с расширением exe. Найти данный файл можно, зайдя в папку проекта и далее в каталог \bin\Debug\net7.0-windows
Рассмотрев вкратце создание проекта графического приложения, мы можем перейти к обзору основных компонентов и начнем мы с форм.