C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Designerの内容を書き換える方法

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■100342 / inTopicNo.1)  Designerの内容を書き換える方法
  
□投稿者/ もんた (10回)-(2022/07/16(Sat) 21:41:13)

分類:[.NET 全般] 

http://bbs.wankuma.com/index.cgi?mode=al2&namber=99642


この質問ページの続きなのですが、
VB.NETを使ってOpenTKのプログラムを書いています。

GlControl1.GraphicsModeのSamplesを変更したいため

GlControl1.GraphicsMode = New GraphicsMode(New ColorFormat(8, 8, 8, 0), 24, 8, 4)

としたのですが、
GraphicsModeはReadOnlyなので、
一度、Destroyしてから再生成するか
生成時に宣言してください、というエラーが出ます。

そのため、Designer上で

Me.GlControl1 = New OpenTK.GLControl()

となっていたところを

Me.GlControl1 = New OpenTK.GLControl(New GraphicsMode(New ColorFormat(8, 8, 8, 0), 24, 8, 4))

と書き換えるとうまく動作することが確認できました。

しかし、一度VSを落として再起動すると、
フォームが開かなくなり、自動で元の

Me.GlControl1 = New OpenTK.GLControl()

に戻ってしまいます。


そのため、
一度GlControl1を消してから再生成しようと

GlControl1.Dispose
Me.GlControl1 = New OpenTK.GLControl(New GraphicsMode(New ColorFormat(8, 8, 8, 0), 24, 8, 4))

としてみたのですが、
GlControl上にうまく画像が表示されません。


仕方なく、Designer上のコードをForm上で実行しようと思い、
Designer上からGlControl1を消した後に
Designerのコードを以下のようにform上にコピーして使用しました。

    Public Sub New()

        InitializeComponent()


        Me.GlControl1 = New OpenTK.GLControl()

        Me.TableLayoutPanel1.Controls.Add(Me.GlControl1, 0, 0)

        '
        'GlControl1
        '
        Me.GlControl1.Anchor = System.Windows.Forms.AnchorStyles.Right
        Me.GlControl1.BackColor = System.Drawing.Color.Black
        Me.GlControl1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
        Me.GlControl1.Location = New System.Drawing.Point(218, 23)
        Me.GlControl1.Margin = New System.Windows.Forms.Padding(1)
        Me.GlControl1.Name = "GlControl1"
        Me.GlControl1.Size = New System.Drawing.Size(360, 360)
        Me.GlControl1.TabIndex = 130
        Me.GlControl1.VSync = False

    End Sub

また、



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Call GlControl1_Load(GlControl1, Nothing)

  End Sub

のようにGlControlの初期化も行いました。

Form生成時にGlControlは表れるのですが
やはり、GlControl上に画像が描画されません。
というかInvalidateしてもPaintが呼ばれていないようです

これはどのようにすればよろしいでしょうか?


引用返信 編集キー/
■100343 / inTopicNo.2)  Re[1]: Designerの内容を書き換える方法
□投稿者/ KOZ (296回)-(2022/07/16(Sat) 22:38:12)
No100342 (もんた さん) に返信
> Me.GlControl1 = New OpenTK.GLControl()
> となっていたところを
> Me.GlControl1 = New OpenTK.GLControl(New GraphicsMode(New ColorFormat(8, 8, 8, 0), 24, 8, 4))
> と書き換えるとうまく動作することが確認できました。

OpenTK.GLControl を継承して新しいコントロールを作るとどうでしょう?

Public Class GlControlEx
    Inherits OpenTK.GLControl

    Public Sub New()
        MyBase.New(New OpenTK.Graphics.GraphicsMode(New OpenTK.Graphics.ColorFormat(8, 8, 8, 0), 24, 8, 4))
    End Sub

End Class

これを貼り付けたらうまくいきませんか? 

引用返信 編集キー/
■100344 / inTopicNo.3)  Re[2]: Designerの内容を書き換える方法
□投稿者/ もんた (11回)-(2022/07/16(Sat) 23:03:13)
これでできました
どうもありがとうございました。

解決済み
引用返信 編集キー/
■100345 / inTopicNo.4)  Re[3]: Designerの内容を書き換える方法
□投稿者/ もんた (12回)-(2022/07/16(Sat) 23:11:40)
やはり、後から設定を変えたい場合もあるので、
一度destroyしてから
再生成する方法も教えていただけないでしょうか?

