Änderungen an WinForms ?

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Andy.

    Änderungen an WinForms ?

    Hallo, ich würde gerne in Erfahrung bringen, ob es an den Winforms von seitens Blizzard Änderungen gegeben hat. Ich benutzte derzeit folgenden Code

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace NetGLSampel
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public NetGL.OpenGL gl { get; set; }
    15. public bool run { get; set; }
    16. public float Rotation { get; set; }
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. this.DoubleBuffered = true;
    21. this.SetStyle(
    22. System.Windows.Forms.ControlStyles.UserPaint |
    23. System.Windows.Forms.ControlStyles.AllPaintingInWmPaint |
    24. System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer,
    25. true);
    26. }
    27. private void Form1_Load(object sender, EventArgs e)
    28. {
    29. }
    30. private void Form1_Shown(object sender, EventArgs e)
    31. {
    32. this.gl = new NetGL.OpenGL();
    33. gl.Initial(this.Handle);
    34. System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(TheLoop));
    35. thread.Start();
    36. }
    37. public void TheLoop()
    38. {
    39. while(this.Visible)
    40. {
    41. gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
    42. gl.ClearColor(0f, 0f, 0f, 0f);
    43. gl.MatrixMode(NetGL.OpenGL.Projection);
    44. gl.LoadIdentity();
    45. gl.Translate(0f, 0f, -1.0f);
    46. gl.Scale(0.5f, 0.5f, 0.5f);
    47. gl.Begin(NetGL.OpenGL.Polygon);
    48. gl.Color3f(Color.Red.R, Color.Red.G, Color.Red.B);
    49. gl.Vertex3f(-1f, -1f, 0f);
    50. gl.Color3f(Color.Blue.R, Color.Blue.G, Color.Blue.B);
    51. gl.Vertex3f(1f, -1f, 0f);
    52. gl.Color3f(Color.Green.R, Color.Green.G, Color.Green.B);
    53. gl.Vertex3f(0f, 1f, 0f);
    54. gl.End();
    55. gl.Flush();
    56. }
    57. }
    58. }
    59. }

    den ich noch von damals habe, welcher auch funktioniert hat. Allerdings funktioniert es nicht bzw. es wird nichts gerender oder was ich vermute von Seiten Winforms über das gerenderte gerendert, so das es im Hintergrund liegt.


    was Interessant zu sagen ist, dasss dieser Code mit einem Timer funktioniert

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace NetGLSampel
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public NetGL.OpenGL gl { get; set; }
    15. public bool run { get; set; }
    16. public float Rotation { get; set; }
    17. public Form1()
    18. {
    19. InitializeComponent();
    20. this.DoubleBuffered = true;
    21. }
    22. private void Form1_Load(object sender, EventArgs e)
    23. {
    24. }
    25. private void Form1_Shown(object sender, EventArgs e)
    26. {
    27. this.gl = new NetGL.OpenGL();
    28. gl.Initial(this.Handle);
    29. this.timer1.Start();
    30. }
    31. private void timer1_Tick(object sender, EventArgs e)
    32. {
    33. gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
    34. gl.ClearColor(0f, 0f, 0f, 0f);
    35. gl.MatrixMode(NetGL.OpenGL.Projection);
    36. gl.LoadIdentity();
    37. gl.Translate(0f, 0f, -1.0f);
    38. gl.Scale(0.5f, 0.5f, 0.5f);
    39. gl.Begin(NetGL.OpenGL.Polygon);
    40. gl.Color3f(Color.Red.R, Color.Red.G, Color.Red.B);
    41. gl.Vertex3f(-1f, -1f, 0f);
    42. gl.Color3f(Color.Blue.R, Color.Blue.G, Color.Blue.B);
    43. gl.Vertex3f(1f, -1f, 0f);
    44. gl.Color3f(Color.Green.R, Color.Green.G, Color.Green.B);
    45. gl.Vertex3f(0f, 1f, 0f);
    46. gl.End();
    47. gl.Flush();
    48. }
    49. }
    50. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Andy“ ()

    Ok, ich hab das nun wie folg umgesetzt

    C-Quellcode

    1. System::Windows::Forms::NativeWindow^ NetGL::OpenGL::Initial(System::Windows::Forms::Form^ form)
    2. {
    3. System::Windows::Forms::NativeWindow^ window = gcnew System::Windows::Forms::NativeWindow;
    4. System::Windows::Forms::CreateParams^ params = gcnew System::Windows::Forms::CreateParams;
    5. params->X = 0;
    6. params->Y = 0;
    7. params->Width = form->Width;
    8. params->Height = form->Height;
    9. params->Parent = form->Handle;
    10. params->Style = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
    11. window->CreateHandle(params);
    12. GraphicDevice = GetDC((HWND)window->Handle.ToPointer());
    13. PIXELFORMATDESCRIPTOR desc;
    14. int Pixelformat = ChoosePixelFormat(GraphicDevice, &desc);
    15. SetPixelFormat(GraphicDevice, Pixelformat, &desc);
    16. HGLRC hrc = wglCreateContext(GraphicDevice);
    17. wglMakeCurrent(GraphicDevice, hrc);
    18. // Sets the Graphic Device
    19. this->ContexArray = new std::vector<HGLRC>();
    20. this->ContexArray->push_back(hrc);
    21. // Initial Extentions
    22. InitialExt();
    23. return window;
    24. }


    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace NetGLSampel
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public NetGL.OpenGL gl { get; set; }
    15. public bool run { get; set; }
    16. public float Rotation { get; set; }
    17. private NativeWindow window;
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. this.DoubleBuffered = true;
    22. }
    23. private void Form1_Load(object sender, EventArgs e)
    24. {
    25. }
    26. private void Form1_Shown(object sender, EventArgs e)
    27. {
    28. this.gl = new NetGL.OpenGL();
    29. window = gl.Initial(this);
    30. //this.timer1.Start();
    31. //System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Render));
    32. //thread.Start();
    33. Render();
    34. }
    35. public void Render()
    36. {
    37. while(true)
    38. {
    39. this.Rotation += 1f;
    40. gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
    41. gl.LoadIdentity();
    42. gl.ClearColor(0f, 0f, 0f, 0f);
    43. gl.MatrixMode(NetGL.OpenGL.Projection);
    44. gl.LoadIdentity();
    45. gl.Translate(0f, 0f, -1.0f);
    46. gl.Rotate(Rotation, 0.0f, 1.0f, 0.0f);
    47. gl.Scale(0.5f, 0.5f, 0.5f);
    48. gl.Begin(NetGL.OpenGL.Polygon);
    49. gl.Color3f(Color.Red.R, Color.Red.G, Color.Red.B);
    50. gl.Vertex3f(-1f, -1f, 0f);
    51. gl.Color3f(Color.Blue.R, Color.Blue.G, Color.Blue.B);
    52. gl.Vertex3f(1f, -1f, 0f);
    53. gl.Color3f(Color.Green.R, Color.Green.G, Color.Green.B);
    54. gl.Vertex3f(0f, 1f, 0f);
    55. gl.End();
    56. gl.Flush();
    57. }
    58. }
    59. private void timer1_Tick(object sender, EventArgs e)
    60. {
    61. this.Rotation += 1f;
    62. gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
    63. gl.LoadIdentity();
    64. gl.ClearColor(0f, 0f, 0f, 0f);
    65. gl.MatrixMode(NetGL.OpenGL.Projection);
    66. gl.LoadIdentity();
    67. gl.Translate(0f, 0f, -1.0f);
    68. gl.Rotate(Rotation, 0.0f, 1.0f, 0.0f);
    69. gl.Scale(0.5f, 0.5f, 0.5f);
    70. gl.Begin(NetGL.OpenGL.Polygon);
    71. gl.Color3f(Color.Red.R, Color.Red.G, Color.Red.B);
    72. gl.Vertex3f(-1f, -1f, 0f);
    73. gl.Color3f(Color.Blue.R, Color.Blue.G, Color.Blue.B);
    74. gl.Vertex3f(1f, -1f, 0f);
    75. gl.Color3f(Color.Green.R, Color.Green.G, Color.Green.B);
    76. gl.Vertex3f(0f, 1f, 0f);
    77. gl.End();
    78. gl.Flush();
    79. }
    80. }
    81. }


    Das Funktioniert soweit ganz gut, kein flackern, es wird gerendert etc. Allerdings wird das Dreieck nicht gerendert wenn ich das ganze von dem Thread mache, da ist dann einfach das Window Schwarz. Ich denke mal das ich das Irgrendwie Invoken muss. Bzw es gab mal eine Variable, die Crossthread aufrufe ignoriert.
    ich versteh nix von OpenGL, aber wies aussieht, funzt das eben nicht, wenns im NebenThread geschieht.
    Das ist jedenfalls ein wesentlicher Unterschied deines ersten Snippets zum Snippet mit dem Timer - der Timer nämlich läuft im MainThread.
    Lass ihn da laufen, weil ein ständiges Invoken frisst auch nur Resourcen, und intern macht der Timer auch nix anneres: Intern tickt darin ein asynchroner Timer, und das Event wird dann invoked.



    Andy schrieb:

    Bzw es gab mal eine Variable, die Crossthread aufrufe ignoriert.
    Ich fürchte, die gibts immer noch.
    Nur man sagt, dass eine Anwendung dadurch instabil wird.
    Aber vielleicht gilt das bei einer OpenGL-Anwendung ja nicht.

    ObjectBrowser schrieb:

    Public Shared Property CheckForIllegalCrossThreadCalls As Boolean
    Member of System.Windows.Forms.Control
    Summary:
    Gets or sets a value indicating whether to catch calls on the wrong thread that access a control's System.Windows.Forms.Control.Handle property when an application is being debugged.

    Return Values:
    true if calls on the wrong thread are caught; otherwise, false.

    Aber vielleicht doch.
    Könnte mir vorstellen, wenn das darstellende Fenster vergrössert wird, während der NebenThread drin rummalt, dass da unvorhergesehene Zustände auftreten.



    hmm.
    Andererseits haste gesagt, früher habe das so gefunzt mittm ersten Snippet.
    Ich weiss jdfs. nix davon, dass WinForms da iwas geändert hätte.
    habe mich nochmal Informiert, OpenGL kann pro Thread nur 1 render contex haben, was bedeutet, dass man den contex den man erstellt mit wglMakeCurrent() dem neuem thread zuweisen muss. Ich poste mal den Code wie das ganze funktioniert

    C-Quellcode

    1. void NetGL::OpenGL::MakeCurrent()
    2. {
    3. HGLRC hrc = wglCreateContext(GraphicDevice);
    4. wglMakeCurrent(GraphicDevice, hrc);
    5. }


    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.ComponentModel;
    4. using System.Data;
    5. using System.Drawing;
    6. using System.Linq;
    7. using System.Text;
    8. using System.Threading.Tasks;
    9. using System.Windows.Forms;
    10. namespace NetGLSampel
    11. {
    12. public partial class Form1 : Form
    13. {
    14. public NetGL.OpenGL gl { get; set; }
    15. public bool run { get; set; }
    16. public float Rotation { get; set; }
    17. private NativeWindow window;
    18. public Form1()
    19. {
    20. InitializeComponent();
    21. }
    22. private void Form1_Load(object sender, EventArgs e)
    23. {
    24. }
    25. private void Form1_Shown(object sender, EventArgs e)
    26. {
    27. gl = new NetGL.OpenGL();
    28. gl.Initial(this);
    29. System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(theLoop));
    30. thread.Start();
    31. }
    32. public void Render()
    33. {
    34. this.Rotation += 1f;
    35. gl.Clear(NetGL.OpenGL.ColorBufferBit | NetGL.OpenGL.DepthBufferBit);
    36. gl.LoadIdentity();
    37. gl.ClearColor(0f, 0f, 0f, 0f);
    38. gl.MatrixMode(NetGL.OpenGL.Projection);
    39. gl.LoadIdentity();
    40. gl.Translate(0f, 0f, -1.0f);
    41. gl.Rotate(Rotation, 0.0f, 1.0f, 0.0f);
    42. gl.Scale(0.5f, 0.5f, 0.5f);
    43. gl.Begin(NetGL.OpenGL.Polygon);
    44. gl.Color3f(Color.Red.R, Color.Red.G, Color.Red.B);
    45. gl.Vertex3f(-1f, -1f, 0f);
    46. gl.Color3f(Color.Blue.R, Color.Blue.G, Color.Blue.B);
    47. gl.Vertex3f(1f, -1f, 0f);
    48. gl.Color3f(Color.Green.R, Color.Green.G, Color.Green.B);
    49. gl.Vertex3f(0f, 1f, 0f);
    50. gl.End();
    51. gl.Flush();
    52. }
    53. public void theLoop()
    54. {
    55. gl.MakeCurrent();
    56. while (true)
    57. {
    58. this.Render();
    59. System.Threading.Thread.Sleep(100);
    60. }
    61. }
    62. }
    63. }