none
VC++ PictureBox 透過処理 RRS feed

  • 質問

  • 初投稿させていただきます。至らないところがありましたら指摘してください。

    ◆環境
    【OS】Windows XP
    【Visual Studio】Visual C++ Express Edition
    【経験】現在2週間目

    ◆質問までの経緯
    先週、未経験ながらプログラムの仕事に就くことになりました。
    大きな背景画像の上にオブジェクトを重ね配置し1つの背景画像を作成するツールを作成中です。
    そこで、オブジェクトの背景を透過させたいのですが、うまくいきません。
    例)部屋の画像(pictureBox1)の中にテーブルの画像(pictureBox2)を配置し、テーブルの画像の上に重ねて皿(pictureBox3)の画像を配置する。
    色々調べた所、親子関係関係のもの(例で言うとpictureBox1とpictureBox2)は透過処理できるが、兄弟関係のもの(例で言うpictureBox2とpictureBox3)はできないというサイトがありましたが、VC++では仕様で出来ないということでしょうか?
    photoshop等の画像処理ソフトを使えばいいとは思っているのですが、現段階では親子関係のものもうまく透過処理できていないので検証もできず、自分のスキルがないせいでツールが作成できないのか、仕様で作成できないかはっきり上司に言う事ができません。納期が月末なのに・・・。

    ◆質問内容
    1.親子関係の透過処理の方法
    2.兄弟関係の透過処理ができるか否か。

    【親子関係の透過処理の方法】
    親子関係については調べた所下記の2つを使うことまではわかったのですが、透過されません、コードを書く場所を間違えているのでしょうか?
    this->pictureBox2->Parent = pictureBox1;                                                       //コンストラクタコードを追加する所に明記
    this->pictureBox2->BackColor = System::Drawing::Color::Transparent;           //デザインでColorをTransparentに変更

    他に、透過色を指定して透過させる処理があることもわかりましたがGraphicsの使い方がわかりません。
    Bitmap ^ bmp = gcnew Bitmap(pictureBox2->Image);
    bmp->MakeTransparent(Color::FromArgb(255, 0, 255)); //透過色指定 マゼンタ

    【兄弟関係の透過処理ができるか否か】
    3つ以上の画像を重ねて透過することはできますか?
    VC++の仕様でできないのでしょうか?
    できるとすれば親子関係の透過を応用してできますか?

    足りないことや余分なものをコード付きで答えていただけるととても助かります。
    ご回答よろしくお願い致します。

    2009年11月28日 7:51

回答

  • その親子関係のことでしたか。それ自体は一般的な表現です。
    しかし、テラさんが誤解しているため、そのことを指しているとは想像もつきませんでした。
    「テラさんのおっしゃる親子関係と兄弟関係は具体的にコード上にどのような違いがあるのでしょうか?」という質問に答えることができない点も同じ理由です。

    テラさんが念じるだけで親子関係になったり兄弟関係に切り替わったりするわけではありません。
    面倒なので書いてしまうと、pictureBox1~3はいずれも兄弟で、その親はForm(フォーム)クラスです。そうなるようコードが書かれているはずです。

    Visual C++ Express Editionを使用されているとのことですが、これは上司の指示でしょうか? かなり敷居が高い選択をされています。
    • C言語およびC++言語
    • 言語によらないオブジェクト指向の概念
    • .NET Frameworkの使い方
    • 以上を組み合わせて実現されるC++/CLIの特徴
    Visual C++ Express EditionのC++/CLIを使うと言うことは上記を理解して初めてスタートラインに立てます。例えば
    Bitmap ^ bmp = gcnew Bitmap(pictureBox2->Image);
    bmp->MakeTransparent(Color::FromArgb(255, 0, 255)); //透過色指定 マゼンタ
    と書かれていますが、
    • オブジェクトインスタンスの概念
    • クラスの継承関係
    • .NET FrameworkのImageクラスとBitmapクラス
    このいずれかもしくは複数が理解できていないことが伺えます。


    今の方針で、画像を重ね合わせるためにはGraphicsクラスを使うことになるとは思います。
    Photoshopでもよいということは、最終outputはどんな形式でもいいということでしょうか?
    でしたら、画像が重なるようにhtmlを記述してWebブラウザで表示するだけでもいいような。
    • 回答としてマーク テラ 2009年11月28日 17:48
    2009年11月28日 11:13
  • しかし、この回答はVBやVC#での回答なのでVC++でもできないか知りたい(検証したい)と思って投稿いたしました。
    VB.NET だろうが、C# だろうが、Visual C++ だろうが、.NET Framework アプリケーションとして作っているのであれば、挙動に大きな差はありません。
    書くための言語が違うだけで、同じフレームワークを利用しているので、同じような挙動を示すだけです。

    なお、Visual C++ では .NET Framework を利用しないプログラミング手段も用意されているので、.NET Framework プログラミング と Visual C++ でのプログラミングを混同しないようにしてください。
    (.NET Framework の仕様・不具合の可能性はあるが、Visual C++ の仕様・不具合ではない)

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク テラ 2009年11月28日 17:48
    2009年11月28日 11:35
    モデレータ

