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

Графика GDI++

30.04.2012, 15:26. Показов 2327. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Помогите с этим заданием : "В PictureBox заметно для пользователя (постепенно) рисуется кирпичная стена. Количество кирпичей по горизонтали и вертикали указывает пользователь." приложение в Visual Studio 2005,язык C++.

Заранее благодарен!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.04.2012, 15:26
Ответы с готовыми решениями:

Gdi+ возникла ошибка общего вида
"gdi+ возникла ошибка общего вида" На одной машине под win 7 возникает на другой нет: bmpK=gcnew Bitmap(iFrame->width,...

Visual Studio 2010 C Graphic Basics (GDI+)
День добрый, форумчане. Есть одна задача, а именно : "В PictureBox случайно выбираются 2 точки. Соединить эти 2 точки случайной...

Не могу подключить библиотеки GDI+ при создании приложения Windows Forms в VC++
Не могу подключить библиотеки GDI+ при создании приложения Windows Forms в VC++. Пробовал #include <Gdiplus.h> выдает около ста...

2
1 / 1 / 0
Регистрация: 05.04.2012
Сообщений: 22
04.05.2012, 19:11  [ТС]
Все разобрался!

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
// #pragma endregion
        int x,y;
        Graphics^gr;
        int rowCount,brickCount,rowCountDrawn,brickCountDrawn;
 
    private: System::Void btnDraw_Click(System::Object^  sender, System::EventArgs^  e) {
                 try {
                     rowCount=Convert::ToInt32(txtRowCount->Text);
                     brickCount=Convert::ToInt32(txtBrickCount->Text); 
                 } catch (...) {}
                 rowCountDrawn=0;
                 brickCountDrawn=0;
                 x=0;
                 y=0; 
                 gr=picBox1->CreateGraphics();
                 gr->Clear(BackColor);
                 timer1->Enabled=true;
             }
    private: System::Void btnClear_Click(System::Object^  sender, System::EventArgs^  e) {
                 timer1->Enabled=false;
                 gr->Clear(BackColor);
 
             }
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
                 if (brickCountDrawn < brickCount && rowCountDrawn < rowCount) {
                     if (brickCountDrawn == 0 && rowCountDrawn % 2 !=0) {
                         gr->FillRectangle(Brushes::Brown,x,y,10,10);
                         gr->DrawRectangle(Pens::Black,x,y,10,10);
                         x=x+10;
                     }  else {
                         gr->FillRectangle(Brushes::Brown,x,y,20,10);
                         gr->DrawRectangle(Pens::Black,x,y,20,10);
                         x=x+20;
                     }
                     if (x >= picBox1->Width)
                         brickCountDrawn = brickCount;
                     brickCountDrawn++;
                 } else if (rowCountDrawn < rowCount) {
                     rowCountDrawn++;
                     brickCountDrawn = 0;
                     if (rowCountDrawn % 2 !=0) {
                         x=0;
                     } else {
                         gr->FillRectangle(Brushes::Brown,x,y,10,10);
                         gr->DrawRectangle(Pens::Black,x,y,10,10);
                         x=0;
                     }
                     y=y+10;
                     if (y >= picBox1->Height)
                         rowCountDrawn = rowCount;
                 } else {
                     timer1->Enabled = false;
                 }
             }
    };
}
0
1 / 1 / 0
Регистрация: 05.04.2012
Сообщений: 22
17.05.2012, 01:34  [ТС]
Ребята,нужна помощь!!!
В заданий сказано : При необходимости перерисовки изображения (при возникновении события Paint) оно должно корректно восстанавливаться.

Я понимаю,что надо сделать массив для хранения данных,чтобы потом можно было из него извлекать якобы мои рисунок.

Я в ступоре и не могу понять,как это правильно сделать.

Вот код ( рабочий ) есть один минус,когда приложение сворачиваешь рисунок стерается!!!
А мне надо чтобы он оставался. То есть я сворачиваю окно приложения ---> останавливается рисование ---> открываю форму и он продолжает рисовать до определеного значения ( x,y ).

КОД :
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
#pragma once
 
namespace brick{
 
