Создание кнопки
Для динамического создания кнопок используйте функцию CreateWindow или CreateWindowEx . В этом разделе показано, как использовать функцию CreateWindow для создания кнопки по умолчанию.
Это важно знать
Технологии
Предварительные требования
- C/C++
- Программирование пользовательского интерфейса Windows
Инструкции
Используйте функцию CreateWindow для создания элемента управления «Кнопка».
В следующем примере C++ параметр m_hwnd является дескриптором родительского окна. Стиль BS_DEFPUSHBUTTON указывает, что должна быть создана кнопка по умолчанию. Обратите внимание, что необходимо указать значения размера и положения, так как при использовании CW_USEDEFAULT для кнопки устанавливается нулевое значение.
HWND hwndButton = CreateWindow( L"BUTTON", // Predefined class; Unicode assumed L"OK", // Button text WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // Styles 10, // x position 10, // y position 100, // Button width 100, // Button height m_hwnd, // Parent window NULL, // No menu. (HINSTANCE)GetWindowLongPtr(m_hwnd, GWLP_HINSTANCE), NULL); // Pointer not needed.
Учебник. Добавление элементов управления в средство просмотра изображений приложения Windows Forms в Visual Studio
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
В этой серии из трех руководств вы создадите приложение Windows Forms, которое загружает изображение и отображает его. В интегрированной среде разработки Visual Studio имеются средства, необходимые для создания приложения. Подробнее см. в статье Добро пожаловать в интегрированную среду разработки Visual Studio.
В этой программе имеются поле рисунка, флажок и несколько кнопок, которые используются для управления приложением. В этом учебнике показано, как добавить эти элементы управления.
В этом третьем учебнике вы научитесь следующему:
- Добавление элементов управления в приложение
- Добавление кнопок на панель макета
- Изменение имен и расположений элементов управления
- Добавление компонентов диалоговых окон
Необходимые компоненты
Материал этого учебника построен на знаниях, которые вы получили из предыдущего учебника Создание приложения для просмотра изображений. Если вы еще не выполнили действия из этого учебника, сделайте в первую очередь это.
Добавление элементов управления в приложение
Приложение «Средство просмотра изображений» использует элемент управления PictureBox для вывода изображения. Оно использует флажок и несколько кнопок для управления изображением и фоном, а также для закрытия приложения. Вы добавите элемент PictureBox и флажок из области панели элементов в Visual Studio IDE.
- Откройте Visual Studio. Проект средства просмотра изображений находится в разделе Открыть последние.
- В конструкторе Windows Forms выберите элемент управления TableLayoutPanel, добавленный в предыдущем учебнике. Убедитесь, что в окне Свойства отображается tableLayoutPanel1.
- В левой части интегрированной среды разработки Visual Studio выберите вкладку Панель элементов. Если вы ее не видите, выберите пункт Представление>Панель элементов в строке меню или воспользуйтесь комбинацией клавиш CTRL+ALT+X. На панели элементов разверните узел Общие элементы управления.
- Дважды щелкните элемент PictureBox, чтобы добавить в форму элемент управления PictureBox. Visual Studio IDE добавит элемент управления PictureBox в первую пустую ячейку TableLayoutPanel.
- Щелкните новый элемент управления PictureBox, чтобы выбрать его, а затем щелкните черный треугольник на новом элементе управления PictureBox, чтобы отобразить его список задач.

- Выберите Закрепить в родительском контейнере, который задает для свойства Dock элемента управления PictureBox значение Fill. Это значение отображается в окне Свойства.
- В окне Свойства для элемента управления PictureBox задайте для свойства ColumnSpan значение 2. Теперь элемент управления PictureBox заполняет оба столбца.
- Установите для его свойства BorderStyle значение Fixed3D.
- В конструкторе Windows Forms выберите элемент управления TableLayoutPanel. Затем двойным щелчком выберите элемент CheckBox на панели элементов, чтобы добавить новый элемент управления CheckBox в следующую свободную ячейку таблицы. Элемент управления PictureBox занимает первые две ячейки в TableLayoutPanel, поэтому элемент управления CheckBox добавляется в нижнюю левую ячейку.
- Выберите свойство Text и введите Stretch.

Добавление кнопок на панель макета
Мы добавили элементы управления в TableLayoutPanel. Далее показано, как добавить четыре кнопки в новую панель макета в TableLayoutPanel.

- В форме выберите элемент управления TableLayoutPanel. Откройте Панель элементов, выберите Контейнеры. Дважды щелкните элемент управления FlowLayoutPanel для добавления нового элемента в последнюю ячейку TableLayoutPanel.
- Присвойте свойству Dock элемента FlowLayoutPanel значение Fill. Это свойство можно задать, щелкнув черный треугольник и выбрав Закрепить в родительском контейнере. Элемент управления FlowLayoutPanel является контейнером, в котором другие элементы управления размещаются построчно в определенном порядке.
- Выберите новый элемент FlowLayoutPanel, а затем откройте Панель элементов и выберите Общие элементы управления. Дважды щелкните элемент Кнопки, чтобы добавить кнопку с именем button1.
- Снова дважды щелкните элемент Кнопка, чтобы добавить еще одну кнопку. Интегрированная среда разработки вызывает следующий элемент button2.
- Добавьте еще две кнопки таким же образом. Другой вариант — выберите button2, а затем выберите Правка>Копировать или нажмите клавиши CTRL+C. Далее в строке меню выберите Правка>Вставить (или нажмите клавиши CTRL+V). Порядок вставки копии кнопки. Повторите вставку еще раз. Обратите внимание на то, что в интегрированной среде разработки были добавлены кнопки button3 и button4 в FlowLayoutPanel.
- Выберите первую кнопку и установите для ее свойства Text значение Показать рисунок.
- Установите для свойства Text следующих трех кнопок значения Очистить рисунок, Установить цвет фона и Закрыть.
- Чтобы изменить размер кнопок и расположить их, выберите элемент FlowLayoutPanel. Присвойте свойству FlowDirection значение RightToLeft. Кнопки должны сами выровняться по правой стороне ячейки и изменить свой порядок таким образом, чтобы кнопка Показать рисунок располагалась с правой стороны. Можно перетаскивать кнопки в элементе FlowLayoutPanel, чтобы разместить их в любом порядке.
- Щелкните кнопку Закрыть, чтобы выбрать ее. Затем выберите остальные кнопки, удерживая нажатой клавишу CTRL.
- В окне Свойства задайте для свойства Авторазмер значение True. Размеры кнопок будут изменяться соответствии с текстом.
Вы можете запустить программу, чтобы увидеть, как выглядят элементы управления. Нажмите клавишу F5, выберите Отладка>Начать отладку или нажмите кнопку Запустить. Кнопки, которые вы добавили, пока еще не функционируют.
Переименование элементов управления
В форме есть четыре кнопки: button1, button2, button3и button4 в C#. В Visual Basic в качестве первой буквы любого имени элемента управления по умолчанию используется прописная буква, поэтому в Visual Basic кнопки называются Button1, Button2, Button3 и Button4. Чтобы присвоить им более информативные имена, выполните указанные ниже действия.

- В форме нажмите кнопку Закрыть . Если все еще выделены все кнопки, для отмены выделения нажмите клавишу ESC.
- В окне Свойства найдите (Name). Измените имя на closeButton. Интегрированная среда разработки не принимает имена, содержащие пробелы.
- Переименуйте другие три кнопки как backgroundButton, clearButton, showButton. Имена можно проверить в раскрывающемся списке селектора элементов управления в окне Свойства . Отобразятся новые имена кнопок.
Можно переименовать любой элемент управления, например TableLayoutPanel или checkbox.
Добавление компонентов диалоговых окон
С помощью компонентов приложение может открывать графические файлы и выбирать цвет фона. Компонент аналогичен элементу управления. Для добавления компонента в форму используется панель элементов. Для задания значений свойств используется окно Свойства.
В отличие от элемента управления, добавление в форму компонента не добавляет в форму визуальный элемент. Вместо этого, компонент предоставляет определенное поведение, которое можно включать в коде. Например, это компонент, который открывает диалоговое окно Открыть файл.
В этом разделе добавьте в форму компоненты OpenFileDialog и ColorDialog.

- Выберите конструктор Windows Forms (Form1.cs[Design]). Затем откройте Панель элементов и выберите группу Диалоговые окна.
- Дважды щелкните элемент OpenFileDialog, чтобы добавить в форму компонент с именем openFileDialog1.
- Дважды щелкните на панели элементов элемент ColorDialog, чтобы добавить в форму компонент с именем colorDialog1. Компоненты отображаются в нижней части конструктора Windows Forms в виде значков.
- Щелкните значок openFileDialog1 и задайте два свойства:
- Установите для свойства Filter следующее значение:
JPEG Files (*.jpg)|*.jpg|PNG Files (*.png)|*.png|BMP Files (*.bmp)|*.bmp|All files (*.*)|*.*
Параметры свойства Filter определяют типы файлов, которые отображаются в диалоговом окне Выбор файла изображения.
Следующие шаги
Перейдите к следующему учебнику, чтобы узнать, как добавить код в приложение.
Как сделать кнопку в HTML
Для создания кнопок используется тег . Внутри него размещается текст или изображение, которые будут отображаться на кнопке. Например:
Чтобы задать кнопке имя, тип или состояние, нужно добавить атрибуты: name , disabled и type .
Атрибут name задаёт имя кнопки. Может использоваться для идентификации элемента в скриптах.
Атрибут disabled блокирует доступ к кнопке.
Атрибут type определяет тип кнопки. Ему задают одно из трёх значений:
button — значение по умолчанию. Означает, что элемент — обычная кнопка. Она может добавлять товары в корзину или избранное, переключать слайдеры или закрывать всплывающие окна.
submit задаётся кнопкам для отправки формы. Когда пользователь нажимает на кнопку с таким типом, браузер отправляет данные формы на сервер.
reset добавляется кнопкам сброса формы. Когда пользователь нажимает на такую кнопку, браузер возвращает значения всех полей формы к изначальным.
А как же input?
Создать кнопку можно и с помощью тега , если указать ему тип button :
Это рабочий способ. О нём надо знать, ведь вы можете встретить его в проектах. Но самим так делать не стоит. У кнопок, созданных на инпуте, есть ограничения: сложно управлять размерами и положением изображений, а также нет псевдоэлементов. Поэтому оставьте для создания элементов формы, таких как текстовые поля, радиокнопки или чекбоксы. А кнопки верстайте с помощью .
Как сделать кнопку с иконкой
Посмотрим три способа создания кнопки с иконкой.
С помощью тега
Способ подойдёт для контентных изображений.

Так вы можете добавлять кнопки с эмодзи, лайками, дизлайками или чем-то ещё. Иконке нужно обязательно задавать размеры, чтобы кнопка зарезервировала место и не прыгала, когда загрузится иконка.
Добавить инлайн SVG в разметку
Способ подойдёт, если изображение меняет состояния, как здесь:
Код простой: пишем тег и добавляем в него код SVG-изображения.
Вставить фоном в CSS
Способ подойдёт, если иконка играет декоративную роль и не меняется при наведении или клике на кнопку. Например, в таких случаях:

Как добавить иконку в кнопку:
.icon-button < background-image: url("../images/icon.svg"); background-size: 90px 97px; >
Какой способ выбрать — зависит от ваших задач и особенностей проекта. Вы также можете использовать разные методы в рамках одного проекта. Например, часть кнопок сделать со встроенным в разметку SVG, а часть — с фоновым изображением.
Материалы по теме
- Что такое ссылки и как их ставить
- Как сделать картинку ссылкой
- Шаблон HTML-формы
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Читать дальше

Что такое Lazy Loading и как её включить на сайте
Ленивая загрузка (буквально, lazy loading)— это возможнось отложить загрузку ненужного прямо сейчас медиаконтента.
Ленивая загрузка делает сайт быстрее и экономит трафик, если у пользователя мобильный интернет с ограничениями.
- 22 ноября 2023

Знакомство с HTML
Привет, будущие фронтенд-разработчики! Добро пожаловать в увлекательный мир веб-разработки. Перед тем как двигаться дальше, давайте разберёмся с основами — языком разметки гипертекста или просто HTML.
HTML (Hypertext Markup Language) — это стандартный язык, который используется для создания веб-страниц. Представьте, что ваша веб-страница — это книга. Тогда HTML — это скелет этой книги, костяк, который определяет структуру: где будет заголовок, абзацы, изображения и так далее.
- 1 ноября 2023

Специальные символы в HTML
HTML использует особенные комбинации символов, чтобы корректно отображать определенные знаки на веб-страницах. Например, вместо простого знака «меньше» мы видим комбинацию <. В этой статье представлен список таких символов. Это небольшой справочник для тех, кто хочет быстро найти нужный код.
- 23 октября 2023

Простое диалоговое окно на HTML
Вот короткое демо:
- 18 октября 2023

Зачем нужен метатег viewport
Каждый из нас хоть раз в жизни сталкивался с веб-страницами, которые кажутся «сломанными» или странно отображаются на мобильных устройствах. Одной из причин такого поведения может быть отсутствие маленького, но важного элемента в коде страницы — метатега viewport .
Метатеги — это инструкции для браузера о том, как отображать содержимое страницы. Один из таких метатегов — viewport , который говорит браузеру, как масштабировать и отображать страницу на разных устройствах, особенно на смартфонах и планшетах.
Важно, чтобы сайты классно выглядели не только на компьютерах, но и на маленьких экранах смартфона. Если не использовать viewport , то сайт может выглядеть как уменьшенная версия десктопного сайта на мобильном экране, что делает его трудночитаемым и неудобным для использования. Конечно, нужно ещё много всего сделать для адаптивности, но viewport тоже нужен.
- 18 сентября 2023

Атрибут class в HTML на примерах
Атрибут class используется для добавления CSS-классов элементам HTML. Классы позволяют применять одни и те же стили CSS или поведение JavaScript к разным элементам на странице.
Так, одному элементу можно присвоить один или несколько классов, разделяя их пробелами.
- 14 сентября 2023

В чём отличия цитат blockquote, cite и q
В HTML есть разные теги для цитирования и указания источников. Основные из них: , и . Давайте разберёмся в их различиях.
- 12 сентября 2023

Осмысленный alt-текст: 6 правил
Альтернативный текст — это описание изображения словами. Это описание должно помогать людям, которые читают или слышат это описание, иначе оно не нужно и лучше вообще его не указывать.
Мы уже обсудили основные правила написания alt-текста для фотографий и изображений. В этот раз поговорим о том, каким именно должно быть описание, чтобы в нём был смысл.
- 31 июля 2023

Растровая и векторная графика
Давайте попробуем разобраться, в чём отличие растровой графики от векторной.
- 13 июня 2023

Как понять, что перед вами заголовок
Заголовки используются для организации и структурирования содержимого на сайте. В HTML существует шесть уровней заголовков, обозначаемых тегами от до . Каждый уровень заголовка имеет свой семантический вес, где имеет наибольший вес, а — наименьший.
Часто кажется, что заголовок — это простой и понятный тег. Но это впечатление обманчиво, потому что не всегда крупный и выделенный текст на макете является заголовком.
При вёрстке сайта важно соблюдать семантику, чтобы все теги использовались корректно и ресурс работал без ошибок. Если напутать уровни заголовков, то структура страницы будет не семантичной, а скринридеры неправильно прочтут сайт.
В статье разберёмся, как верно определять заголовки по макету, какие из них лучше делать скрытыми и почему.
- 8 июня 2023
Элементы управления окна
Главным элементом программы в среде Windows является окно. Окно может содержать элементы управления: кнопки, списки, окна редактирования и др. Эти элементы также являются окнами, но обладающими особым свойством: события, происходящие с этими элементами (и самим окном), приводят к приходу сообщений в процедуру окна.
| Системный класс | Предназначение |
| BUTTON | Кнопка. |
| COMBOBOX | Комбинированное окно (окно со списком и поля выбора). |
| EDIT | Окно редактирования текста. |
| LISTBOX | Окно со списком |
| SCROLLBAR | Полоса прокрутки |
| STATIC | Статический элемент (текст) |
Создание элементов управления окна осуществляется функцией
HWND WINAPI CreateWindow (
_In_opt_ LPCTSTR lpClassName, // имя предопределенного класса
_In_opt_ LPCTSTR lpWindowName, // текст
_In_ D WORD dwStyle, // стиль
_In_ int x, // координата x
_In_ int y, // координата y
_In_ int nWidth, // ширина
_In_ int nHeight, // высота
_In_opt_ HWND hWndParent, // дескриптор родительского окна
_In_opt_ HMENU hMenu, // номер пункта меню
_In_opt_ HINSTANCE hInstance, // дескриптор приложения
_In_opt_ LPVOID lpParam ); // NULL
Указанная функция возвращает дескриптор элемента управления окна, который может быть впоследствии использован для анализа элемента управления, с которым связано обрабатываемое событие. Дескриптор кнопки, например, передается в оконную функцию в качестве параметра lparam .
Таблицу стилей элементов управления окна можно устанавливать в параметре dwStyle как и для создания родительского окна. При этом обязательно указывается, что создаваемое окно является дочерним — WS_CHILD .
Кнопка

Кнопка — маленькое прямоугольное дочернее окно, которое представляет собой кнопку, по которой пользователь может щелкать мышью, чтобы включить или выключить ее. Кнопки управления могут использоваться самостоятельно или в группах, и они могут или быть подписаны или появляться без текста. Кнопки управления обычно изменяют свой вид, когда пользователь щелкает мышью по ним.
При нажатии кнопки операционная система генерирует сообщение WM_COMMAND с параметром lParam , соответствующим дескриптору кнопки.
Обработка нажатия кнопки:
LONG WINAPI WndProc( HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam) <
.
switch (Message) <
case WM_COMMAND :
if (lparam == ( LPARAM )hBtn) <
//обработка нажатия кнопки
>
break ;
.
>
>
Поле редактирования

Поле редактирования — прямоугольное дочернее окно, внутри которого пользователь может напечатать с клавиатуры текст. Пользователь выбирает орган управления и дает ему фокус клавиатуры, щелкая по нему мышью или перемещая в него, каретку путем нажатия клавиши ТАБУЛЯЦИИ (TAB). Пользователь может вводить текст, когда окно редактирования текста отображает мигающую каретку.
Для считывания информации из поля редактирования используется функция
int WINAPI GetWindowText(
_In_ HWND hWnd, // дескриптор поля
_Out_ LPTSTR lpString, // указатель на текстовую строку
_In_ int nMaxCount ); // максимальное количество символов
Возвращаемое значение – длина считанной текстовой строки.
Для установки текста в поле редактирования используется функция
BOOL WINAPI SetWindowText(
_In_ HWND hWnd, // дескриптор поля
_In_opt_ LPCTSTR lpString ); // указатель на текстовую строку
В случае успешного завершения функция возвращает ненулевое значение.
Статический текст
Статический текст — текстовое поле, окно или прямоугольник, используемый для надписей, не подлежащих редактированию.
Для установки статического текста используется та же функция SetWindowText .
Пример на С++ Найти сумму двух чисел
Программа создает два поля редактирования для ввода чисел и кнопку «Рассчитать», при нажатии на которую выводится статический текст, соответствующий сумме.
Для перевода строки в целое число и обратно использованы функции StrToInt и IntToStr , описанные в статье Преобразование строки в число и обратно. Также использовалась многобайтовая кодировка.
#include
LONG WINAPI WndProc( HWND , UINT , WPARAM , LPARAM ); // функция обработки сообщений окна
// Функция преобразования строки в число
int StrToInt( char *s)
int temp = 0; // число
int i = 0;
int sign = 0; // знак числа 0- положительное, 1 — отрицательное
if (s[i] == ‘-‘ )
sign = 1;
i++;
>
while (s[i] >= 0x30 && s[i] temp = temp + (s[i] & 0x0F);
temp = temp * 10;
i++;
>
temp = temp / 10;
if (sign == 1)
temp = -temp;
return (temp);
>
// Функция преобразования числа в строку
char * IntToStr( int n)
char s[40], t, *temp;
int i, k;
int sign = 0;
i = 0;
k = n;
if (k <0)
sign = 1;
k = -k;
>
do t = k % 10;
k = k / 10;
s[i] = t | 0x30;
i++;
> while (k>0);
if (sign == 1)
s[i] = ‘-‘ ;
i++;
>
temp = new char [i];
k = 0;
i—;
while (i >= 0) temp[k] = s[i];
i—; k++;
>
temp[k] = ‘\0’ ;
return (temp);
>
// Стартовая функция
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
HWND hwnd; // дескриптор окна
MSG msg; // структура сообщения
WNDCLASS w; // структура класса окна
memset(&w, 0, sizeof ( WNDCLASS )); // очистка памяти для структуры
w.style = CS_HREDRAW | CS_VREDRAW ;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = CreateSolidBrush(0x00FFFFFF);
w.lpszClassName = «MyClass» ;
RegisterClass (&w); // регистрация класса окна
// Создание окна
hwnd = CreateWindow ( «MyClass», «Сумма двух чисел» ,
WS_OVERLAPPEDWINDOW ,
500, 300, 500, 380,
NULL , NULL , hInstance, NULL );
ShowWindow(hwnd, nCmdShow); // отображение окна
UpdateWindow(hwnd); // перерисовка окна
// Цикл обработки сообщений
while ( GetMessage (&msg, NULL , 0, 0)) TranslateMessage(&msg);
DispatchMessage (&msg);
>
return msg.wParam;
>
// Функция обработки сообщений
LONG WINAPI WndProc( HWND hwnd, UINT Message,
WPARAM wparam, LPARAM lparam) HDC hdc;
HINSTANCE hInst;
PAINTSTRUCT ps;
static HWND hBtn; // дескриптор кнопки
static HWND hEdt1, hEdt2; // дескрипторы полей редактирования
static HWND hStat; // дескриптор статического текста
TCHAR StrA[20];
int a, b, sum, Len;
switch (Message) case WM_CREATE: // сообщение создания окна
hInst = ((LPCREATESTRUCT)lparam)->hInstance; // дескриптор приложения
// Создаем и показываем первое поле редактирования
hEdt1 = CreateWindow ( «edit», «0» ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 50, 50, 60, 20,
hwnd, 0, hInst, NULL );
ShowWindow(hEdt1, SW_SHOWNORMAL);
// Создаем и показываем второе поле редактирования
hEdt2 = CreateWindow ( «edit», «0» ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 150, 50, 60,
20, hwnd, 0, hInst, NULL );
ShowWindow(hEdt2, SW_SHOWNORMAL);
// Создаем и показываем кнопку
hBtn = CreateWindow ( «button», «Рассчитать» ,
WS_CHILD | WS_VISIBLE | WS_BORDER,
50, 100, 120, 30, hwnd, 0, hInst, NULL );
ShowWindow(hBtn, SW_SHOWNORMAL);
// Создаем и показываем поле текста для результата
hStat = CreateWindow ( » static «, «0» , WS_CHILD | WS_VISIBLE,
150, 180, 120, 20, hwnd, 0, hInst, NULL );
ShowWindow(hStat, SW_SHOWNORMAL);
break ;
case WM_COMMAND : // сообщение о команде
if (lparam == ( LPARAM )hBtn) // если нажали на кнопку
Len = GetWindowText(hEdt1, StrA, 20);
a = StrToInt(StrA); // считываем число из первого поля
Len = GetWindowText(hEdt2, StrA, 20);
b = StrToInt(StrA); // считываем число из второго поля
sum = a + b; // находим сумму двух чисел
SetWindowText(hStat, IntToStr(sum)); // выводим результат в статическое поле
>
break ;
case WM_PAINT : // перерисовка окна
hdc = BeginPaint(hwnd, &ps); // начало перерисовки
TextOut(hdc, 50, 20, «Введите два числа» , 18); // вывод текстовых сообщений
TextOut(hdc, 50, 180, «Результат:» , 10);
EndPaint(hwnd, &ps); // конец перерисовки
break ;
case WM_DESTROY : // закрытие окна
PostQuitMessage(0);
break ;
default: // обработка сообщения по умолчанию
return DefWindowProc (hwnd, Message, wparam, lparam);
>
return 0;
>

Результат выполнения
Комментариев к записи: 16
Владислав Чёрный
Код сразу не заработал, выдавал ошибки. Запускал код в Code::Blocks 20.03. Для функции WndProc заменил тип с LONG WINAPI на LRESULT CALLBACK и всё заработало. Исправный код представлен ниже.
LRESULT CALLBACK WndProc( HWND , UINT , WPARAM , LPARAM ); // функция обработки сообщений окна
// Функция преобразования строки в число
int StrToInt( char *s)
int temp = 0; // число
int i = 0;
int sign = 0; // знак числа 0- положительное, 1 — отрицательное
if (s[i] == ‘-‘)
sign = 1;
i++;
>
while (s[i] >= 0x30 && s[i] temp = temp + (s[i] & 0x0F);
temp = temp * 10;
i++;
>
temp = temp / 10;
if (sign == 1)
temp = -temp;
return (temp);
>
// Функция преобразования числа в строку
char * IntToStr( int n)
char s[40], t, *temp;
int i, k;
int sign = 0;
i = 0;
k = n;
if (k <0)
sign = 1;
k = -k;
>
do t = k % 10;
k = k / 10;
s[i] = t | 0x30;
i++;
> while (k>0);
if (sign == 1)
s[i] = ‘-‘;
i++;
>
temp = new char [i];
k = 0;
i—;
while (i >= 0) temp[k] = s[i];
i—; k++;
>
temp[k] = ‘\0’;
return (temp);
>
// Стартовая функция
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
HWND hwnd; // дескриптор окна
MSG msg; // структура сообщения
WNDCLASS w; // структура класса окна
memset(&w, 0, sizeof ( WNDCLASS )); // очистка памяти для структуры
w.style = CS_HREDRAW | CS_VREDRAW ;
w.lpfnWndProc = WndProc;
w.hInstance = hInstance;
w.hbrBackground = CreateSolidBrush(0x00FFFFFF);
w.lpszClassName = «MyClass» ;
RegisterClass (&w); // регистрация класса окна
// Создание окна
hwnd = CreateWindow ( «MyClass», «Сумма двух чисел» ,
WS_OVERLAPPEDWINDOW ,
500, 300, 500, 380,
NULL , NULL , hInstance, NULL );
ShowWindow(hwnd, nCmdShow); // отображение окна
UpdateWindow(hwnd); // перерисовка окна
// Цикл обработки сообщений
while ( GetMessage (&msg, NULL , 0, 0)) TranslateMessage(&msg);
DispatchMessage (&msg);
>
return msg.wParam;
>
// Функция обработки сообщений
LRESULT CALLBACK WndProc( HWND hwnd, UINT Message,
WPARAM wparam, LPARAM lparam) HDC hdc;
HINSTANCE hInst;
PAINTSTRUCT ps;
static HWND hBtn; // дескриптор кнопки
static HWND hEdt1, hEdt2; // дескрипторы полей редактирования
static HWND hStat; // дескриптор статического текста
TCHAR StrA[20];
int a, b, sum, Len;
switch (Message) case WM_CREATE: // сообщение создания окна
hInst = ((LPCREATESTRUCT)lparam)->hInstance; // дескриптор приложения
// Создаем и показываем первое поле редактирования
hEdt1 = CreateWindow ( «edit», «0» ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 50, 50, 60, 20,
hwnd, 0, hInst, NULL );
ShowWindow(hEdt1, SW_SHOWNORMAL);
// Создаем и показываем второе поле редактирования
hEdt2 = CreateWindow ( «edit», «0» ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT, 150, 50, 60,
20, hwnd, 0, hInst, NULL );
ShowWindow(hEdt2, SW_SHOWNORMAL);
// Создаем и показываем кнопку
hBtn = CreateWindow ( «button», «Рассчитать» ,
WS_CHILD | WS_VISIBLE | WS_BORDER,
50, 100, 120, 30, hwnd, 0, hInst, NULL );
ShowWindow(hBtn, SW_SHOWNORMAL);
// Создаем и показываем поле текста для результата
hStat = CreateWindow ( » static «, «0» , WS_CHILD | WS_VISIBLE,
150, 180, 120, 20, hwnd, 0, hInst, NULL );
ShowWindow(hStat, SW_SHOWNORMAL);
break ;
case WM_COMMAND : // сообщение о команде
if (lparam == ( LPARAM )hBtn) // если нажали на кнопку
Len = GetWindowText(hEdt1, StrA, 20);
a = StrToInt(StrA); // считываем число из первого поля
Len = GetWindowText(hEdt2, StrA, 20);
b = StrToInt(StrA); // считываем число из второго поля
sum = a + b; // находим сумму двух чисел
SetWindowText(hStat, IntToStr(sum)); // выводим результат в статическое поле
>
break ;
case WM_PAINT : // перерисовка окна
hdc = BeginPaint(hwnd, &ps); // начало перерисовки
TextOut(hdc, 50, 20, «Введите два числа» , 18); // вывод текстовых сообщений
TextOut(hdc, 50, 180, «Результат:» , 10);
EndPaint(hwnd, &ps); // конец перерисовки
break ;
case WM_DESTROY : // закрытие окна
PostQuitMessage(0);
break ;
default: // обработка сообщения по умолчанию
return DefWindowProc (hwnd, Message, wparam, lparam);
>
return 0;
>
Здравствуйте! А как добавить DataGridView? У Вас написано в коде по поводу Кнопки (Botton) так: static HWND hBtn; // дескриптор кнопки И, вообще, где взять весь список возможных элементов управления с их названием в коде, как у Вас static HWND hBtn ?
Кстати, я увидел код создания кнопки: // Создаем и показываем кнопку hBtn = CreateWindow(«button», «Рассчитать», WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 100, 120, 30, hwnd, 0, hInst, NULL); ShowWindow(hBtn, SW_SHOWNORMAL); Но это всё равно никак не помогает создать DataGridView.
