トップページ > 記事閲覧
SetDrawArea()について
名前:Kazu 日時: 2015/04/18 22:41

C#でDXライブラリを使おうとしています。 目的はゲームでは無く、要素が非常に多いグラフのリアルタイム表示です(たとえば過去10年分の株価推移などのチャートなど)。 グラフ表示はWindowフォームに行い、フォームサイズは随時ユーザーによって変更されます。 ですので、グラフの描画領域もフォームのサイズに合わせて変化させようとしていますが、どうもDxLib_Init()時点の初期化された描画サイズ以上には拡張できないようで困っています。 下記のようなソースで試しています。 public Form1() { InitializeComponent(); // DXライブラリの描画ハンドルを本フォームにする DX.SetUserWindow(this.Handle); // 描画先画面を裏にする DX.SetDrawScreen(DX.DX_SCREEN_BACK); // ウインドウモードに変更 DX.ChangeWindowMode(DX.TRUE); DX.SetDrawScreen(0); // 画面の背景色を白にする DX.SetBackgroundColor(255, 255, 255); // DXライブラリの初期化処理 if (DX.DxLib_Init() == -1) { Application.Exit(); } } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 描画可能領域のセット(これがうまくいかない…) DX.SetDrawArea(0, 0, ClientSize.Width, ClientSize.Height); // 裏画面を初期化 DX.ClearDrawScreen(); // 以後描画処理 ・・・・ } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { DX.DxLib_End(); } それでVC++のライブラリソースを見てみたところ、DxLib_Init()でハンドルとしてわたってきているフォームのクライアント領域を描画対象にしたあとは、その範囲内でしか描画できないように読めました(DxWindow.cppを見ました)。 フォームのサイズに合わせて、リアルタイムに描画領域を変化させるようなことは無理でしょうか?
メンテ

Page: 1 |

Re: SetDrawArea()について ( No.1 )
名前:管理人 日時:2015/04/19 00:09

私もどこでDXライブラリ側画面の解像度を決定しているのか失念していたので調べてみたら SetUserWindow の中で引数として渡されたウインドウのクライアント領域の幅と高さを SetGraphMode に渡して変更していました 恐らくですが、SetUserWindow を実行してから DxLib_Init を呼ぶまでの間に SetGraphMode( 1024, 768, 32 ) ; など、必要なサイズを SetGraphMode で指定すれば SetUserWindow で渡したウインドウのクライアント領域よりも広い範囲に描画できるように なると思います よろしければお試しください m(_ _)m
メンテ
Re: SetDrawArea()について ( No.2 )
名前:Kazu 日時:2015/04/19 08:24

なるほど、初期化前に必要な描画領域の指定を済ませておくということですね。 DX.DxLib_Init() する前に、下記のコードを入れてみました。 DX.SetGraphMode(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, Screen.PrimaryScreen.BitsPerPixel); 問題なく動作しているようです。ありがとうございました。 私はプライマリのモニターにしか描画しないのでいいのですが、 セカンダリとかにも拡張が必要なら、Screen.AllScreensプロパティですべての解像度を 取得して適切に設定しないといけないですね。 またスクリーンサイズや色深度は動的にユーザーが 変えてしまうかもしれませんが、私の用途ではそこ まで考慮しなくてもいいので無視しています。 とりあえずお教えいただいた方法で先に進めます。 ありがとうございました。
メンテ
Re: SetDrawArea()について ( No.3 )
名前:Kazu(解決) 日時:2015/04/20 11:26

描画はうまくいくようになったのですが・・・ SetDrawScreen(DX.DX_SCREEN_BACK); を行って、裏画面描画&表示するようにしていたので すが、何故か描画でちらつきが発生してしまいました。 どうやらSetUserWindowでフォームのハンドルを渡すと、 フォームの再描画イベント時にちらついてしまうよう です。 これは再描画イベントハンドラ内で、フォーム(と他 のコントロール)の再描画と、DXライブラリによる描 画処理を行った場合に起きるようです。 (そもそも私が手抜きで、再描画イベント内で重た目 のDXライブラリによる描画を行ったのがいけないのですが)。 そこでユーザーアクションに対して、フォームの再描 画イベントを投げるのではなく、DXライブラリを使っ た再描画処理だけを呼び出すようにすればちらつきま せんでした。 フォームのリサイズ時だけはどうしても再描画イベン ト処理とDXライブラリによる描画も行わないといけな かったのでちらつきますが、私的には許容範囲内でし たので、無視しています。 とりあえず私の用途上の問題はクリアになったので、 解決とさせていただきます。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存