Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2016, 21:39   #1
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию Обращение к объектам в классах C++/CLI Windows Forms

Добрый вечер. Нужно написать программу, в которой будут кнопки, нажав на которые будут происходить некоторые изменения с окружностью. Проблема состоит в том, что рисую график координат, окружность я в методе panel1_Paint, а одно изменение с окружностью должно происходить в методе button1_Click. Если я создала в panel1_Paint место для рисования
Код:
Graphics ^g = panel1->CreateGraphics();
и рисовала с помощью него окружность
Код:
g->DrawEllipse(Pens::Red, 200,50, 247, 247);
то каким образом можно проводить изменения в методе button1_Click?Ведь для изменений нужен этот объект g, а с метода button1_Click я не могу к нему обратиться. Возможно Graphics ^g сделать глобальным?Но что-то у меня не получается в C++/CLI создавать глобальные переменные, синтаксис верный не могу найти
Вероника99 вне форума Ответить с цитированием
Старый 16.10.2016, 21:48   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут Graphics? paint же постоянно вызывается для перерисовки, если вы только один раз нарисуете при нажатии, то оно пропадет через какое-то время (как минимум после сворачивания).

Вам надо не его сделать глобальным (ну точнее достаточно например полем класса формы), а параметры, которые ему нужны.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2016, 22:18   #3
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Спасибо за ответ.Я сделала полем класса Graphics ^g; (выделено жирным в коде), но выдало ошибки g: необъявленный идентификатор. Как правильно сделать объект полем класса?


Код:

#pragma once
 
namespace My4{
 
    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
 using namespace System::Collections::Generic;

    /// <summary>
    /// Summary for Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
			Graphics ^g;



        }
 
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
	private: System::Windows::Forms::Panel^  panel1;
	protected: 
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;
 
#pragma region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->panel1 = (gcnew System::Windows::Forms::Panel());
			this->SuspendLayout();
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(614, 481);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(75, 23);
			this->button1->TabIndex = 0;
			this->button1->Text = L"button1";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// panel1
			// 
			this->panel1->Location = System::Drawing::Point(21, 25);
			this->panel1->Name = L"panel1";
			this->panel1->Size = System::Drawing::Size(668, 408);
			this->panel1->TabIndex = 1;
			this->panel1->Paint += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::panel1_Paint);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(734, 516);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->panel1);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->ResumeLayout(false);

			 g = panel1->CreateGraphics(); // создаем место для рисования

		}
#pragma endregion
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
             {

				
			
				
			 }

			
	private: System::Void panel1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) {

				


		
				   g->DrawEllipse(Pens::Red, 200,50, 247, 247); //1 параметр-ось х,2-у
		 Pen ^penCO = gcnew Pen(Color::Green, 5.F);		
		g->DrawLine(penCO, Point(330, -5000), Point(330, 5000));//ось у
		  g->DrawLine(penCO,  Point(-5000, 200), Point(5000, 200));//ось х

		g->TranslateTransform(3200, 200); // смещение начала координат (в пикселях)
           g->RotateTransform(180.0F);
           g->ScaleTransform(7.0F, 7.0F);
                // Graphics^ g1 = Graphics::FromHwnd(this->Handle);

			List<Point> p = gcnew List<Point>(); // список точек графика

			 Pen ^pen = gcnew Pen(Color::DarkRed,0.5F); // перо, для отрисовки графика
			 Pen ^gridPen = gcnew Pen(Color::DeepPink, 0.0001F); //перо для отрисовки координатной сетки
			
			 System::Drawing::Font ^fo = gcnew System::Drawing::Font(FontFamily::GenericSerif,3.F); //шрифт для выведения 
		
			  int W = panel1->Width, H = panel1->Height;
            int halfW = W / 2, halfH = H / 2;
		//	 e->Graphics->DrawLine(Pens::Black, halfW, 0, halfW, H);
        //  e->Graphics->DrawLine(Pens::Black, 0, halfH, W, halfH);
			 
		
	   
		
		  // толстая зеленая линия, ось OX
		
			
						

			// рисуем координатную сетку
           int x = 0; //начальное значение координаты х. Постороение идет из указанной точки
            int y = -100; // начальное значение координаты у. Пояснение см выше.
			
		
			while (x <= 500) //конечное значение координаты х. Бесконечное количество линий нам не надо, ибо никакой памяти не хватит
            {
                x = x + 5; // шаг линий, параллельных оси ОУ
                y = y + 5; //шаг линий, параллельных оси ОХ
                g->DrawLine(gridPen, Point(x, -500),  Point(x, 1000)); // рисуем линии, параллельные оси ОУ
                g->DrawLine(gridPen, Point(-500, y),  Point(1000, y)); //рисуем линии, параллельные оси ОХ

            }
			
			
		

		
		 



			 }
};
}
Вероника99 вне форума Ответить с цитированием
Старый 16.10.2016, 22:22   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Дык посмотрите например на System::ComponentModel::Container ^components; и где оно находится.

И вам не нужен глобальный Graphics, читайте сообщение выше.

И форматируйте код нормально. Хотя бы Ctrl+A, Ctrl+K, Ctrl+F нажмите в студии.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2016, 22:42   #5
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Хорошо, поняла, спасибо.
Для эксперимента в button1 прописала:
Код:
  g->DrawEllipse(Pens::Red, 250,80, 207, 207);
Думала по нажатию кнопки, на ось добавится еще одна окружность, но ничего не произошло. В чем ошибка?
Вероника99 вне форума Ответить с цитированием
Старый 16.10.2016, 22:45   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В нечитании первого сообщения.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2016, 22:51   #7
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Причем тут Graphics?
Вам надо не его сделать глобальным (ну точнее достаточно например полем класса формы), а параметры, которые ему нужны.
А что , имеется в виду, под "параметрами"?
Вероника99 вне форума Ответить с цитированием
Старый 16.10.2016, 23:11   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

то, что ему нужно для рисования (и что надо менять). В данном случае видимо цвет и положение/размеры эллипса. Или список этого если вы хотите добавлять фигуры.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 16.10.2016, 23:14   #9
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

Окружность начала появляться по нажатию кнопки, после удаления строк
Код:
 g->TranslateTransform(3200, 200); // смещение начала координат (в пикселях)
           g->RotateTransform(180.0F);
           g->ScaleTransform(7.0F, 7.0F);
Не очень понимала зачем эти строки
Вероника99 вне форума Ответить с цитированием
Старый 16.10.2016, 23:21   #10
Вероника99
Форумчанин
 
Регистрация: 15.12.2013
Сообщений: 414
По умолчанию

А как здесь объявлять глобальные переменные?
Вероника99 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск абсолютного индекса элемента в TreeView (C++/CLI Windows Forms) Cha1000000 Windows Forms 10 11.04.2016 15:50
C++/CLI Windows Forms Обработка сообщения WM_DEVICECHANGE Cha1000000 Windows Forms 13 08.04.2016 00:52
DirectInput и джойстик (C++/CLI, Windows Forms) Vistaern Win Api 1 21.02.2013 06:48
Проблема с выделением памяти в глобальной области windows forms(C++\CLI) DartLenin Помощь студентам 2 24.01.2012 20:58
Проблема с отображением русского языка (Windows Forms C++ CLI) Alex TGM Помощь студентам 0 17.08.2010 11:13