none
Win32API使用時のPictureBoxの取り扱いについて RRS feed

  • 質問

  • 初めて投稿します。 よろしくお願いします。

    開発環境
    OS: Windows XP SP3
    ツール:Visual Studio 2010
    言語:C++/CLR

    <前提>
    グラフ表示のアプリをフォームアプリケーションで作成しています。

    ここで1枚のグラフにてpictureBoxを3枚重ね、それぞれ下記の様な描画を行っています。

    pictureBox1 : グラフの表示(心電図の様な、時間と共に左方向にスクロールするグラフ)
    pictureBox2 : グラフの枠や目盛り、及びグラフの情報の表示
    pictureBox3 : マウスイベントを用いた垂直,水平のカーソル表示

    またコントロールは下記の用に設定しています。
    this->pictureBox2->Controls->Add(this->pictureBox3);
    this->pictureBox1->Controls->Add(this->pictureBox2);

    pictureBox2,pictureBox3はBackColorをTransparentにし、
    pictureBox1のグラフが見える様にしています。

    pictureBoxと同じ大きさのBMPを作成し、そこからGraphicオブジェクト
    を生成して様々な描画を行わせています。

    この様なグラフを最大10枚、画面上に表示させる必要があります。
    (SplitContainerで分割します。)

    <問題>
    グラフ表示をDrawImageで行わせましたが、かなり重く、10枚
    表示するには実用的ではない事からpictureBox1のグラフ表示
    のみWin32API(BitBltなど)を使う事としました。

    ところが、この様にするとpictureBox2,3の存在が邪魔をして
    pictureBox1に書いたグラフが見えなくなります。
    (pictureBox2,pictureBox3を除くとグラフ表示はされています。)
    透過はしているのですが、PictureBox1のBackColorが表示されるのみ
    です。

    <質問>
    ・この問題を解決する為、どの様な仕組みにすれば良いかアドバイスをお願いします。

    2011年1月17日 5:54

回答

  • グラフ表示をDrawImageで行わせましたが、かなり重く、10枚
    表示するには実用的ではない事からpictureBox1のグラフ表示
    のみWin32API(BitBltなど)を使う事としました。

    BitBlt によって”重い”とされていた問題は解消したのですか?
    問題視していた”重い”が改善しないのなら、今の状態から透過の解決を目指しても、最終的な解決に至らないためです。

    ところが、この様にするとpictureBox2,3の存在が邪魔をして
    pictureBox1に書いたグラフが見えなくなります。
    (pictureBox2,pictureBox3を除くとグラフ表示はされています。)
    透過はしているのですが、PictureBox1のBackColorが表示されるのみ
    です。

    どういったコードを書いているかわかりませんが、Win32API で横から描画するのであれば、自分で工夫が必要なのでは。
    いっそのこと、pictureBox を重ねるのでなく、自分で 1 枚の絵に重ね合わせてから画面に描画すると言うことはいかがでしょうか。
    # AlphaBlend とか使うなり。

    なお、通常時に背景が透過になるのは、pictureBox3 に描くとき、背景部分を pictureBox2 に描いてもらうという処理をしているからです。
    このことを考慮せずに Win32API で pictureBox1 の HDC に書いているのであれば、この背景透過にはなりません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2011年2月2日 7:42
    2011年1月17日 14:15
    モデレータ

すべての返信

  • グラフ表示をDrawImageで行わせましたが、かなり重く、10枚
    表示するには実用的ではない事からpictureBox1のグラフ表示
    のみWin32API(BitBltなど)を使う事としました。

    BitBlt によって”重い”とされていた問題は解消したのですか?
    問題視していた”重い”が改善しないのなら、今の状態から透過の解決を目指しても、最終的な解決に至らないためです。

    ところが、この様にするとpictureBox2,3の存在が邪魔をして
    pictureBox1に書いたグラフが見えなくなります。
    (pictureBox2,pictureBox3を除くとグラフ表示はされています。)
    透過はしているのですが、PictureBox1のBackColorが表示されるのみ
    です。

    どういったコードを書いているかわかりませんが、Win32API で横から描画するのであれば、自分で工夫が必要なのでは。
    いっそのこと、pictureBox を重ねるのでなく、自分で 1 枚の絵に重ね合わせてから画面に描画すると言うことはいかがでしょうか。
    # AlphaBlend とか使うなり。

    なお、通常時に背景が透過になるのは、pictureBox3 に描くとき、背景部分を pictureBox2 に描いてもらうという処理をしているからです。
    このことを考慮せずに Win32API で pictureBox1 の HDC に書いているのであれば、この背景透過にはなりません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク 山本春海 2011年2月2日 7:42
    2011年1月17日 14:15
    モデレータ
  • ご回答ありがとうございました。

    Stopwatchクラスを用いて、描画処理部分の経過時間を調べた結果、
    Win32api : 3~4msec
    .NetFramework : 50~70msec
    となり、劇的に変わりました。

    ”透過”といっても画面が透けるのではなく”同じものを描画して実現している”という事なのですね。
    アドバイスいただいた様に、メモリ上でそれぞれの絵を1枚の絵に重ね合わせてから、pictureBox1のHDCに転送する方式で考えてみます。

     


     

    2011年1月18日 0:16