Создание кнопки
Для динамического создания кнопок используйте функцию 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.
Builder — кнопка — Button
Для добавления на экранную форму C++Builder кнопки в Tool Palette нужно выбрать TButton.
Затем перетащить выбранный компонент на форму и в Object Inspector поменять свойства кнопки.
Часто требуется поменять надпись на кнопке. Для этого нужно поменять свойство Caption.
Также бывает нужно добавить код, который будет выполняться, когда пользователь будет нажимать на кнопку. Для этого на форме следует нажать на кнопку. Появится заготовка когда. После этого можно заполнить заготовку, например, так:
void __fastcall TForm1 :: Button1Click ( TObject * Sender )
Иногда Tool Palette или Object Inspector отсутствуют на экране. В этом случае их нужно предварительно открыть с помощью верхнего меню Builder: View->Tool Palette или View->Object Inspector.
Похожие записи:
Опубликовано 08.05.2016 15.06.2020 Автор proginfo
Один комментарий к “Builder — кнопка — Button”
Shurik :
Захотел сделать из TButton кнопку типа вкл-выкл. В хелпе по F1 среди свойств есть и ToggleButton и Down, и в интернете нашёл Style, который можно менять. А в билдере (6.0 Build 10.161), при попытке это использовать, компилятор знаете что пишет? E2316 ‘Style’ is not a member of ‘TButton’. По моему, это очень странно. Не могли же разные версии библиотек написать. И не могу найти, где что надо подключить, чтобы компилятор увидел эти скрытые свойства.
А вот в QNX 4.25 в его GUI Photon разные кнопки, и даже лейблы по сути отличались только набором начальных умолчаний. (Чтоб при кидании на форму кнопка сразу выглядела как кнопка, а лейбл как лейбл.) Изменив которые в редакторе свойств, мы в принципе могли сделать из лейбла кнопку, например, и наоборот. Думал и тут встретить такой подход.
Добавить кнопку
Доброго дня. Создал проект классическое приложение windows. Но не могу добавить кнопки и так далее. Где они находятся?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как добавить кнопку в столбец ListView
К примеру, как в торренте (кнопка воспроизведения).
Добавить свою кнопку на экран входа в систему windows 7
Подскажите, как можно это осуществить? В какую сторону смотреть?
Как при нажатии на кнопку создать еще одну кнопку?
Собственно во прос в выше, я нажимаю на кнопку, рядом должна появится еще одна, как такие вещи.
1171 / 858 / 251
Регистрация: 30.06.2015
Сообщений: 4,485
Записей в блоге: 50
Сообщение от terabyte32
Где они находятся?
Они создаются посредством той же функции создания окна — CreateWindow. Только в параметрах должно быть WS_CHILD.
94 / 41 / 23
Регистрация: 18.09.2016
Сообщений: 379
terabyte32, + к указаниям стиля, помимо того, что все органы управления — дочерние окна, надо указать доп. стиль через поразрядное или к стилям с префиксом WS_. Для кнопок, переключателей и флажков это BS_
Регистрация: 10.02.2018
Сообщений: 252
Доброго дня. То есть перетащить в окно не получится, придётся в коде писать?
1171 / 858 / 251
Регистрация: 30.06.2015
Сообщений: 4,485
Записей в блоге: 50
Сообщение от terabyte32
То есть перетащить в окно не получится, придётся в коде писать?
Можно и не писать, если изначально кидать на форму. Но лучше не пользоваться формами, а напрямую использовать API чтобы не разучиться программировать. А как пользоваться формами вам может подскажут более опытные в этом деле товарищи.
Регистрация: 10.02.2018
Сообщений: 252
Доброго дня. Использовать API это код что ли?
1171 / 858 / 251
Регистрация: 30.06.2015
Сообщений: 4,485
Записей в блоге: 50
Сообщение от terabyte32
Использовать API это код что ли?
Да. Но не просто код, а низкоуровневый код, интерфейс, который предоставляет ОС, а не обёртки на вроде MFC
Регистрация: 05.01.2018
Сообщений: 125
Проще говоря, с++ — это язык, а WinApi — просто использует его синтаксис и базу. Там свои функции, классы и т.д. С++ используют не только для WinApi.
Чтобы людям было поудобней, создали форму, куда можно добавлять кнопки. Тогда редактор генерирует код автоматически.
Ну а если нет опыта работы с редактором или у него нет поддержки формы, пишут вот это Написать обычный текст на окне (там есть кнопки) , или проще:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
#include #define button1 1 LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) switch(Message) { case WM_CREATE:{ CreateWindow(TEXT("button"),TEXT("Button"), WS_VISIBLE break; case WM_DESTROY: { PostQuitMessage(0); break; } default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) WNDCLASSEX wc; HWND hwnd; MSG msg; memset(&wc,0,sizeof(wc)); wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszClassName = "WindowClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); RegisterClassEx(&wc); hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass", "Program", WS_VISIBLE return msg.wParam; }
и, еще проще,
1 2 3 4 5 6 7
#define button1 1 CreateWindow(TEXT("button"),TEXT("Button"), WS_VISIBLE | WS_CHILD, 10,10, //позиция кнопки по x y 90,35, //размеры кнопки по x y hwnd,(HMENU)button1,NULL,NULL );
Как добавить кнопку в c
Честно говорю, что я искал, как это делается, но не понял. Мне нужно, чтобы один раз нажал кнопку в программе, и с этого момента началось циклическое выполнение действий. Типа того:
Как можно такое сделать?
Регистрация: 15.02.2010
Сообщений: 15,592
Есть такое понятие как обработчик нажатия кнопки. Обычно в него можно попасть дважды кликнув на нужной кнопке в дизайнере.
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
А может как-то проще можно сделать? Я понял, что при каждом нажатии на кнопку я могу изменять значение некоторой переменной с True на False, а при обработке менять цвет кнопки, например.
Но вот можно подробнее насчет «нужной кнопки в дизайнере»?
Регистрация: 12.01.2011
Сообщений: 19,500
Чего подробнее?
Регистрация: 15.02.2010
Сообщений: 15,592
Сообщение от Krasi
А может как-то проще можно сделать? Я понял, что при каждом нажатии на кнопку я могу изменять значение некоторой переменной с True на False, а при обработке менять цвет кнопки, например.
Ну зависит от задачи и проектирования. Можно отдельный рабочий поток запустить и кнопкой переключать его состояние, модно цикл в кнопку всунуть.
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
А, понятно, ну я-то в курсе события Click. Мне-то именно это и надо, чтобы кнопка принимала 2 состояния — нажатое, и отжатое. Сейчас я имею лишь кнопку, на которую можно просто кликать, у меня по этому клику выполняется код, 1 раз.
А мне-то надо так: нажал на кнопу — она изменилась и стала нажатой, и циклически работает тот код, который я прописал для такого положения кнопки. Вот как это сделать?
Я на таком уровне в решении данного вопроса:
private void button1_Click(object sender, EventArgs e) < btn1pos = !btn1pos; if (btn1pos == true) < this.Controls["button1"].UseWaitCursor = false; >if (btn1pos == false) < this.Controls["button1"].UseWaitCursor = true; >>
Думаю, что все можно сделать намного проще, вот и спрашиваю.
Последний раз редактировалось Krasi; 09.10.2015 в 15:15 .
Регистрация: 15.02.2010
Сообщений: 15,592
1. Берете CheckBox и Appearance ставите в Баттон.
2. Делаете какой-либо флаг и перерисовываете кнопку соответствующе.
3. Используйте сторонние компоненты
4. Сами отрисуйте
.
Регистрация: 12.01.2011
Сообщений: 19,500
Да куда уж проще, вроде и так просто.
В чем смысл писать Controls[«button1»] если у вас уже есть созданная дизайнером переменная button1?
И == true/false обычно не пишут для boolean выражений. Достаточно if(btn1Pos)/if(!btn1Pos) (или просто else).
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
А можете подсказать, что у меня происходит не так? То есть сейчас вроде при первом нажатии должен работать мой код, а при втором — не должен, при третьем — снова должен и тп. Так вот, рассмотрим ситуацию на деле.
private void button1_Click(object sender, EventArgs e) < btn1pos = !btn1pos; ZedGraphControl zedGraph = new ZedGraphControl(); zedGraph.Location = new System.Drawing.Point(100, 10); zedGraph.Name = "zedGraph"; zedGraph.Size = new System.Drawing.Size(500, 300); this.Controls.Add(zedGraph); ZedGraphControl zgc = zedGraph; GraphPane myPane = zgc.GraphPane; if (btn1pos) < this.Controls["button1"].UseWaitCursor = false; /////////////////Представляем символы в двоичном виде и выводим на график///////////////// ////////////////////////////////////////////////////////////////////////////////////////// string A = richTextBox1.Text; string str_bin = asbin(A); byte[] strBytes = System.Text.Encoding.Unicode.GetBytes(A); //string str = Encoding.ASCII.GetString(strBytes); StringBuilder sb = new StringBuilder(); foreach (byte b in System.Text.Encoding.Unicode.GetBytes(A)) sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')).Append(' '); string binaryStr = sb.ToString(); //////////////Массив 0 и 1 this.Controls["richTextBox2"].Text = str_bin; ////////////////////////////////////////////////////////////////Создание значений x // Set the titles and axis labels myPane.Title = "Бинарные данные"; myPane.XAxis.Title = "n, выборки"; myPane.YAxis.Title = "bin_data, единицы"; PointPairList list = new PointPairList(); int l = strBytes.Length; int[] myArr = new int[l]; // Инициализируем каждый элемент массива вручную for (int i = 0; i < l; i++) < myArr[i] = i; list.Add(myArr[i], strBytes[i]); >LineItem myCurve = myPane.AddCurve("bin_data", list, Color.Green, SymbolType.Diamond); zgc.AxisChange(); zgc.Refresh(); > if (!btn1pos) < this.Controls["button1"].UseWaitCursor = true; >> static string chr2(char c) < string s = " "; for (; c != '\0'; c = (char)((byte)c >> 1)) s = ((((byte)c & 1) != 0) ? "1" : "0") + s; return s; > static string asbin(string s)
Я нажимаю на этот батон) первый раз, и тогда строится график и в окошко №2 выводятся бинарные данные текста, введенного в окошко №1. Теперь мистика. Я сокращаю текст. Нажимаю батон, теперь он false, нажимаю еще, он снова true. И график должен бы поменяться, как и содержимое окна № 2. Но содержимое окна меняется, а вот график остается прежним. Где я что упустил?
Форумчанин
Регистрация: 12.02.2010
Сообщений: 787
private void checkBox1_CheckedChanged(object sender, EventArgs e) < if (checkBox1.Checked) < this.Controls["checkBox1"].ForeColor = Color.Green; /////////////////Представляем символы в двоичном виде и выводим на график///////////////// ////////////////////////////////////////////////////////////////////////////////////////// string A = richTextBox1.Text; string[] B = new string[1000]; int i = 0; foreach (char x in A) < B[nSymbol] += x; i++; if (i == 56) < i = 0; nSymbol++; >> //this.Controls["richTextBox2"].Text = B[1]; string s = "Hello"; < for (i = 1; i > > > else < this.Controls["checkBox1"].ForeColor = Color.DarkRed; this.Controls["richTextBox2"].Text = ""; >>
Сейчас у меня 2 состояния с помощью CheckBox с опцией Button. Когда состояние нажатое, программа заходит в цикл, в котором обновляет форму, поэтому я на экране сейчас вижу, как у меня текстовое поле все время дополняется новыми символами. Но я не могу остановить этот процесс! Я бы хотел нажать на кнопку (которая чек баттон) второй раз, и чтобы произошел выход из цикла. Но я понял, что меня сдерживает то, что все операции уже происходят в теле функции нажатия на кнопку. Что мне делать?