    struct brick { // Структура базы данных "Кирпичи".
        double x;
        double y;
        double widht;
        double leght;
        Brushes brush;
        Pens pens;
        
    };
 
    static brick* arr = new brick[4][5];
 
namespace LR4 {
 
    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>
    /// Summary for Form1
    ///
    /// WARNING: If you change the name of this class, you will need to change the
    ///          'Resource File Name' property for the managed resource compiler tool
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //
        }
 
    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::PictureBox^  picBox1;
    protected: 
    private: System::Windows::Forms::Button^  btnDraw;
    private: System::Windows::Forms::Button^  btnClear;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Label^  label2;
    private: System::Windows::Forms::TextBox^  txtBrickCount;
 
    private: System::Windows::Forms::TextBox^  txtRowCount;
 
    private: System::Windows::Forms::Timer^  timer1;
    private: System::ComponentModel::IContainer^  components;
 
    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
 
 
#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->components = (gcnew System::ComponentModel::Container());
            this->picBox1 = (gcnew System::Windows::Forms::PictureBox());
            this->btnDraw = (gcnew System::Windows::Forms::Button());
            this->btnClear = (gcnew System::Windows::Forms::Button());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->label2 = (gcnew System::Windows::Forms::Label());
            this->txtBrickCount = (gcnew System::Windows::Forms::TextBox());
            this->txtRowCount = (gcnew System::Windows::Forms::TextBox());
            this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->picBox1))->BeginInit();
            this->SuspendLayout();
            // 
            // picBox1
            // 
            this->picBox1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom) 
                | System::Windows::Forms::AnchorStyles::Left) 
                | System::Windows::Forms::AnchorStyles::Right));
            this->picBox1->Location = System::Drawing::Point(12, 12);
            this->picBox1->Name = L"picBox1";
            this->picBox1->Size = System::Drawing::Size(510, 342);
            this->picBox1->TabIndex = 0;
            this->picBox1->TabStop = false;
            this->picBox1->Click += gcnew System::EventHandler(this, &Form1::picBox1_Click);
            // 
            // btnDraw
            // 
            this->btnDraw->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
            this->btnDraw->Location = System::Drawing::Point(79, 360);
            this->btnDraw->Name = L"btnDraw";
            this->btnDraw->Size = System::Drawing::Size(63, 20);
            this->btnDraw->TabIndex = 1;
            this->btnDraw->Text = L"Draw";
            this->btnDraw->UseVisualStyleBackColor = true;
            this->btnDraw->Click += gcnew System::EventHandler(this, &Form1::btnDraw_Click);
            // 
            // btnClear
            // 
            this->btnClear->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
            this->btnClear->Location = System::Drawing::Point(398, 360);
            this->btnClear->Name = L"btnClear";
            this->btnClear->Size = System::Drawing::Size(63, 21);
            this->btnClear->TabIndex = 2;
            this->btnClear->Text = L"Clear";
            this->btnClear->UseVisualStyleBackColor = true;
            this->btnClear->Click += gcnew System::EventHandler(this, &Form1::btnClear_Click);
            // 
            // label1
            // 
            this->label1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(152, 363);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(54, 13);
            this->label1->TabIndex = 3;
            this->label1->Text = L"Horizontal";
            // 
            // label2
            // 
            this->label2->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
            this->label2->AutoSize = true;
            this->label2->Location = System::Drawing::Point(281, 364);
            this->label2->Name = L"label2";
            this->label2->Size = System::Drawing::Size(42, 13);
            this->label2->TabIndex = 4;
            this->label2->Text = L"Vertical";
            // 
            // txtBrickCount
            // 
            this->txtBrickCount->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
            this->txtBrickCount->Location = System::Drawing::Point(212, 360);
            this->txtBrickCount->Name = L"txtBrickCount";
            this->txtBrickCount->Size = System::Drawing::Size(63, 20);
            this->txtBrickCount->TabIndex = 5;
            // 
            // txtRowCount
            // 
            this->txtRowCount->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((System::Windows::Forms::AnchorStyles::Bottom | System::Windows::Forms::AnchorStyles::Left));
            this->txtRowCount->Location = System::Drawing::Point(329, 361);
            this->txtRowCount->Name = L"txtRowCount";
            this->txtRowCount->Size = System::Drawing::Size(63, 20);
            this->txtRowCount->TabIndex = 6;
            // 
            // timer1
            // 
            this->timer1->Interval = 150;
            this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(534, 392);
            this->Controls->Add(this->txtRowCount);
            this->Controls->Add(this->txtBrickCount);
            this->Controls->Add(this->label2);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->btnClear);
            this->Controls->Add(this->btnDraw);
            this->Controls->Add(this->picBox1);
            this->MaximumSize = System::Drawing::Size(550, 430);
            this->MinimumSize = System::Drawing::Size(550, 430);
            this->Name = L"Form1";
            this->Text = L"Wall";
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->picBox1))->EndInit();
            this->ResumeLayout(false);
            this->PerformLayout();
 
        }
