Создаем проект Windows Forms в Visual Studio на C++
Сегодня я хочу рассказать о том, как создать проект Windows Forms на C++ в IDE Visual Studio 2013. Дело в том, что, начиная с VS 2012, в списке проектов, которые можно создать, убрали пункт Приложение Windows Forms. Я сейчас говорю о том, который на C++, создать такой проект на C# можно, выбрав соответствующий пункт в разделе создаваемых проектов. Однако тот факт, что такой проект нельзя выбрать из списка, не говорит о том, что его нельзя создать самому. Именно об этом я и хочу рассказать в этой статье.
Когда проект будет создан, в обозревателе решений кликаем правой кнопкой мыши по созданному проекту. В открывшемся контекстном меню последовательно выбираем Добавить > Создать элемент и в открывшемся меню в разделе UI выбираем Форма Windows Forms
Когда форма будет добавлена, в обозревателе решений выбираем файл MyForm.cpp. Перед вами откроется новая вкладка с единственной строчкой кода:
В этот файл нам необходимо добавить следующий код:
Не закрывая окно свойств проекта, переходим в подраздел Дополнительно и в строке Точка входа пишем Main и после этого нажимаем клавишу ОК.
На этом настройки проекта заканчиваются. Для редактирования внешнего вида формы, необходимо перейти во вкладку MyForm.h [Конструктор], кликнув дважды по файлу MyForm.h в обозревателе решений.
11 отзывов на “ Создаем проект Windows Forms в Visual Studio на C++ ”
Спасибо, все очень понятно, у меня получилось.
Но это будет приложение CLR, то есть скомпилируется в CIL код. Это не полноценный. После компиляции это ничем не будет отличаться от С#, будет тот же самый CIL код.
Все сделал как написано. VS 2015. Выдает ошибку:
Данные, необходимые для завершения этой операции еще не доступны. (Exception
from HRESULT: 0x8000000A)
Аналогично, пока решение проблемы не нашел
Переоткрыть этот .h
Введение в Windows Forms
Для создания графических интерфейсов с помощью платформы .NET применяются разные технологии — Window Forms, WPF, приложения для магазина Windows Store (для ОС Windows 8/8.1/10). Однако наиболее простой и удобной платформой до сих пор остается Window Forms или формы. Данное руководство ставит своей целью дать понимание принципов создания графических интерфейсов с помощью технологии WinForms и работы основных элементов управления.
Создание графического приложения
Для создания графического проекта нам потребуется среда разработки Visual Studio. Поскольку наиболее распространенная пока версия Visual Studio 2013, то для данного руководства я буду использовать бесплатную версию данной среды Visual Studio Community 2013 которую можно найти на странице https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx.
После установки среды и всех ее компонентов, запустим Visual Studio и создадим проект графического приложения. Для этого в меню выберем пункт File (Файл) и в подменю выберем New — > Project (Создать — > Проект). После этого перед нами откроется диалоговое окно создания нового проекта:
В левой колонке выберем Windows Desktop , а в центральной части среди типов проектов — тип Windows Forms Application и дадим ему какое-нибудь имя в поле внизу. Например, назовем его HelloApp. После этого нажимаем OK.
После этого Visual Studio откроет наш проект с созданными по умолчанию файлами:
Большую часть пространства Visual Studio занимает графический дизайнер, который содержит форму будущего приложения. Пока она пуста и имеет только заголовок Form1. Справа находится окно файлов решения/проекта — Solution Explorer (Обозреватель решений). Там и находятся все связанные с нашим приложением файлы, в том числе файлы формы Form1.cs.
Внизу справа находится окно свойств — Properties. Так как у меня в данный момент выбрана форма как элемент управления, то в этом поле отображаются свойства, связанные с формой.
Теперь найдем в этом окне свойство формы Text и изменим его значение на любое другое:
Таким образом мы поменяли заголовок формы. Теперь перенесем на поле какой-нибудь элемент управления, например, кнопку. Для этого найдем в левой части Visual Studio вкладку Toolbox (Панель инструментов) . Нажмем на эту вкладку, и у нас откроется панель с элементами, откуда мы можем с помощью мыши перенести на форму любой элемент:
Найдем среди элементов кнопку и, захватив ее указателем мыши, перенесем на форму:
Это визуальная часть. Теперь приступим к самому программированию. Добавим простейший код на языке C#, который бы выводил сообщение по нажатию кнопки. Для этого мы должны перейти в файл кода, который связан с этой формой. Если у нас не открыт файл кода, мы можем нажать на форму правой кнопкой мыши и в появившемся меню выбрать View Code (Посмотреть файл кода):
Однако воспользуемся другим способом, чтобы не писать много лишнего кода. Наведем указатель мыши на кнопку и щелкнем по ней двойным щелчком. Мы автоматически попадаем в файл кода Form1.cs, который выглядит так:
Добавим вывод сообщения по нажатию кнопки, изменив код следующим образом:
Запуск приложения
Чтобы запустить приложение в режиме отладки, нажмем на клавишу F5 или на зеленую стрелочку на панели Visual Studio. После этого запустится наша форма с одинокой кнопкой. И если мы нажмем на кнопку на форме, то нам будет отображено сообщение с приветствием.
После запуска приложения студия компилирует его в файл с расширением exe. Найти данный файл можно, зайдя в папку проекта и далее в каталог bin/Debug или bin/Release
Рассмотрев вкратце создание проекта графического приложения, мы можем перейти к обзору основных компонентов и начнем мы с форм.
Application Класс
Определение
Предоставляет методы и свойства static для управления приложением, например методы для запуска и остановки приложения, для обработки сообщений Windows и свойства для получения сведений о приложении. Provides static methods and properties to manage an application, such as methods to start and stop an application, to process Windows messages, and properties to get information about an application. Этот класс не наследуется. This class cannot be inherited.
Примеры
В следующем примере кода показаны числа из списка в форме. The following code example lists numbers in a list box on a form. Каждый раз при щелчке button1 приложение добавляет в список еще один номер. Each time you click button1 , the application adds another number to the list.
Main Метод вызывает Run , чтобы запустить приложение, которое создает форму listBox1 и button1 . The Main method calls Run to start the application, which creates the form, listBox1 and button1 . Когда пользователь нажимает кнопку button1 , button1_Click метод отображает MessageBox . When the user clicks button1 , the button1_Click method displays a MessageBox. Если пользователь нажимает кнопку No MessageBox , button1_Click метод добавляет число в список. If the user clicks No on the MessageBox, the button1_Click method adds a number to the list. Если пользователь нажимает кнопку Yes , приложение вызывает Exit для обработки всех оставшихся сообщений в очереди, а затем завершает работу. If the user clicks Yes , the application calls Exit to process all remaining messages in the queue and then to quit.
Вызов метода Exit приведет к сбою при частичном доверии. The call to Exit will fail in partial trust.
Комментарии
ApplicationКласс содержит методы запуска и завершения приложений и потоков, а также для обработки сообщений Windows следующим образом: The Application class has methods to start and stop applications and threads, and to process Windows messages, as follows:
Run запускает цикл обработки сообщений приложения в текущем потоке и, при необходимости, делает форму видимой. Run starts an application message loop on the current thread and, optionally, makes a form visible.
Exit или ExitThread останавливает цикл обработки сообщений. Exit or ExitThread stops a message loop.
DoEvents обрабатывает сообщения, пока программа находится в цикле. DoEvents processes messages while your program is in a loop.
AddMessageFilter Добавляет фильтр сообщений в конвейер обмена сообщениями приложения для отслеживания сообщений Windows. AddMessageFilter adds a message filter to the application message pump to monitor Windows messages.
IMessageFilter позволяет предотвращать возникновение события или выполнять специальные операции перед вызовом обработчика событий. IMessageFilter lets you stop an event from being raised or perform special operations before invoking an event handler.
Этот класс содержит CurrentCulture Свойства и, CurrentInputLanguage позволяющие получить или задать сведения о языке и региональных параметрах для текущего потока. This class has CurrentCulture and CurrentInputLanguage properties to get or set culture information for the current thread.
Нельзя создать экземпляр этого класса. You cannot create an instance of this class.
Свойства
Получает значение, определяющее, может ли вызывающий объект выйти из этого приложения. Gets a value indicating whether the caller can quit this application.
Получает путь для данных приложения, являющихся общими для всех пользователей. Gets the path for the application data that is shared among all users.
Получает раздел реестра для данных приложения, являющихся общими для всех пользователей. Gets the registry key for the application data that is shared among all users.
Возвращает название компании, сопоставленное с приложением. Gets the company name associated with the application.
Получает или задает данные о языке и региональных параметрах для текущего потока. Gets or sets the culture information for the current thread.
Получает или задает текущий язык ввода для текущего потока. Gets or sets the current input language for the current thread.
Получает путь для исполняемого файла, запустившего приложение, включая исполняемое имя. Gets the path for the executable file that started the application, including the executable name.
Возвращает текущий режим высокого DPI для данного приложения. Gets the current high DPI mode for the application.
Получает путь для данных приложения локального неперемещающегося пользователя. Gets the path for the application data of a local, non-roaming user.
Получает значение, указывающее, существует ли цикл обработки сообщений в данном потоке. Gets a value indicating whether a message loop exists on this thread.
Получает коллекцию открытых форм, принадлежащих приложению. Gets a collection of open forms owned by the application.
Получает название продукта, сопоставленного с данным приложением. Gets the product name associated with this application.
Получает версию продукта, сопоставленную с данным приложением. Gets the product version associated with this application.
Получает значение, указывающее, будет ли текущее приложение прорисовывать элементы управления с помощью визуальных стилей. Gets a value specifying whether the current application is drawing controls with visual styles.
Получает или задает строку формата для использования в заголовках окон верхнего уровня, когда они отображаются с предупреждающим объявлением. Gets or sets the format string to apply to top-level window captions when they are displayed with a warning banner.
Получает путь для исполняемого файла, запустившего приложение, не включая исполняемое имя. Gets the path for the executable file that started the application, not including the executable name.
Получает путь для данных приложения пользователя. Gets the path for the application data of a user.
Получает раздел реестра для данных приложения пользователя. Gets the registry key for the application data of a user.
Возвращает значение, указывающее, включены ли визуальные стили для приложения. Gets a value that indicates whether visual styles are enabled for the application.
Получает или задает значение, которое указывает, используется ли курсор ожидания для всех открытых форм приложения. Gets or sets whether the wait cursor is used for all open forms of the application.
Получает значение, указывающее, каким образом визуальные стили применяются к окну приложения. Gets a value that specifies how visual styles are applied to application windows.
Методы
Добавляет фильтр сообщений для мониторинга сообщений Windows при их маршрутизации к местам назначения. Adds a message filter to monitor Windows messages as they are routed to their destinations.
Обрабатывает все сообщения Windows, которые в данный момент находятся в очереди сообщений. Processes all Windows messages currently in the message queue.
Включает визуальные стили для приложения. Enables visual styles for the application.
Определяет, равен ли указанный объект текущему объекту. Determines whether the specified object is equal to the current object.
(Унаследовано от Object)
Сообщает всем средствам переноса сообщений, что они должны завершить работу, а затем закрывает все окна приложения после обработки сообщений. Informs all message pumps that they must terminate, and then closes all application windows after the messages have been processed.
Сообщает всем средствам переноса сообщений, что они должны завершить работу, а затем закрывает все окна приложения после обработки сообщений. Informs all message pumps that they must terminate, and then closes all application windows after the messages have been processed.
Выходит из цикла обработки сообщений в текущем потоке и закрывает все окна в потоке. Exits the message loop on the current thread and closes all windows on the thread.
Запускает любые фильтры для сообщения окна и возвращает копию измененного сообщения. Runs any filters against a window message, and returns a copy of the modified message.
Служит хэш-функцией по умолчанию. Serves as the default hash function.
(Унаследовано от Object)
Возвращает объект Type для текущего экземпляра. Gets the Type of the current instance.
(Унаследовано от Object)
Создает неполную копию текущего объекта Object. Creates a shallow copy of the current Object.
(Унаследовано от Object)
Инициализирует OLE в текущем потоке. Initializes OLE on the current thread.
Вызывает событие ThreadException. Raises the ThreadException event.
Вызывает событие Idle в размещенных скриптах. Raises the Idle event in hosted scenarios.
Регистрирует ответный вызов, чтобы проверить, выполняется ли цикл обработки сообщений в размещенных средах. Registers a callback for checking whether the message loop is running in hosted environments.
Удаляет фильтр сообщений из средства переноса сообщений приложения. Removes a message filter from the message pump of the application.
Завершает работу приложения и немедленно запускает новый экземпляр. Shuts down the application and starts a new instance immediately.
Запускает стандартный цикл обработки сообщений приложения в текущем потоке, без формы. Begins running a standard application message loop on the current thread, without a form.
Запускает стандартный цикл обработки сообщений приложения в текущем потоке с ApplicationContext. Begins running a standard application message loop on the current thread, with an ApplicationContext.
Запускает стандартный цикл обработки сообщений приложения в текущем потоке и делает указанную форму видимой. Begins running a standard application message loop on the current thread, and makes the specified form visible.
Задает значения по умолчанию во всем приложении для свойства UseCompatibleTextRendering , определенного в конкретных элементах управления. Sets the application-wide default for the UseCompatibleTextRendering property defined on certain controls.
Задает режим высокого DPI процесса. Sets the high DPI mode of the process.
Приостанавливает работу системы или переводит ее в спящий режим или же запрашивает приостановку работы системы или перевод ее в спящий режим. Suspends or hibernates the system, or requests that the system be suspended or hibernated.
Указывает, как приложение должно реагировать на необработанные исключения. Instructs the application how to respond to unhandled exceptions.
Предоставляет приложению инструкции, определяющие, как приложение должно отвечать на необработанные исключения, при необходимости применяя поведение, зависящее от потока. Instructs the application how to respond to unhandled exceptions, optionally applying thread-specific behavior.
Возвращает строку, представляющую текущий объект. Returns a string that represents the current object.
(Унаследовано от Object)
Отменяет регистрацию ответного вызова цикла обработки сообщений, сделанного с помощью метода RegisterMessageLoop(Application+MessageLoopCallback). Unregisters the message loop callback made with RegisterMessageLoop(Application+MessageLoopCallback).
События
Происходит при закрытии приложения. Occurs when the application is about to shut down.
Происходит при переходе приложения в модальное состояние. Occurs when the application is about to enter a modal state.
Происходит, когда приложение заканчивает обработку и собирается перейти в состояние простоя. Occurs when the application finishes processing and is about to enter the idle state.
Возникает, когда приложение собирается выйти из модального состояния. Occurs when the application is about to leave a modal state.
Происходит при выдаче неперехваченного исключения потока. Occurs when an untrapped thread exception is thrown.
Происходит при закрытии потока. Occurs when a thread is about to shut down. Перед закрытием главного потока для приложения вызывается данное событие, за которым следует событие ApplicationExit. When the main thread for an application is about to be shut down, this event is raised first, followed by an ApplicationExit event.