С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/107: Рейтинг темы: голосов - 107, средняя оценка - 4.50
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30

С++ Windows Forms открыть и закрыть окно

30.04.2012, 21:05. Показов 21580. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once
#include "Тестирование.h"
namespace Курсовая {
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 
    /// <summary>
    /// Сводка для Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: добавьте код конструктора
            //
        }
 
    protected:
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    protected: 
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::TextBox^  textBox1;
 
    private:
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        void InitializeComponent(void)
        {
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->textBox1 = (gcnew System::Windows::Forms::TextBox());
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(200, 260);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(112, 26);
            this->button1->TabIndex = 0;
            this->button1->Text = L"Начать тест";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 16, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::World, 
                static_cast<System::Byte>(204)));
            this->label1->Location = System::Drawing::Point(82, 31);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(324, 20);
            this->label1->TabIndex = 1;
            this->label1->Text = L"Вас приветствует система тестирования";
            // 
            // textBox1
            // 
            this->textBox1->Location = System::Drawing::Point(165, 106);
            this->textBox1->Name = L"textBox1";
            this->textBox1->Size = System::Drawing::Size(178, 20);
            this->textBox1->TabIndex = 2;
            // 
            // Form1
            // 
            this->AccessibleDescription = L"Lo";
            this->AccessibleName = L"lo";
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(524, 341);
            this->Controls->Add(this->textBox1);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
            this->Text = L"Система тестирования";
            this->ResumeLayout(false);
            this->PerformLayout();
 
        }
 
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
                 Тестирование->Visible = true;
             }
    };
}
сам код программы
вот эта строчка должна вызвать второе окно, а первое сделать невидимым или вообще закрыть, но вылетает ошибка: "error C2143: синтаксическая ошибка: отсутствие ";" перед "->" "

C++
1
 Тестирование->Visible = true;
В чем проблема и как надо скрыть первое и вызвать второе окно понять не могу.... Помогите пожалуйста.
Кстати это еще не один вопрос, так что кто может уделите пару минут своего внимания) Буду благодарен)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.04.2012, 21:05
Ответы с готовыми решениями:

Как открыть/закрыть окно, вызываемое клавишами Ctrl+Alt+Del, в Windows 8.1?
Здравствуйте. Интересует вопрос: как открыть (закрыть) окно, вызываемое клавишами Ctrl+Alt+Del через bat(cmd) в Windows 8.1 ?

Как закрыть или скрыть основное окно и открыть дочернее, и как потом закрыть дочернее окно и открыть основное
Здравствуйте, передо мной возникла проблема, с которой я не могу справиться. Суть проблемы в том, что мне необходимо, чтобы по клику по...

Сделать окно активным, закрыть окно, открыть в текущем окне
Появилась задача просматривать картинки (например обращаясь к xdg-open или через cacaview) и при этом продолжать работу в терминале. К...

19
11 / 11 / 1
Регистрация: 08.12.2011
Сообщений: 148
30.04.2012, 23:04
Создайте Form1 и в этом же проекте form2. Далее в Form1 в самом верху напишите #include "form2.h",
После чего опять же в Form1, в собитии button1_Click напишите следующее:
C++
1
2
3
4
5
6
7
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
             {
form2^ gform2 = gcnew form2; 
            gform2->Show();
                      
            gform2->Visible = false;
}
Если не получается, то гуглите "Связать две формы C++" почитайте что люди пишут, поймёте получше о чём речь идёт.
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
02.05.2012, 14:08  [ТС]
Теперь у меня еще 2 вопроса:
1. Как мне связать объекты из 2 форм, ну например я в 1 форме узнаю строку из текст бокса, затем эти данные хочу использовать во второй форме, как это сделать?
2. Как мне считывать информацию из файла построчно, и как построчно ее от туда считывать?
P.S. Я пишу программу тест, с пользователями и редактором тестов, вся суть в том что будет 3 окна, 1 для выбора пользователя, 2 для редактора тестов, 3 для самого теста. Мне надо считывать вопрос из файла, допустим это строка.Каждая строка, новый вопрос и ответы.
0
11 / 11 / 1
Регистрация: 08.12.2011
Сообщений: 148
02.05.2012, 23:51
Для начала вам надо в form2 в самом верху где объявляются элементы, которые перенесены в форму, у элемента (в вашем случае, как я понал textBox), который вы будете использовать в обеих формах, поменять видимость с private на public - было
private: System::Windows::Forms::TextBox^ textBox1;
а надо изменить на
public: System::Windows::Forms::TextBox^ textBox1;
Если вы используйте textBox3 или 4, или вообше какой-либо другой элемент, его надо описывать именно с public.

