0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 30

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

30.04.2012, 21:05. Показов 21616. Ответов 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
9006 / 4707 / 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
9006 / 4707 / 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
9006 / 4707 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru