ページ 11

フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月26日(水) 20:51
by Mokutsuno
visualstudo2015とC#を使ってフォームアプリケーションを作っているのですが、
PanelやPictureBox上をDXライブラリの描画先にしたいと思っているのですが、どうすればできますか?
現在は、
DX.SetUserWindow(this.Handle);
を用いてフォームのウィンドウを描画先にしています。そこで、
DX.SetUserWindow(panel1.Handle);

DX.SetUserWindow(pictureBox1.Handle);
でPanel,PictureBoxを描画先にできるかと思ったのですが、デバッグを開始すると、ウィンドウも表示されずに、
すぐに終了してしまいます。尚、エラーは出ていません。
どうすればよいのでしょうか?
C#は学び始めたばかりです。

Form1.cs

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DxLibDLL;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        //public Point btnClientCurPos;
        IK ik = new IK();
        public Form1()
        {
            IK ik = new IK();
            InitializeComponent();
            DX.SetUserWindow(pictureBox2.Handle); //DxLibの親ウインドウをこのフォームウインドウにセット
            DX.DxLib_Init();
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);
            
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();
        }


        public void MainLoop()
        {
            DX.ClearDrawScreen();
            ik.Draw();
            DX.ScreenFlip();
            ik.btnClientCurPos = this.PointToClient(Cursor.Position);
            label1.Text = ik.btnClientCurPos.ToString();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

    }
}


Program.cs

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();
            form.Show();
            


            while (form.Created) //Application.Runしないで自分でループを作る
            {
                form.MainLoop();
                Application.DoEvents(); //←必要
            }
        }
    }
}

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月26日(水) 21:16
by あんどーなつ
DirectXには詳しくないけど、.netはやっているので、なんとなく想像です。

void pictureBox_Clicked(... sender, ... e) {
pictureBox->Invalidate();
}
をつくって、ピクチャーボックスをクリックすると描画されるんじゃないかと思います。

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月26日(水) 21:19
by あんどーなつ
ごめんなさい。ウィンドウが表示されずに終了したんですよね。自分の考えは間違いでした。

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月26日(水) 21:34
by あんどーなつ
うーん、ソースコードの中のDxLibDLLって、たぶんMicrosoftのライブラリじゃないですよね。
DxLibで検索しても、DxLib_Init関数とかはあったけど、SetUserWindowはないみたいですし・・・

ライブラリの提供元を教えていただけますか?

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月26日(水) 21:49
by あんどーなつ
DXライブラリのC#用パッケージ内、DxDLL.defの中に

dx_SetUserWindow
dx_SetUserChildWindow

という行を見つけました。PictureBox等のコントロールでは、SetUserWindowのかわりにSetUserChildWindowを
使うのではないでしょうか?

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 10:13
by C6b14
突然お邪魔します。C# なので DxLibDotNet.dll の参照設定を削除して ソースファイル DxDLL.cs を 加えて Debugしてみるとポインターで64ビット判定のあとdx_SetUserWindow関数に入り5~8回同じところをループして落ちます。普通に考えてPictureBoxのイベント、プロパティ、メソッドの(数百個はあるはず)どれかと衝突するでしょう。ここは 素直にForm2をつくってDxLibにハンドルをわたしPictureBoxのようなFormにすれば 簡単にできました。

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 10:44
by あんどーなつ
C6b14さん

ご回答どうもありがとうございます。
もしよろしければでいいのですが、DXライブラリをC#でプログラムするときのソース(書籍、URL...)を
紹介していただけるとうれしいです。よろしくお願いいたします。

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 12:16
by C6b14
ないと思います。C/C++ Win32 コンソール で ここのホームページで 勉強して C# に読み替えるのが 回り道でも 結局一番早く理解できました。C# でも コンソールがいいとおもいます。http://csi.nisinippon.com/VS2015IDE/v01.html

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 12:47
by C6b14
あ! 失礼しました。間違えました Siv3D と勘違い ここは Win32 Windows プログラムでhttp://cswin10.nisinippon.com/cs/cs1/vs ... b/d01.htmlした。
設定が違います。

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 13:06
by あんどーなつ
おっ、ありがとうございます。
言ってみるものです (^o^)¥

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 14:00
by C6b14
自分がここで勉強してた頃のメモがありました。自分でもよめないようなメモですが。http://powershell-vb-memo.nisinippon.com/DxLiv.html一応C# のことも書いてあるようなので。そのころはVS2008です。DxLib のことをDxLivと間違えています。(^^

Re: フォームアプリケーションのパネルをDXライブラリの描画先にするには?

Posted: 2016年10月27日(木) 19:54
by Mokutsuno
皆様回答ありがとうございます。
とりあえず、回答いただいたdx_SetUserChildWindowで調べたところ、
SetUserWindowでthis.Handleを引数に与え、SetUserChildWindowの引数にPictureBox1.Handleを与えることにより、
ピクチャボックスを描画先にできました。
この方法が一番楽なようなので、これで書かせていただきます。
ありがとうございました