Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Вывод графики на экран в C#


Автор: Roo 17.10.2005, 19:15
Подскажите кто-нибудь, как в .NET на C# выводить графику напрямую на экран. Мне нужно показывать простецкое сообщение с текстом, но я не хочу использовать окна. Т.е. просто прямоугольник с текстом внутри. У меня одна только книга Троелсена, а там графика рассматривается только относительно окон...

Автор: Exception 17.10.2005, 19:22
через directX наверное.. других путей не вижу
Добавлено @ 19:24
а зачем?

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


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.

Автор: Roo 18.10.2005, 07:38
2 Run-time error :
Надо для того, чтоб не было лишней функциональности. Например, чтоб пользователь не мог переместить сообщение или закрыть его (как MessageBox например).
2 Visor2004 :
Огромное спасибо!

Автор: Roo 18.10.2005, 09:50
2 Run-time error :
Извиняюсь за невежество, но не могу понять, какую сборку добавлять для DirectX, никогда раньше с этим не работал. Может, у меня в .NET она вообще не поставилась? Откуда её нужно брать?

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

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

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

Автор: Roo 18.10.2005, 17:43
В принципе, да!
Однако было б вообще замечательно, если б это окно нельзя было закрыть, т.е. оно б не откликалось на Alt-F4 =))

Автор: SunOK 19.10.2005, 01:07
По поводу DirectX SDK http://msdn.microsoft.com/directx/sdk/
Но он весит ~200 mb.

Автор: Exception 19.10.2005, 11:54
тока нужен именно Managed DirectX

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


Код

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


Автор: mr.DUDA 20.10.2005, 22:30
М-да...

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)