Копирование текста из одной формы в другую
C++
1
2
3
4
form2^ gform2 = gcnew form2; 
            gform2->Show();
                      
            gform2->textBox1->Text="Текст ооваыв"; // Не забудте добавить вверху #include"form2.h"
Далее, что касается построчного чтения и записи, вопрос довольно изъезжан, поэтому, если написанный мною код не подействует, то в интернете, еть не мало информации на подобную тему.

Для начала надо создать кодировку и имя файла - то есть путь файла ,затем создать условного "Читателя" и "Писателя"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma endregion
        String^ filename;
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
filename = "C:\\text.txt"; // предпологается что по этому пути уже создан файл, так что создайте его что бы читать и записвать в него
}
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
//Создание кодировки
System::Text::Encoding^ Кодировка = System::Text::Encoding::GetEncoding(1251);
// создание Читателя
IO::StreamReader^ Читатель = gcnew IO::StreamReader(filename, Кодировка);
// Далее собственно само чтение
textBox1->Text = Читатель->ReadLine(); // если написать ReadToEnd(), то будет полное чтение файла
//Сохранение написанного
}
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
//Создание кодировки
System::Text::Encoding^ Кодировка = System::Text::Encoding::GetEncoding(1251);
// Создание Писателя
IO::StreamWriter^ Писатель = gcnew IO::StreamWriter(filename, false, Кодировка);
Писатель->WriteLine(textBox1->Text); // Что бы записать весь весь текст надо написать WriteAllText
}
Вот, всё что мог, пробуйте, вычленяйте нужную вам информацию.

Добавлено через 2 минуты
2
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
03.05.2012, 22:44  [ТС]
Следующий вопрос, когда я открыл второе окно, а второе скрыл и закрыл программу она еще висит, как мне закрыть первое окно(которое в инвизе)?
0
11 / 11 / 1
Регистрация: 08.12.2011
Сообщений: 148
03.05.2012, 22:55
Когда я делал свой проект у меня было то же самое, я пробовал мудрить с Close(); Но ничего не получилось, поэтому я просто выходил из висуала и заходил заного и когда закончил писать прогу, то всё норм. Так как если её запускать на рабочем столе, а потом закрыть крестиком, как получается только одно из окон - диспейтчер задач всё равно уже ничего не видит, так что всё впорядке - прога закрылась, так можно работать. Может конечно есть способы, но я что-то не особо нашёл, да и не особо искал. Но может быть кто другой получше знает - к прмеру Гугл (там всегда что-нибудь, да есть).
1
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
04.05.2012, 04:48
Цитата Сообщение от Wireles Посмотреть сообщение
Следующий вопрос, когда я открыл второе окно, а второе скрыл и закрыл программу она еще висит, как мне закрыть первое окно(которое в инвизе)?
Я использую вот такую схему.
На первой форме:
C++
1
2
3
this->Visible=false;
Form2^ pForm2 = gcnew Form2();
pForm2->ShowDialog(this);
На второй (событие закрытия):
C++
1
2
this->Owner->Visible=true;
this->Close();
Насчет способов как передать данные из одной формы в другую - читаем здесь (2ой вопрос)
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
04.05.2012, 11:24  [ТС]
Спасибо большое ребят, но вот еще вопрос вылез. Надо использовать глобальную переменную(даже 3 интовских). Но как?

Добавлено через 3 минуты
И как описать событие закрытия?
0
1080 / 1007 / 107
Регистрация: 28.02.2010
Сообщений: 2,889
04.05.2012, 11:33
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Wireles Посмотреть сообщение
И как описать событие закрытия?
Это Form_Closing()

Цитата Сообщение от Wireles Посмотреть сообщение
Надо использовать глобальную переменную
Создаете файл Global.h. Пишете:
C++
1
2
3
4
5
6
7
8
9
#ifndef GLOBAL_H
#define GLOBAL_H
 
