Form1上に貼り付けたUsercontrol1上に描画したいです。Form1のクラスから、標準モジュールに記述した関数を呼び出して描画させたいのですが、クラスの使い方が間違っているのでしょうか?
コードを下に記します。これを実行するとフォームは表示されるのですが、ユーザコントロール上の描画ができません。スタートアップはSub Mainです。
よろしくお願いします。
〜フォームの記述〜
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Call disp()
End Sub
End class
〜標準モジュールでの記述〜
Module Module1
Public C As UserControl1
Public F As Form1
Public Sub Main()
F = New Form1
C = New UserControl1
F.ShowDialog()
End Sub
Public Sub disp()
Dim Graph As Graphics = C.CreateGraphics
Dim P As Pen = New Pen(Color.Red)
Graph.DrawLine(P, 10, 10, 50, 50)
End Sub
End Module
これだとUserControl1がForm1上に乗っかってませんので、
そのUserControl1には描画されているけど見えないという状態になっています。
>Public Sub Main()
> F = New Form1
> C = New UserControl1
F.Controls.Add(C)
> F.ShowDialog()
>End Sub
というふうにする必要があるかと思います。
でも、UserControl1への描画はUserControl1のPaintイベントに
書いた方がよいと思いますけど。
よねKENさん、ありがとうございました。
教えていただいた通りに『F.Controls.Add(C)』して、必要なパラメータを設定したら描画できました。
『ユーザコントロールの追加』でソリューションエクスプローラ上に追加して、Form1デザインのForm1上にツールボックスのUserControl1のオブジェクトを貼り付けていたのでてっきり『F.Controls.Add(C)』は不必要だと思っていました。
「UserControl1への描画はUserControl1のPaintイベントに・・・」と助言いただきましたが、そのほうが一般的なのでしょうか?考え直してみます。
> 貼り付けていたのでてっきり『F.Controls.Add(C)』は不必要だと思っていました。
開発環境上から貼り付けているのですね。コードを見て貼り付けてないのだと思いました。
であれば、
>Public Sub Main()
> F = New Form1
> C = New UserControl1
この行を
C = F.UserControl1
とするだけでOKでは?
> F.ShowDialog()
>End Sub
元の
C = New UserControl1
というコードだと貼り付けたユーザコントロールとは別のインスタンスを
生成しているため、貼り付けたものとはまったくの別物を操作しようとしている
コードになっています。
>この行を
>C = F.UserControl1
>とするだけでOKでは?
OKでした。ご丁寧にありがとうございます。
この考えでいくとソリューションエクスプローラに表示されているモジュールはオブジェクトなのでしょうか?それともクラスなのでしょうか?
Public Sub Main()
F = New Form1
C = Form1.UserControl1
Form1.ShowDialog()
End Sub
と記述すると『Form1.UserControl1』が「非共有メンバを参照するには、オブジェクト参照が必要です。」のコードエラーが出てしまいます。Form1はエクスプローラ上に存在しています。
ツイート | ![]() |