すべての返信

  • 具体的なアドバイスをできる準備をできていない状態なので、物事の進め方に対する指摘になります。

    まず、現時点で、納期には間に合わないと上司に相談するべきです。
    月末が「11 月末」だとすれば、このフォーラムで良い回答をもらえたとしても、間に合うとは限りません。
    理由は、今見えている問題が解決すれば完成するという保障がないためです。

    納期に間に合わない理由を問われたのであれば、素直に現状を伝えるべきです。
    うまく実現できない理由が、.NET Framework の仕様なのか、自身の組み方の問題なのかが調査できていない。調査して解決するためには少なくとも ** 日かかるとか、そう言った説明をするべきです。


    正直なところ、今の追い込まれ具合からするに、誰かの回答コードを検証・確認せずに丸写しする可能性が高いと思っています。そのコードに何か問題があったとしてもあなたの責任です。回答者に責任を追及することはできません。


    # もし、研修として取り組んでいるのであれば、上司に早めに報告・連絡・相談ができるかもチェック項目になるでしょう。
    # 抱え込んだ上、納期ギリギリでごめんなさい、あるいは納期になってできてませんは正直、自分の評価を下げるだけです。

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2009年11月28日 8:37
    モデレータ
  • 質問内容を読んでも、親子関係と兄弟関係の違いがわかりませんでした。
    テラさんのおっしゃる親子関係と兄弟関係は具体的にコード上にどのような違いがあるのでしょうか?

    それぞれのPictureBoxをテラさんが説明の都合上で呼び分けているだけなのであれば、プログラム上は同じ振る舞いをします(当たり前です)。
    2009年11月28日 8:47
  • Azulean様、ご指摘ありがとうございます。


    納期に関しては上司に相談はしています。

    仰るとおり、追い込まれてはいますが、回答コードを検証、確認は行います。
    また、「何か問題があったとしても自分の責任」であるということはフォーラムに参加させてもらう時点の規約で確認しております。
    なので、回答者様に責任転嫁したりすることは致しません。

    上記のことをご理解していただいた上で回答していただけたら幸いです。


    【追記】
    # もし、研修として取り組んでいるのであれば、上司に早めに報告・連絡・相談ができるかもチェック項目になるでしょう。
    # 抱え込んだ上、納期ギリギリでごめんなさい、あるいは納期になってできてませんは正直、自分の評価を下げるだけです。

    こちらの書き込みがあるのに気づいていませんでした(汗

    両方覚えておきます。
    アドバイスありがとうございます。

    2009年11月28日 9:28
  • 佐祐理様

    説明が下手で申し訳ありません。
    自分もどう説明してよいものかわかっていないのですが、下記のサイトとやりたいことが似ています。(同じかもしれません)
    親子、兄弟という表現もサイトの引用です(一般的な表現なのかと思っていました)
    下記のサイトでは2枚は重ねて透過できるが、3枚はできないという風に書いているように思えます。
    しかし、この回答はVBやVC#での回答なのでVC++でもできないか知りたい(検証したい)と思って投稿いたしました。

    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1310535848
    http://okwave.jp/qa2609952.html



    2009年11月28日 10:09
  • その親子関係のことでしたか。それ自体は一般的な表現です。
    しかし、テラさんが誤解しているため、そのことを指しているとは想像もつきませんでした。
    「テラさんのおっしゃる親子関係と兄弟関係は具体的にコード上にどのような違いがあるのでしょうか?」という質問に答えることができない点も同じ理由です。

    テラさんが念じるだけで親子関係になったり兄弟関係に切り替わったりするわけではありません。
    面倒なので書いてしまうと、pictureBox1~3はいずれも兄弟で、その親はForm(フォーム)クラスです。そうなるようコードが書かれているはずです。

    Visual C++ Express Editionを使用されているとのことですが、これは上司の指示でしょうか? かなり敷居が高い選択をされています。
    • C言語およびC++言語
    • 言語によらないオブジェクト指向の概念
    • .NET Frameworkの使い方
    • 以上を組み合わせて実現されるC++/CLIの特徴
    Visual C++ Express EditionのC++/CLIを使うと言うことは上記を理解して初めてスタートラインに立てます。例えば
    Bitmap ^ bmp = gcnew Bitmap(pictureBox2->Image);
    bmp->MakeTransparent(Color::FromArgb(255, 0, 255)); //透過色指定 マゼンタ
    と書かれていますが、
    • オブジェクトインスタンスの概念
    • クラスの継承関係
    • .NET FrameworkのImageクラスとBitmapクラス
    このいずれかもしくは複数が理解できていないことが伺えます。


    今の方針で、画像を重ね合わせるためにはGraphicsクラスを使うことになるとは思います。
    Photoshopでもよいということは、最終outputはどんな形式でもいいということでしょうか?
    でしたら、画像が重なるようにhtmlを記述してWebブラウザで表示するだけでもいいような。
    • 回答としてマーク テラ 2009年11月28日 17:48
    2009年11月28日 11:13
  • しかし、この回答はVBやVC#での回答なのでVC++でもできないか知りたい(検証したい)と思って投稿いたしました。
    VB.NET だろうが、C# だろうが、Visual C++ だろうが、.NET Framework アプリケーションとして作っているのであれば、挙動に大きな差はありません。
    書くための言語が違うだけで、同じフレームワークを利用しているので、同じような挙動を示すだけです。

    なお、Visual C++ では .NET Framework を利用しないプログラミング手段も用意されているので、.NET Framework プログラミング と Visual C++ でのプログラミングを混同しないようにしてください。
    (.NET Framework の仕様・不具合の可能性はあるが、Visual C++ の仕様・不具合ではない)

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク テラ 2009年11月28日 17:48
    2009年11月28日 11:35
    モデレータ
  • Azulean様
    佐祐理様

    2度にわたり返信ありがとうございます。
    透過ができない云々の前に基礎から勉強し直します。

    よって、今回は質問以前の問題でしたので回答は出てませんが回答済みとさせていただきます。
    しっかり基礎を勉強した上でまたわからないことが出てきた際にまた質問させていただきます。

    ありがとうございました。
    2009年11月28日 17:47