public ref class Global
{
public:
    static int i;
};
#endif
Далее инклудите где нужно. Используете как Global::i = 5;
3
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
04.05.2012, 21:19  [ТС]
Ребят, спасибо за помощь. Без вас курсовая бы не двинулась)
Возникли еще вопросы:
Как закрыть форму через пункт меню?
Как создавать файл со своим именем и расширением? (как записывать я уже понял)
Как мне создавая имя этого файла приплюсовать к нему кусок другого имени? (у меня был файл открыт, я знаю его filename, надо создать новый, используя все имя старого + одно слово, например был открыт файл "Василий", а создать я должен файл для записи с именем "ВасилийРезультат")

Добавлено через 24 минуты
Всплыл еще один вопрос, а можно ли перезагрузить форму заново, как будто я ее и не открывал?Т.е. чтобы все переменные обновились и т.д. Или это только вручную?
0
11 / 11 / 1
Регистрация: 08.12.2011
Сообщений: 148
04.05.2012, 21:59
Вот проект, в которм файл "table.xml" создавался автоматически, когда его ещё не было.

C++
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
#pragma endregion
        DataTable ^ Таблица;
        DataSet ^ НаборДанных;
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
                 dataGridView1->Size = System::Drawing::Size(246, 217);
                 button1->Text = "Сохранить";
                 Таблица = gcnew DataTable();
                 НаборДанных = gcnew DataSet();
                 if (IO::File::Exists("table.xml") == false)
                 {
                     dataGridView1->DataSource = Таблица;
                     Таблица->Columns->Add("Имена");
                     Таблица->Columns->Add("Номера Телефонов");
                     НаборДанных->Tables->Add(Таблица);
                 }
                 else // 140
                 {
                     НаборДанных->ReadXml("table.xml");
                     String ^ СтрокаXML = НаборДанных->GetXml();
                     dataGridView1->DataMember = ("Название таблицы");
                     dataGridView1->DataSource = НаборДанных;
                 }
             }
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                 Таблица->TableName = "Название таблицы";
             НаборДанных->WriteXml("table.xml"); // 150
             }
    };
Всё остальное знает гугл, если его >>правильно спрашивать<< (американские форумы иногда содержат очень полезную информацию)
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
06.05.2012, 10:34  [ТС]
Чтобы закрыть второе окно, когда закрываешь первое надо написать:
C++
1
Application::Exit();
Добавлено через 1 час 2 минуты
Цитата Сообщение от Bllaaa Посмотреть сообщение
//Создание кодировки
System::Text::Encoding^ Кодировка = System::Text::Encoding::GetEncoding(1251 );
// Создание Писателя
IO::StreamWriter^ Писатель = gcnew IO::StreamWriter(filename, false, Кодировка);
Писатель->WriteLine(textBox1->Text); // Что бы записать весь весь текст надо написать WriteAllText
Вот как мне после этого закрыть файл?
Просто при работе, после того как я 1 раз записал, компилятор выдает что файл уже открыт!

Добавлено через 23 часа 21 минуту
Все понял.
Осталось только создавать файлы по указанию пути к ним. Например: "C:\\Windows\Text.txt"
должен создаться файл, а если он существует вылететь с сообщением...
Пример с таблицей чет не могу понять.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.05.2012, 19:06
Цитата Сообщение от Wireles Посмотреть сообщение
как мне закрыть первое окно(которое в инвизе)?
Если вы создаете экземпляр второй формы как поле первой формы, то можете подписать первую форму на событие Closing второй. В обработчике восстановить видимость:
C++
1
if(this->Visible==False)this->Visible=true;
тогда при любом закрытии второй, первая будет всплывать, и её можно будет корректно закрыть.
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
07.05.2012, 21:45  [ТС]
Вот еще вопрос: Как мне открыть первую форму, если я ее в инвиз послал(this->Visible=false) и работал со второй формой?
0
11 / 11 / 1
Регистрация: 08.12.2011
Сообщений: 148
07.05.2012, 22:27
Поставь на второу форму кнопку(<- назад) или собитие опиши какое-нибудь что бы в нём Visible = true было.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.05.2012, 22:45
Цитата Сообщение от Wireles Посмотреть сообщение
Вот еще вопрос: Как мне открыть первую форму, если я ее в инвиз послал(this->Visible=false) и работал со второй формой?
Я ж о том и сказал. То что форма невидима не значит, что она не работает.
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
08.05.2012, 11:08  [ТС]
Не понимаю как создать файл! Вот использую то что прислали здесь на форуме. Что надо изменить, чтобы файл создавался, если его не существует?