#pragma endregion
        int x,y;
        Graphics^gr;
        int rowCount,brickCount,rowCountDrawn,brickCountDrawn;
 
    private: System::Void btnDraw_Click(System::Object^  sender, System::EventArgs^  e) {
                 try {
                     rowCount=Convert::ToInt32(txtRowCount->Text);
                     brickCount=Convert::ToInt32(txtBrickCount->Text); 
                 } catch (...) {}
                 rowCountDrawn=0;
                 brickCountDrawn=0;
                 x=0;
                 y = picBox1->Height - 20; 
                 gr=picBox1->CreateGraphics();
                 gr->Clear(BackColor);
                 timer1->Enabled=true;
             }
    private: System::Void btnClear_Click(System::Object^  sender, System::EventArgs^  e) {
                 timer1->Enabled=false;
                 gr->Clear(BackColor);
 
             }
    private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {
                 if (brickCountDrawn < brickCount && rowCountDrawn < rowCount) {
                     if (brickCountDrawn == 0 && rowCountDrawn % 2 !=0) {
                         gr->FillRectangle(Brushes::Brown,x,y,20,20);
                         gr->DrawRectangle(Pens::Black,x,y,20,20);
                         x=x+20;
                     }  else {
                         gr->FillRectangle(Brushes::Brown,x,y,40,20);
                         gr->DrawRectangle(Pens::Black,x,y,40,20);
                         x=x+40;
                     }
                     if (x >= picBox1->Width)
                         brickCountDrawn = brickCount;
                     brickCountDrawn++;
                 } else if (rowCountDrawn < rowCount) {
                     rowCountDrawn++;
                     brickCountDrawn = 0;
                     if (rowCountDrawn % 2 !=0) {
                         x=0;
                     } else {
                         gr->FillRectangle(Brushes::Brown,x,y,20,20);
                         gr->DrawRectangle(Pens::Black,x,y,20,20);
                         x=0;
                     }
                     y=y-20;
                     if (y >= picBox1->Height)
                         rowCountDrawn = rowCount;
                 } else {
                     timer1->Enabled = false;
                 }
             }
    private: System::Void picBox1_Click(System::Object^  sender, System::EventArgs^  e) {
             }
    };
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.05.2012, 01:34
Помогаю со студенческими работами здесь

Как можно рисовать на форме Windows Forms с помощью обычного GDI
Здравствуйте! Как можно рисовать на форме Windows Forms с помощью обычного GDI. Создавал класс который рисует на Консоли Win32...

В GDI+ возникла ошибка общего вида. Я пытаюсь перевести Image в байт-массив
Необработанное исключение типа &quot;System.Runtime.InteropServices.ExternalException&quot; произошло в System.Drawing.dll Дополнительные...

3D графика в GDI
Здравствуйте, изучаю GDI и у меня возник вопрос, возможно ли создавать 3D фигуры в GDI c++, если да, то как? заранее спасибо

Редактируемая графика в GDI+
Всем привет. Делаю курсач на c# VS2008.net. Тема курсача - paint (его аналог). Я уже реализовал рисование фигур, сохранение, заливку....

Анимация дождя (GDI графика)
Дали задание сделать анимацию дождя... Пока что всё достаточно печально... Ничего не выходит... :cry: Может кто то подсказать алгоритм...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru