• 締切済み

ユーザーコントロールのDrawToBitmap

vb.net(VisualStudio2015)で作成したユーザーコントロール内の画面を「DrawToBitmap」で取得しフォーム内に表示したいのですが上手く表示できません。もしご存知の方がいましたらご教授して頂けますと助かります。宜しくお願い致します。 Private SecondScreen as New UserControl1 'ユーザーコントロール内の画面を取得 Dim mBitmap as New Bitmap(SecondScreen.Width,SecondScreen.Height) SecondScreen.DrawToBitmap(mBitmap,New Rectangle(0,0,SecondScreen.Width,SecondScreen.Height)) . . . '取得した画面をフォームに表示 Dim g as Graphics = e.Graphics g.DrawImage(mBitmap,new Rectangle(0,0,SecondScreen.Width,SecondScreen.Height)) いくつか省略箇所がありますが、上記の方法ですとユーザーコントロール内の画面が取得できなく、「SecondScreen.Visible=True」で一度表示させてから取得すると表示されます。 フォーム内にユーザーコントロールを張り付けて表示させるのではなく、一度「DrawToBitmap」で取得させてから表示させたいのです。 お手数ですが、ご教授お待ちしています。 宜しくお願い致します。

みんなの回答

  • oboroxx
  • ベストアンサー率40% (317/792)
回答No.1

おそらくですが、VisibleがFalseだとユーザコントロールのPaintメソッドが走らないのかなと思うので、ユーザコントロールの上に何かしらのコントロールをかぶせて見えなくしておいてVisibleをTrueにして、そこで画面を取得するのはどうでしょうか。