Добавлено через 3 минуты
Цитата Сообщение от Bllaaa Посмотреть сообщение
Поставь на второу форму кнопку(<- назад) или собитие опиши какое-нибудь что бы в нём Visible = true было.
Но как, если я пишу в коде второй формы. Написать просто Form1->Visible=true я не могу.
И как пользоваться этой стрелкой -<. Напишите пожалуйста код какой будет для открытия первой.

Добавлено через 10 минут
И как мне вызвать обработчик события закрытия?
Вот когда я хочу добавить событие загрузки формы, я на нее 2 раза кликаю, а если я хочу создать событие закрытия, что нужно делать? Просто при объявлении самой формы при изменении параметров загрузки появляется строчка:
C++
1
this->Load += gcnew System::EventHandler(this, &Form2::Form2_Load);
А как при закрытии? На что надо кликнуть?=)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.05.2012, 13:04
Вообще, стоит Вам прочесть вот это:
Ответы на 7 самых частых вопросов по WinForms
Несмотря на то, что там всё на C#, логика похожа.
Цитата Сообщение от Wireles Посмотреть сообщение
Написать просто Form1->Visible=true я не могу.
Да не можете. Хотя идея приемлема вроде. В самой 2-й форме при закрытии ( в Form2_Closing(){})
написать, что-то вроде:
C++
1
this->Owner->Visible=true;
Я говорил о способе когда Form1 подписыватся на событие в Form2 (событие Form2_Closing конкретно) и следовательно, сама по наступлению этого события устанавливает свою видимость.
Вам нужно почитать про Windows Forms.
Вот пример, последовательности действий для решения вопроса о всплытии:
1. Во второй форме создаете событие Form2_Closed(). Оно может быть полезно само по себе. В нём пишете, что Вам нужно.
2. В первой форме где у Вас уже есть экземпляр Form2, с именем допустим f2 пишете:
C++
1
this->f2->Closed+= gcnew EventHandler(this, &Form1::myForm2Closed);
3. В любом месте, в первой же форме, среди обработчиков (после #pragma endregion) руками пишете:
C++
1
2
3
private: System::Void  myForm2Closed(System::Object^ Send, System::EventArgs^ e){
if(!this->Visible)this->Show();
}
Но сначала почитайте по ссылке. И вообще, - почитайте.
ps ещё ссылка:
https://www.cyberforum.ru/cpp-... 64837.html
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30
09.05.2012, 11:49  [ТС]
Так, с закрытием разобрался... Остался один самый острый вопрос: как создавать файл?
Создавать надо в папке с самим exe и по указанному адресу.
Как? Как создать файл для записи? Не могу понять пример с Exel(((
0
11 / 11 / 1
Регистрация: 08.12.2011
Сообщений: 148
09.05.2012, 13:09
Создайте по этому вопросу отдельную (новую) тему. Думаю вам кто-нибудь обязательно ответит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2012, 13:09
Помогаю со студенческими работами здесь

Закрыть дочернее окно и открыть в единственном экземпляре Главное окно
Есть главная форма Main Form , там кнопка Button 1 при нажатии на Button 1 открывыется дочерняя форма Form 1, на фомрме Form 1 есть кнопка...

Как закрыть окно формы и открыть окно другой
Код такой. Нужно по нажатии кнопки закрыть форму 1 и открыть форму 2... но, что-то так не работает private void button2_Click(object...

Как закрыть окно в Oracle Forms 6?
Извините за простой вопрос ... но помогите плиз ... Как закрыть окно в Oracle Forms 6? Заранее благодарен ...

Закрыть одно окно и открыть другое
Здравствуйте! Столкнулся с одной проблемой. Есть окно, на нём кнопка. При нажатии на кнопку окно должно закрываться и открываться другое,...

Как открыть и закрыть модальное окно по ссылке?
У меня есть модальное окно которое открывается по ссылке и закрывается по кнопке в самом модальном окне а также закрывается оно если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru