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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2013, 13:11   #1
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию Рисование на форме C#

Среда VS 2010
Я новичок в C#. Хочу написать простую игрушку здесь(до этого писал в delphi ее же), такой вопрос:
Как можно просто и относительно быстро выводить буфер кадра на форму? Или где можно почитать об этом, в каком направлении искать?
Есть здесь какая-то команда, подобная BitBlt, которой я выводил кадр в делфи?
LOST94 вне форума Ответить с цитированием
Старый 10.06.2013, 12:36   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Примерно как тут http://programmersforum.ru/showthread.php?t=216809 только создать битмап-буффер, на него с помощью его graphics рисовать что надо, а потом на graphics формы вывести единым махом.
Если что-то не получится, кидайте сюда проект, помогу разобраться.

пс. битблит платформо-зависимая вещь, в дотнете хоть и можно было бы обратиться к винапи и работать с ними, но сложнее и мало смысла (ввиду межплатформености дотнета, и идеологии ввообще)

Последний раз редактировалось phomm; 10.06.2013 в 12:39.
phomm вне форума Ответить с цитированием
Старый 10.06.2013, 18:37   #3
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию

ок, спасибо, будем пробовать) Вроде от дельфи почти не отличается
LOST94 вне форума Ответить с цитированием
Старый 13.06.2013, 00:35   #4
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию

Что-то уже второй день не могу проблему решить. Допустим, у меня уже есть готовый буфер Graphics buf, где все спрайты нарисованы и надписи написаны.
Код:
private void MainForm_Paint(object sender, PaintEventArgs e)
        {
Graphics fMainBuf = e.Graphics;
//сюда надо что-то добавить
}
какой командой мне дальше нарисовать в fMainBuf уже готовый буфер кадра buf? Другими словами, как мне скопировать содержимое одного graphics в другой, чтобы одним махом вывести кадр на экран?
Простое присваивание ссылок тоже ничего не дает.
LOST94 вне форума Ответить с цитированием
Старый 13.06.2013, 09:24   #5
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

BitBlt из gdi32.dll сможет скопировать.
eval вне форума Ответить с цитированием
Старый 13.06.2013, 09:58   #6
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Не помню, как там насчёт графикс вывести на графикс, вроде как-то можно, но надо смотреть, ну а я писал малость не так, я имел ввиду на основной графикс(формы) вывести сам битмап-буфер, а не его графикс (графикс битмапа - для рисования на нем).

Ну если не получится, то выкладыйвайте проектом, навскидку говорить есть ли там заковырки и какие шаги надо принимать - малореально.
phomm вне форума Ответить с цитированием
Старый 13.06.2013, 11:39   #7
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию

А как тогда мне достать битмап из графикса? Я чувствую, в каком-то месте просто не понял, как с этими двумя классами работать

Моя последовательность действий: объявить Graphics buf - подготовительный буфер, накидать в него картинок командой вроде: buf.DrawImage(im,0,0) и затем этот буфер как-то полностью скопировать в основной буфер формы.

Из вашего сообщения, я так понял, для хранения второго (подготовительного) буфера нужно класс Image использовать? Но как тогда изменять этот Image buf, чтобы создать полностью готовый кадр? как добавить на него другие картинки?
LOST94 вне форума Ответить с цитированием
Старый 13.06.2013, 16:43   #8
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от phomm
создать битмап-буффер, на него с помощью его graphics рисовать что надо
Цитата:
Сообщение от LOST94
Моя последовательность действий: объявить Graphics buf - подготовительный буфер, накидать в него картинок командой вроде: buf.DrawImage(im,0,0) и затем этот буфер как-то полностью скопировать в основной буфер формы.
графикс буфера - его ведь надо из чего-то создать, собственно битмап и есть буфер, а графикс это его "канвас", потом на другой "канвас" надо нарисовать буфер, не его(буфера) канвас, а именно сам буфер (битмап в данном случае), всё отличие от дельфи - все компоненты в дельфи (и классы типа битмапа) уже содержат ск=вой канвас в качестве свойства, а в шарпе они раздельно ходят, программист сам когда надо создает/берет графикс у нужного объекта.

Кстати, чем вызвано желание перейти с дельфи VCL на винформс и сишарп ? не всё ли равно на чём из этих двух вещей писать простенькую игрушку ? я писал простенькие на обоих, и в общем и целом скажу, что дельфи чуть лучше подходит для такой цели.
Ну а про код/проект уже устал говорить ))

Последний раз редактировалось phomm; 13.06.2013 в 16:49.
phomm вне форума Ответить с цитированием
Старый 13.06.2013, 22:25   #9
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию

Все понял, теперь получилось, спасибо
LOST94 вне форума Ответить с цитированием
Старый 15.06.2013, 12:09   #10
LOST94
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 47
По умолчанию

Поспешил радоваться, не прокатило как хотел сделать. Мерцание есть (не понимаю почему), но если поставить галочку DoubleBuffered, перестает.
Основная проблема, что таймер здесь как -то не так время меряет. Т е если изменить интервал скажем с 10 на 5, в 2 раз быстрее кружки по форме не поедут. В этом проекте еще не так заметно, но в основном проблемы начинаются уже на интервале 50-70. Когда я ставлю интервал меньше, действия не ускоряются абсолютно, и все рывками идет.
В том проекте принцип вывода аналогичный.

Выложил и код, и проект. Посмотрите, пожалуйста. Сам уже вряд ли разберусь.
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace graphic3
{
    public partial class Form1 : Form
    {
        int fX; // сдвиг кругов

        public Form1()
        {
            InitializeComponent();
            timer1.Interval = 5;
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            fX++;
            Invalidate();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Image SecondBuf = new Bitmap(this.Height, this.Width);
            Graphics G = Graphics.FromImage(SecondBuf);
            //рисуем фон и 2 круга
            G.FillRectangle(new SolidBrush(Color.Red), 0, 0, this.Width, this.Height);
            G.FillEllipse(new SolidBrush(Color.Blue), fX, 50, 100, 100);
            G.FillEllipse(new SolidBrush(Color.Blue), fX, 250, 100, 100);

            e.Graphics.DrawImage(SecondBuf,0,0);
        }
    }
}
Вложения
Тип файла: rar graphic3.rar (35.5 Кб, 24 просмотров)
LOST94 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# рисование на форме world12_tk Помощь студентам 5 03.09.2012 14:41
Рисование на форме Dissembler7 Помощь студентам 2 17.03.2012 22:43
Рисование на форме. (*_*) Общие вопросы C/C++ 1 22.09.2009 13:06
рисование на форме Kostua Помощь студентам 2 26.07.2008 16:24
Рисование на форме niva622 Помощь студентам 4 18.01.2007 09:34