関連するQ&A

  • ★他アプリの画面一部をコピー表示したい

    お世話になります。 さて図のように「アプリX」があって、 その画面の一部を自作ソフト「Me」画面に表示したいのです。 (WindowsでVBで作成中) いろいろ調べると、 http://dobon.net/vb/dotnet/graphics/invokepaint.html に以下のようなプログラムがありました。 'コントロールの外観を描画するBitmapの作成 Dim bmp As New Bitmap(Me.Width, Me.Height) 'キャプチャする Me.DrawToBitmap(bmp, New Rectangle(0, 0, Me.Width, Me.Height)) 'ファイルに保存する bmp.Save("C:\test\1.png") '後始末 bmp.Dispose() しかしこれはMe自身の画面であって、意味がありません。 それにファイルで保存ではなくMeに表示したいのです。 (これは多分できると思います) 最大の問題は、「アプリX」の“フォーム名”です。 http://dobon.net/vb/dotnet/form/showintaskbar.html には、「タスクバーにフォームを表示しないようにする」として、 (これもやりたいことの一つですが) 'Form1のインスタンスを作成 Dim f As New Form1() 'タスクバーに表示しない f.ShowInTaskbar = False 'フォームを表示する f.Show() とありますが、「Form1」をどうやって取得するのか書いていません。 つまり「アプリX」のフォーム名が分からないのです。 それをどうやって知ることができるでしょうか? それとも考え方が根本的におかしい? よろしくお願い申し上げます m(__)m

  • フォームに描画して表示をスクロールしたい

    非.NETユーザーだったのですが、.NETを勉強しています。 フォーム上に描画を行いたいのですが、下のモジュールを入力して、 実行した場合○と□が描画されます。 しかし、フォームの大きさ以上の描画をした場合に、表示しきれないので スクロールバーを表示したいと思っています。 HScrollBarをフォームに貼り付けてBottomに移動した後、 実行した所、描画は行われるのですがスクロールバーが効きません。 なんらかのプロパティを変更しなければならないのでしょうか。 それとも、この場合根本的にHScrollBarコントロールを使用できないの でしょうか。 Private Sub cmd描画_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmd描画.Click Dim g As Graphics Dim p As Pen Dim b As SolidBrush Dim r1, r2, r3 As Rectangle g = Me.CreateGraphics p = New Pen(Color.Red) b = New SolidBrush(Color.Blue) r1 = New Rectangle(10, 10, 50, 50) g.DrawEllipse(p, r1) r2 = New Rectangle(70, 70, 50, 50) g.FillRectangle(b, r2) r3 = New Rectangle(500, 10, 50, 50) g.DrawEllipse(p, r3) End Sub よろしくお願い申し上げます。

  • 画像転送(ワールド変換行列)について

    Dim g As Graphics = PictureBox1.CreateGraphics() Dim img As Image = Image.FromFile("○○.jpg") For i = 1 To 10 g.TranslateTransform(+10, 0) g.DrawImage(img, New Rectangle(0, 0, img.Width, img.Height)) Next i 上記のような感じで画像を左から右へとスムーズに 動かしたいのですが、移動毎の残像が残ってしまいます。 毎回Refreshするとちらつきが出てしまいますし……。 どうしたら残像が残らず画像を移動出来るでしょうか。

  • C# ユーザコントロール内のボタン押下を親で知る

    こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか? ---------------------------------------------------------------------- [Form1.cs] void Inform_UserControlButton1Click() { //親が持っている変数を使って処理を行いたい } void Form1_Load(....) { //ユーザコントロールを設置 UserControl1 ctrl = new UserControl1(); this.Controls.Add(ctrl);   //ユーザコントロール内のbutton1を見つける List<Control> ctrl = new List<Control>(cps.Controls.Find("button1", false)); //Form1が持っている変数を使う為の関数を通るようにしたい (Button)ctrl[0].Click += new System.EventHandler(Inform_UserControlButton1Click); //←エラー } ---------------------------------------------------------------------- [UserControl.cs] button1が配置されています。 ---------------------------------------------------------------------- こんな感じにしてできないかなー?と思っていたのですが、//←エラーのところで、 イベント 'System.Windows.Forms.Control.Click' は += または -= の左側にのみ表示されます。 となってしまい上手くいきません。 どのようにすればよいでしょうか?

  • ユーザーコントロール(OCX)のオブジェクト名

    2点わからない点がありますのでよろしくお願いします。 (1)ユーザーコントロールのオブジェクト名を引数として使用したいのですが エラーが発生し困っています。どのようにしたらいいのでしょうか? ユーザ-コントロールのオブジェクト名:UserControl1 ☆でエラーが発生する「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 ※関数aはDLLとなっておりどうしてもオブジェクト型で渡さなければなりません。 Private Sub Command1_Click() Call a(Me) End Sub ===DLL関数:a=== オブジェクト名とボタン名をINIファイルに書き込む処理 =========== Private Sub a(prmObj As Object) Dim strMsg As String strMsg = prmObj.Name ・・・☆ : : : End Sub (2)String型からObject型に変換するのは可能でしょうか? INIファイルから"UserControl1.Command.Enable = False"というString型のデータを読込み、 ボタンを有効・無効設定するという事が処理がしたいのですが何かいい方法がありましたら教えてください。 Private Sub UserControl_Initialize() Dim a As Object Dim b as String 'INIファイルから取得 Dim c as String       'INIファイルから取得 b = "UserControl1.Command1" c = "False"   Set a = Me.Controls(b) If c = "False" then a.Enable = False else a.Enable = True End If End Sub

  • ユーザー定義オブジェクト

    現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //thisで参照するオブジェクトの初期化法に注目   function Rectangle(w,h) { this.width=w; this.height=h; } //コンストラクタを呼び出して2つの長方形オブジェクトを生成する。 //widthとheightをコンストラクタに渡して、それぞれの新しい //オブジェクトを適切な形で初期化するやり方に注目 var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); ★質問★ this.width=w; this.height=h; var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); この2箇所で行っている「初期化」という作業の意味がよく分かりません。 また、ユーザー定義オブジェクトの概念についていまいちイメージ がつかめていません(特にthisとnewを使用している意図など) ご教授いただきたく、よろしくお願いします。

  • Rectangle(Bitmap)の幅と高さ

     以下、VBの記法で書きます。Windows10,.NETのGDI+を使用しています。  今まであまり気にしていなかったのですが、今回LockBitsとUnLockBitsを使用してBitmapのpixel情報をCopyするコードを書く事になり、急に気になり出しました。  LockBitsを使用する際、Rectangle構造体で読みだすBitmapの範囲を指定します。Rectangleが指定する実際のpixelですが、   (Rectangle.Left + Rectangle.Width - 1)×(Rectangle.Top + Rectangle.Height - 1) の範囲かな?、と思いました。例えば、   Dim Rect as Rectangle = New Rectangle(1, 1, 0, 0) などとやると、Rectは空になるし、(1, 1)一点を表すRectangleなら、   Dim Rect as Rectangle = New Rectangle(1, 1, 1, 1) なので・・・。  BitmapのWidthとHeightについても同様かと思います。実際の動作には余り影響しないのですが、気になったもので・・・。

  • VB.NETのグラフィック描画で困っています

    VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • 動的コントロールができない

    フォームをロードしたときに ラベルを動的に貼り付けたいんですが、 Controls.Addの部分でエラーが出てしまって 手が付けれません。 どなたかお助けください。 Dim i As Integer Dim l_week As Label For i = 1 To 6 Set l_week = PN_HEAD.Controls.Add("VB.label", "label" & i) With l_week .Width = CInt(Math.Round(PN_HEAD.Width / 7)) .Height = CInt(Math.Round(PN_HEAD.Height)) .Left = (i Mod 7) * .Width .Top = 0 .Caption = aWeekDayName(i) .Alignment = ContentAlignment.MiddleCenter .Visible = True End With Next

  • 実行時に、フォームを印刷

    WindowsXP, vb.net2005で開発しております。 プログラム実行時にフォームを印刷したいと考えております。 フォーム上には下記の3種類のコントロールが貼り付けてあります。  ラベル、  picturebox(イメージを表示)、  panel(バーコードを表示) 印刷はPrintDocumentを使用しています。 フォームをキャプチャーし、画像を印刷するようにしています。 印刷を行うと、必ずpictureboxの画像が最前面に表示されてしまいます。 フォームに指定した重なり順のまま印刷するにはどうすればよいのでしょうか? 以下、PrintDocument のPrintPageのソースです。 Private Sub pd_PrintPage(  ByVal sender As System.Object,  ByVal e As System.Drawing.Printing.PrintPageEventArgs)  Handles pd.PrintPage  'コントロールの外観を描画するBitmapの作成  Dim bmp As New Bitmap(Me.Size.Width, Me.Size.Height)  'キャプチャする  Me.DrawToBitmap(bmp,          New Rectangle(0, 0, Me.Size.Width,          Me.Size.Height))  '画像を描画する  e.Graphics.DrawImage(bmp, 0, 0, e.PageBounds.Width,            e.PageBounds.Height)  '後始末  bmp.Dispose()  '次のページがないことを通知する  e.HasMorePages = False End Sub

専門家に質問してみよう