Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод графики на экран в C#, Как вывести графику напрямую на экран? 
:(
    Опции темы
Roo
  Дата 17.10.2005, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



Подскажите кто-нибудь, как в .NET на C# выводить графику напрямую на экран. Мне нужно показывать простецкое сообщение с текстом, но я не хочу использовать окна. Т.е. просто прямоугольник с текстом внутри. У меня одна только книга Троелсена, а там графика рассматривается только относительно окон...
PM MAIL   Вверх
Exception
Дата 17.10.2005, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



через directX наверное.. других путей не вижу
Добавлено @ 19:24
а зачем?
PM   Вверх
Visor2004
Дата 17.10.2005, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.10.2005

Репутация: нет
Всего: нет



Вот держи кусок рабочей проги (делает как раз то, что тебе нужно):
Код


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Threading;
using Microsoft.DirectX;
using Microsoft.DirectX.DirectDraw;

namespace TestDirectDraw
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
        private System.ComponentModel.IContainer components;
        private System.Windows.Forms.ImageList imageList1;        
        private System.Threading.Thread DrawThread;
        private bool m_Terminated;

        public Form1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #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>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
            // 
            // imageList1
            // 
            this.imageList1.ImageSize = new System.Drawing.Size(128, 128);
            this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream")));
            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(640, 510);
            this.Name = "Form1";
            this.Text = "Form1";
            this.Closing += new System.ComponentModel.CancelEventHandler(this.Form1_Closing);
            this.Load += new System.EventHandler(this.Form1_Load);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Form1());
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {            
            m_Terminated = false;
            DrawThread = new Thread(new ThreadStart(DrawBoxThreadBody));
            DrawThread.Start();
        }
        void DrawBoxThreadBody()
        {
            Device DirectDraw = new Device(CreateFlags.HardwareOnly);
            const string Text = "Текущее время 89:78";
            if (DirectDraw != null)
            {
                DirectDraw.SetCooperativeLevel(this, CooperativeLevelFlags.Normal);
                SurfaceCaps SurfaceCapabilities = new SurfaceCaps();                
                SurfaceCapabilities.PrimarySurface = true;
                SurfaceDescription Description = new SurfaceDescription(SurfaceCapabilities);
                Surface PrimaryBuffer = new Surface(Description, DirectDraw);
                PrimaryBuffer.Clipper = new Clipper(DirectDraw);
                PrimaryBuffer.FillColor = System.Drawing.Color.Black;
                
                System.IntPtr PrimaryDC = PrimaryBuffer.GetDc();
                System.Drawing.Graphics gr = System.Drawing.Graphics.FromHdc(PrimaryDC);

                int i = 24;
                System.Drawing.Font TextFont = new Font("Comic Sans MS", i);
                System.Drawing.SizeF TextSize = gr.MeasureString(Text, TextFont);
                while (TextSize.Width < DirectDraw.DisplayMode.Width)
                {
                    TextFont = new Font("Comic Sans MS", i);
                    TextSize = gr.MeasureString(Text, TextFont);
                    i++;
                    TextFont.Dispose();
                }
                TextFont = new Font("Comic Sans MS", i - 2);

                while (!m_Terminated)
                {                                        
                    gr.DrawString(Text, TextFont, Brushes.DarkGoldenrod, 0, 0);                    
                    Thread.Sleep(10);
                }
                TextFont.Dispose();
                PrimaryBuffer.Dispose();
                DirectDraw.Dispose();
            }
        }

        private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            m_Terminated = true;
            DrawThread.Join();
        }
    }
}



Тока в референсы не забудь добавить сборки для Managed DirectX.
PM MAIL   Вверх
Roo
Дата 18.10.2005, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



2 Run-time error :
Надо для того, чтоб не было лишней функциональности. Например, чтоб пользователь не мог переместить сообщение или закрыть его (как MessageBox например).
2 Visor2004 :
Огромное спасибо!
PM MAIL   Вверх
Roo
Дата 18.10.2005, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



2 Run-time error :
Извиняюсь за невежество, но не могу понять, какую сборку добавлять для DirectX, никогда раньше с этим не работал. Может, у меня в .NET она вообще не поставилась? Откуда её нужно брать?
PM MAIL   Вверх
Mad
Дата 18.10.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Roo
Цитата(Run @ 17.10.2005, 18:22)
через directX наверное.. других путей не вижу

Все делаеться гораздо проще (и притом на формах)

1. Создаеш проект WindowsApplication
2. У созданной визардом формы ставищ Border в None и ShowInTaskBar в false
3. Ставиш на форму нужные элементы управления (в твоем случае просто один label)
4. Готово. smile


--------------------
user posted image
PM MAIL   Вверх
Roo
Дата 18.10.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 17.10.2005

Репутация: нет
Всего: нет



В принципе, да!
Однако было б вообще замечательно, если б это окно нельзя было закрыть, т.е. оно б не откликалось на Alt-F4 =))
PM MAIL   Вверх
SunOK
Дата 19.10.2005, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 5.10.2005

Репутация: нет
Всего: 1



По поводу DirectX SDK http://msdn.microsoft.com/directx/sdk/
Но он весит ~200 mb.
PM MAIL WWW   Вверх
Exception
Дата 19.10.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



тока нужен именно Managed DirectX
PM   Вверх
stab
Дата 19.10.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 22
Всего: 48



Цитата(Roo @ 18.10.2005, 21:43)
Однако было б вообще замечательно, если б это окно нельзя было закрыть, т.е. оно б не откликалось на Alt-F4 =))


Код

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
        }




--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
mr.DUDA
Дата 20.10.2005, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



М-да...

Цитата(Roo @ 17.10.2005, 19:15)
Мне нужно показывать простецкое сообщение с текстом, но я не хочу использовать окна

Но ведь в примере выше используются как раз-таки окна ! Хоть и неявно, но контекст графического вывода создаётся, и подключается к устройству вывода. А это мало чем (разве что способом вывода) отличается от создания простейшей формы на C#. smile


--------------------
user posted image
PM MAIL WWW   Вверх
Mad
Дата 21.10.2005, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 1
Всего: 19



Цитата(mr @ 20.10.2005, 21:30)
А это мало чем (разве что способом вывода) отличается от создания простейшей формы на C#.

Даже больше smile ресурсов еще сожрет немеренно (по отношению к простой форме) smile


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0859 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.