Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Howto: SDL Fenster in WinForm
egrath
myCSharp.de - Member

Avatar #avatar-2119.jpg


Dabei seit:
Beiträge: 937
Herkunft: Österreich / Steyr

Themenstarter:

Howto: SDL Fenster in WinForm

beantworten | zitieren | melden

Hallo,

nachdem mich das schon lange genervt hat dass es nicht so ohne weiteres möglich ist ein SDL Fenster innerhalb von Windows Forms darzustellen hab ich mich mal rangesetzt und das versucht hinzukriegen - und funktioniert ;-)

Vielleicht kann das ja mal einer von euch brauchen:


using System;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Threading;
using Tao.Sdl;

namespace TaoInside
{
    public class Program : Form
    {
        #region Native Win32 Functions
        [DllImport( "user32.dll", SetLastError = true )]
        static extern IntPtr SetParent( IntPtr child, IntPtr newParent );

        [DllImport( "user32.dll", SetLastError=true)]
        static extern IntPtr FindWindow( string className, string windowName );

        [DllImport( "user32.dll", SetLastError = true )]
        static extern bool ShowWindow( IntPtr handle, ShowWindowCommand command );        

        [DllImport( "user32.dll", SetLastError=true )]
        static extern bool SetWindowPos( IntPtr handle, IntPtr handleAfter, int x, int y, int cx, int cy, SetWindowPosFlags flags );

        private enum ShowWindowCommand : int
        {
            SW_HIDE = 0,
            SW_SHOW = 5,
            SW_SHOWNA = 8,
            SW_SHOWNORMAL = 1,
            SW_SHOWMAXIMIZED = 3
        }

        private enum SetWindowPosFlags : uint
        {
            SWP_SHOWWINDOW = 0x0400,
            SWP_NOSIZE = 0x0001
        }
        #endregion

        private IntPtr m_SdlWindowHandle;
        private IntPtr m_SdlSurface;
        private Panel m_SdlPanel;

        private int pos = 0;

        public static void Main( string[] args )
        {
            Application.Run( new Program() );
        }

        public Program()
        {
            this.Size = new Size( 800, 600 );

            // Create the Panel which will hold the SDL Window
            m_SdlPanel = new Panel();
            m_SdlPanel.Size = new Size( 640, 480 );
            m_SdlPanel.Location = new Point( 10, 10 );

            // Create the Button which triggers drawing
            Button button = new Button();
            button.Text = "Draw";
            button.Click += new EventHandler( this.ButtonClickHandler );
            button.Location = new Point( m_SdlPanel.Location.X + m_SdlPanel.Size.Width + 10, 10 );

            // Add the Controls
            this.Controls.Add( button );
            this.Controls.Add( m_SdlPanel );

            // Create the SDL WIndow
            CreateSdlWindow();

            /*
            IntPtr processWindowHandle = FindWindow( null, "Untitled - Notepad" );
            SetParent( processWindowHandle, panel.Handle );
            ShowWindow( processWindowHandle, ShowWindowCommand.SW_SHOWMAXIMIZED );
            */
        }

        private void ButtonClickHandler( object sender, EventArgs e )
        {
            // Draw a rectangle to our surface
            IntPtr videoInfoPtr = Sdl.SDL_GetVideoInfo();
            Sdl.SDL_VideoInfo videoInfo = ( Sdl.SDL_VideoInfo ) Marshal.PtrToStructure( videoInfoPtr, typeof( Sdl.SDL_VideoInfo ));

            int red = Sdl.SDL_MapRGB( videoInfo.vfmt, 255, 0, 0 );
            Sdl.SDL_Rect rect = new Sdl.SDL_Rect(( short ) pos, ( short ) pos, 20, 20 );
            Sdl.SDL_FillRect( m_SdlSurface, ref rect, red );

            Sdl.SDL_UpdateRect( m_SdlSurface, 0, 0, m_SdlPanel.Size.Width, m_SdlPanel.Size.Height );

            pos += 10;
        }

        private void CreateSdlWindow()
        {
            // Initialize SDL
            Sdl.SDL_Init( Sdl.SDL_INIT_VIDEO );
            m_SdlSurface = Sdl.SDL_SetVideoMode( m_SdlPanel.Size.Width, m_SdlPanel.Size.Height, 32, Sdl.SDL_HWSURFACE | Sdl.SDL_NOFRAME );

            // Retrieve the Handle to the SDL Window
            Sdl.SDL_SysWMinfo_Windows wmInfo;
            Sdl.SDL_GetWMInfo( out wmInfo );
            m_SdlWindowHandle = new IntPtr( wmInfo.window );

            // Set the Window Position to 0/0
            SetWindowPos( m_SdlWindowHandle, this.Handle, 0, 0, 0, 0, ( SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_SHOWWINDOW ));

            // Make the SDL Window the child of our Panel
            SetParent( m_SdlWindowHandle, m_SdlPanel.Handle );
            ShowWindow( m_SdlWindowHandle, ShowWindowCommand.SW_SHOWNORMAL );
        }
    } 
}

Grüsse, Egon
private Nachricht | Beiträge des Benutzers
SGT_BOB
myCSharp.de - Member



Dabei seit:
Beiträge: 125
Herkunft: Aachen

beantworten | zitieren | melden

Hi.

Vielleicht ein wenig spät, aber das sollte eine einfachere Lösung sein:

SDL SurfaceControl

CU

SGT_BOB
*************************
Ich bin root, ich darf das...
root>_
*************************
private Nachricht | Beiträge des Benutzers