Raisehandlerみたいなやつで
PaintやMousedownなどを全て登録する必要があるのでしょうか?

引用返信 編集キー/
■100346 / inTopicNo.5)  Re[4]: Designerの内容を書き換える方法
□投稿者/ KOZ (297回)-(2022/07/17(Sun) 00:05:21)
No100345 (もんた さん) に返信
> やはり、後から設定を変えたい場合もあるので、
> 一度destroyしてから
> 再生成する方法も教えていただけないでしょうか?
> Raisehandlerみたいなやつで
> PaintやMousedownなどを全て登録する必要があるのでしょうか?

AddHandler を使ってイベントを関連付けます。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/addhandler-statement
引用返信 編集キー/
■100347 / inTopicNo.6)  Re[5]: Designerの内容を書き換える方法
□投稿者/ KOZ (298回)-(2022/07/17(Sun) 00:50:41)
もしくは WithEvents を使って

Private WithEvents GlControl1 As OpenTK.GLControl

と宣言することで、Handles を使ってイベントを自動的に関連付けすることができます。

Private Sub GlControl1_Load(sender As Object, e As EventArgs) Handles GlControl1.Load
    (略)
End Sub

Private Sub GlControl1_Resize(sender As Object, e As EventArgs) Handles GlControl1.Resize
    (略)
End Sub

Private Sub GlControl1_Paint(sender As Object, e As PaintEventArgs) Handles GlControl1.Paint
    (略)
End Sub

差し替えるときはこんな感じで

If Me.GlControl1 IsNot Nothing Then
    Me.Controls.Remove(Me.GlControl1)
    Me.GlControl1.Dispose()
End If
Me.GlControl1 = New OpenTK.GLControl(new GraphicsMode(..略..))
Me.GlControl1.BackColor = System.Drawing.Color.Black
Me.GlControl1.Location = New System.Drawing.Point(31, 40)
Me.GlControl1.Size = New System.Drawing.Size(437, 309)
Me.GlControl1.VSync = False
Me.Controls.Add(Me.GlControl1)




引用返信 編集キー/
■100348 / inTopicNo.7)  Re[6]: Designerの内容を書き換える方法
□投稿者/ もんた (13回)-(2022/07/17(Sun) 08:44:07)
ありがとうございます。

If Me.GlControl1 IsNot Nothing Then
Me.Controls.Remove(Me.GlControl1)
Me.GlControl1.Dispose()
End If
Me.GlControl1 = New OpenTK.GLControl(new GraphicsMode(..略..))
Me.GlControl1.BackColor = System.Drawing.Color.Black
Me.GlControl1.Location = New System.Drawing.Point(31, 40)
Me.GlControl1.Size = New System.Drawing.Size(437, 309)
Me.GlControl1.VSync = False
Me.Controls.Add(Me.GlControl1)

というコードを使うと特にWith Eventを使う事無く関連付けられることが分かりました。


ところで、一度消滅させてから再生成すると
AnchorやMarginなども設定もリセットされてしまうようです。
そのため、デザイナー側で設定を変更した際に
再生成する時の設定と食い違ってしまう可能性があります。
そのため、消滅させる前に、これらの設定を保存して
再生成時に同じ設定を反映させたいのですが
これは地道に

それぞれの変数を用意しておいて
消滅前にそこにバックアップしておき
再生成後に復元するしかありませんか?

要は一つずつ用意するのが面倒なので
これを一括で行うメソッドは用意されているのでしょうか?

引用返信 編集キー/
■100349 / inTopicNo.8)  Re[7]: Designerの内容を書き換える方法
□投稿者/ KOZ (299回)-(2022/07/17(Sun) 12:27:47)
No100348 (もんた さん) に返信
> 要は一つずつ用意するのが面倒なので
> これを一括で行うメソッドは用意されているのでしょうか?

私が知る限りでは用意されていません。
毎回同じ設定なら、インスタンス生成からプロパティ設定までをひとまとめにして関数化すればいいのでは?
引用返信 編集キー/
■100350 / inTopicNo.9)  Re[8]: Designerの内容を書き換える方法
□投稿者/ もんた (14回)-(2022/07/17(Sun) 15:37:08)
そうですよね
どうもありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