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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.10.2012, 14:56   #1
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию Рисование на Windows Forms Application

Убил в поисках много времени, никак не могу разобраться как правильно рисовать на форме в visual c++.
До этого работал с канвасом на delphi и borland c++, там создавал битмап в который каждый тик таймера поэлементно строилось изображение и выводилось без мельканий на форму.
В visual с++ нашел единственный способ вывести что-либо на экран: в событии paint использовать PaintEventArgs:
Код:
e->Graphics->DrawLine(gcnew System::Drawing::Pen(System::Drawing::Color::Black),10,10,20,20);
Но мне надо обновлять картинку постоянно в таймере, что я сделать не могу так как чтобы что-либо нарисовать нужно иметь PaintEventArgs (да и мерцание из-за постепенного формирования изображения никуда не денется).
Вадим Буренков вне форума Ответить с цитированием
Старый 21.10.2012, 22:44   #2
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Тоже интересуюсь данным вопросом, как нарисовать что либо, желательно картинку из bmp jpg файла на окне, причем по таймеру, и что бы не было мерцания. Ну или хотя бы как пиксель вывести на экран. А то туплю, Google перерыл 47 страниц, и нигде нет нужной информации, не какой конкретики, только типо, используешь метод DrawLine
Всё будет так, как должно было быть, даже, если будет наоборот.
Odinok вне форума Ответить с цитированием
Старый 22.10.2012, 09:56   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Какие 47 страниц, вот все на первой странице...
http://msdn.microsoft.com/en-us/libr....graphics.aspx
waleri вне форума Ответить с цитированием
Старый 22.10.2012, 14:35   #4
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Какие 47 страниц, вот все на первой странице...
http://msdn.microsoft.com/en-us/libr....graphics.aspx
это я находил, но оно не работает,ошибку выдает, ...
и там фрагмент кода, не достаточный для выполнение данной функции
Всё будет так, как должно было быть, даже, если будет наоборот.

Последний раз редактировалось Odinok; 22.10.2012 в 14:37.
Odinok вне форума Ответить с цитированием
Старый 22.10.2012, 15:49   #5
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Вроде разобрался, но понял что писать на CLR для меня изврященство, поэтому теперь использую winapi.
Вот проект с выводом графики по таймеру, может пригодится. Используется вывод сначала в буфер, потом на экран. Дерганья есть, но терпимые.
Вложения
Тип файла: rar AirAttack.rar (746.3 Кб, 63 просмотров)
Вадим Буренков вне форума Ответить с цитированием
Старый 22.10.2012, 17:46   #6
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от Вадим Буренков Посмотреть сообщение
Вроде разобрался, но понял что писать на CLR для меня изврященство, поэтому теперь использую winapi.
Вот проект с выводом графики по таймеру, может пригодится. Используется вывод сначала в буфер, потом на экран. Дерганья есть, но терпимые.
а можно кодом скинуть?
Всё будет так, как должно было быть, даже, если будет наоборот.
Odinok вне форума Ответить с цитированием
Старый 22.10.2012, 17:50   #7
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

Код:
#pragma once

const int scr_Width = 500;
const int scr_Height = 300;

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;


public ref class MainForm : public System::Windows::Forms::Form
{
public:
	Graphics ^g_buffer, ^g_form;
	Bitmap ^buffer;
	Rectangle scrRect;

	Bitmap ^sprite;

	MainForm(void)
	{
		InitializeComponent();
		//
		//TODO: Add the constructor code here
		//
	}

protected:
	/// <summary>
	/// Clean up any resources being used.
	/// </summary>
	~MainForm()
	{
		if (components)
		{
			delete components;
		}
	}
private: System::Windows::Forms::Timer^  UpdateTimer;
private: System::ComponentModel::IContainer^  components;

private:
#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->UpdateTimer = (gcnew System::Windows::Forms::Timer(this->components));
		this->SuspendLayout();
		// 
		// UpdateTimer
		// 
		this->UpdateTimer->Enabled = true;
		this->UpdateTimer->Interval = 10;
		this->UpdateTimer->Tick += gcnew System::EventHandler(this, &MainForm::UpdateTimer_Tick);
		// 
		// MainForm
		// 
		this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
		this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
		this->ClientSize = System::Drawing::Size(594, 372);
		this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::FixedSingle;
		this->MaximizeBox = false;
		this->Name = L"MainForm";
		this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
		this->Text = L"MainForm";
		this->Load += gcnew System::EventHandler(this, &MainForm::MainForm_Load);
		this->ResumeLayout(false);

	}
#pragma endregion
private: System::Void MainForm_Load(System::Object^  sender, System::EventArgs^  e) 
		 {
			 this->ClientSize = System::Drawing::Size(scr_Width, scr_Height);
			 this->SetStyle(ControlStyles::OptimizedDoubleBuffer |  ControlStyles::UserPaint, true);
			 this->UpdateStyles();

			 g_form = this->CreateGraphics();
			 buffer = gcnew Bitmap(scr_Width,scr_Height);
			 g_buffer = Graphics::FromImage(buffer);
			 scrRect = Rectangle(0, 0, scr_Width, scr_Height);

			 sprite = gcnew Bitmap( "C:\\Data\\Wall.bmp" );
			 sprite->MakeTransparent();
		 }

private: System::Void UpdateTimer_Tick(System::Object^  sender, System::EventArgs^  e) 
		 {	
			 static float px = 0,  py = 0;
			 px+=1;
			 py+=2;

			 if (px>scr_Width) px=0;
			 if (py>scr_Height) py=0;

			 g_buffer->Clear(Color::Black);
			 
			 Rectangle  sprRect =  Rectangle(0, 0, sprite->Width, sprite->Height);
			 Rectangle drawRect =  Rectangle((int)px, (int)py, sprite->Width, sprite->Height);	
			 g_buffer->DrawImage(sprite,drawRect,sprRect,GraphicsUnit::Pixel);

			 drawRect =  Rectangle((int)py, (int)px, sprite->Width, sprite->Height);	
			 g_buffer->DrawImage(sprite,drawRect,sprRect,GraphicsUnit::Pixel);

			 g_form->DrawImage(buffer,scrRect,scrRect,GraphicsUnit::Pixel);
		 }

};
Вадим Буренков вне форума Ответить с цитированием
Старый 23.10.2012, 17:52   #8
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

Спасибо
Всё будет так, как должно было быть, даже, если будет наоборот.
Odinok вне форума Ответить с цитированием
Старый 25.10.2012, 15:25   #9
Odinok
Пользователь
 
Аватар для Odinok
 
Регистрация: 08.03.2011
Сообщений: 91
По умолчанию

g_form->DrawImage(buffer,scrRect,scrRect,G raphicsUnit::Pixel);
можно же просто
g_form->DrawImage(buffer,0,0);
Всё будет так, как должно было быть, даже, если будет наоборот.
Odinok вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
учебник по windows forms application romamoma Windows Forms 6 14.01.2011 17:20
Обьясните Windows Forms Application Cdevelop Общие вопросы .NET 1 16.03.2009 00:25
Windows Forms Application Cdevelop Общие вопросы .NET 1 15.03.2009 18:03