背景の透過処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
letter

背景の透過処理について

#1

投稿記事 by letter » 1年前

いつもお世話になっております。

現在、下記サイトを参考にデスクトップマスコットを作成しているのですが背景の透過処理で詰まっております。
https://qiita.com/massoumen/items/2985a0fb30472b97a590

サイトではTransparencyKeyで透過色を設定し、それをDrawBOXで画面全体に描画して背景を透過させているみたいですが、実際に試し見たところ透過されませんでした。
まずはサイト内のコードを写経して実際にサンプルを動かしているところです。
TransparencyKeyを使用してDXlibで背景を透過させるにはどうしたらよろしいのでしょうか?

それともwindowsアプリケーションとDXlibで背景を透過させるにはSetUserWindowを使用しない方法で
SetUseBackBufferTransColorFlag関数を使用した方がよいのでしょうか?

環境はwindows7でVisualStudio commyunity2017にDXlibのC#版を使用しております。

もし、不足事項がありましたらご指摘いただけたらと思います。

アバター
もるも
記事: 52
登録日時: 4年前
連絡を取る:

Re: 背景の透過処理について

#2

投稿記事 by もるも » 1年前

フォーム枠は消えているのでしょうか?
TransparencyKeyに色の数値が代入されていないとか。
デザイン機能を使わず、
もしすべて手書きだったらイベントが追加されていなくて、
フォームのShownイベントが起こっていないとかですかね。


C#にDXライブラリを入れてみましたが、透過されました。
(作業用なので余計なコードが書いてあります)
スクリーンショット (106).png

letter

Re: 背景の透過処理について

#3

投稿記事 by letter » 1年前

>>もるも様

ご回答ありがとうございます。
フォーム枠ですがこちらは消えております。
なのでshownイベント自体は登録できていると思われます。

一応コードを載せさせていただきます。

コード:

//Form.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;//DxLibを使用

namespace DesctopMascot
{
    public partial class Form1 : Form
    {
        private int modelHandle;

        public Form1()
        {
            InitializeComponent();
            ClientSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);//画面サイズの設定
            //DX.ChangeWindowMode(DX.TRUE);
            DX.SetOutApplicationLogValidFlag(DX.FALSE);//Log.txtを生成しないように設定
            DX.SetUserWindow(Handle);//DxLibの親ウインドウをこのフォームに設定
            DX.DxLib_Init();//DxLibの初期化処理
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);//描画先を裏画面に設定

            modelHandle = DX.MV1LoadModel("Data/yukari.pmd");//3Dモデルの読み込み

            DX.SetCameraNearFar(0.1f, 1000.0f);//奥行0.1~1000をカメラの描画範囲とする
            DX.SetCameraPositionAndTarget_UpVecY(DX.VGet(0.0f, 10.0f, -30.0f), DX.VGet(0.0f, 10.0f, 0.0f));//第1引数の位置から第2引数の位置を見る角度にカメラを設置
        }

        public void MainLoop()
        {
            DX.ClearDrawScreen();//裏画面を消す

            DX.DrawBox(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, DX.GetColor(255, 0, 0), DX.TRUE);//背景を設定(透過させる)

            DX.MV1DrawModel(modelHandle);//3Dモデルの描画

            //ESCキーを押したら終了
            if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) != 0)
            {
                Close();
            }

            DX.ScreenFlip();//裏画面を表画面にコピー
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();//DxLibの終了処理
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            FormBorderStyle = FormBorderStyle.None;//フォームの枠を非表示にする
            TransparencyKey = Color.Red;//透過色を設定
        }
    }
}

コード:

//program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DesctopMascot
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Form1 form = new Form1();
            form.Show();
            //Application.Run(new Form1());
            while (form.Created)
            {
                form.MainLoop();
                Application.DoEvents();
            }
        }
    }
}
自分でも調べているのですが調べ方が悪いのか原因が未だにわからないままです・・・

アバター
もるも
記事: 52
登録日時: 4年前
連絡を取る:

Re: 背景の透過処理について

#4

投稿記事 by もるも » 1年前

letterさんのコードをコピペで実行してみましたが、枠の付いた大きなフォームが表示されました。

//this.Shown += new EventHandler(Form1_Shown);//フォームが初めて表示されたときにこの処理を呼べるように登録。
これがForm1.designers.csファイルのInitializeComponent()内にありますでしょうか?
フォームデザイナーのプロパティで追加するか、Form1()の中に書き込むとこちらでは枠も背景も透明になりました。

letter

Re: 背景の透過処理について

#5

投稿記事 by letter » 1年前

>>もるも様

ご回答ありがとうございます。
また、たびたび申し訳ありません。
ご指摘いただきました箇所を確認いたしましたが、
this.Shown += new EventHandler(Form1_Shown);
こちらのコードは記載されておりました。
実行結果が異なっているので設定の部分なのかなと思い始めております。

デザイン側のコードも載せさせていただきます。

コード:

namespace DesctopMascot
{
    partial class Form1
    {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナーで生成されたコード

        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(433, 384);
            this.Name = "Form1";
            this.Text = "Form1";
            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
            this.Shown += new System.EventHandler(this.Form1_Shown);
            this.ResumeLayout(false);

        }

        #endregion
    }
}
当方では画像のような実行結果になっております(見やすくするために画面をウィンドウモードに切り替えています)
http://firestorage.jp/photo/3a3e6a4576d ... d2b4d0c5ab

アバター
もるも
記事: 52
登録日時: 4年前
連絡を取る:

Re: 背景の透過処理について

#6

投稿記事 by もるも » 1年前

ほかで透過処理が機能してるかどうかが気になりますね。
DXライブラリの描画を一旦止めて、
TransparencyKey = this.BackColor;といった感じで、
フォーム自身の背景を消すことはできるのでしょうか?

アバター
もるも
記事: 52
登録日時: 4年前
連絡を取る:

Re: 背景の透過処理について

#7

投稿記事 by もるも » 1年前

いろいろググってみたところ、
TransparencyKeyで色を指定しても、
PC画面の色設定で32ビット以上だと透過されない不具合があったりするらしいです。

letter

Re: 背景の透過処理について

#8

投稿記事 by letter » 1年前

>>もるも様

ご回答ありがとうございます。
ご指摘いただきました画像の解像度を16ビットに落としたところ透過処理がされました。
原因は画面の解像度が32ビットであったものによるものでした。
ただ、DXlibを併用した場合の回避方法をわからないでいます・・・・

Math

Re: 背景の透過処理について

#9

投稿記事 by Math » 1年前

Windows10,VisualStudio2017Communityでは普通に透過されてるようですが。(開発者ようコマンドプロンプト)
c.bat

コード:

csc.exe /r:DxLibDotNet.dll c1.cs

c1.exe

pause
c1.cs

コード:

//program.cs
//Form.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;//DxLibを使用

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

    public partial class Form1 : Form
    {
        private int modelHandle;

        public Form1()
        {
            InitializeComponent();
            //ClientSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);//画面サイズの設定

            ClientSize = new Size(800, 600);//画面サイズの設定
            //DX.ChangeWindowMode(DX.TRUE);

            //DX.SetOutApplicationLogValidFlag(DX.FALSE);//Log.txtを生成しないように設定
            DX.SetUserWindow(Handle);//DxLibの親ウインドウをこのフォームに設定
            DX.DxLib_Init();//DxLibの初期化処理
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);//描画先を裏画面に設定

            modelHandle = DX.MV1LoadModel("Lat式ミクVer2.3_Normal.pmd");//3Dモデルの読み込み

            DX.SetCameraNearFar(0.1f, 1000.0f);//奥行0.1~1000をカメラの描画範囲とする
            DX.SetCameraPositionAndTarget_UpVecY(DX.VGet(0.0f, 10.0f, -30.0f), DX.VGet(0.0f, 10.0f, 0.0f));//第1引数の位置から第2引数の位置を見る角度にカメラを設置
        }

        public void MainLoop()
        {
            DX.ClearDrawScreen();//裏画面を消す

            DX.DrawBox(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, DX.GetColor(255, 0, 0), DX.TRUE);//背景を設定(透過させる)

            DX.MV1DrawModel(modelHandle);//3Dモデルの描画

            //ESCキーを押したら終了
            if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) != 0)
            {
                Close();
            }

            DX.ScreenFlip();//裏画面を表画面にコピー
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();//DxLibの終了処理
        }

        private void Form1_Shown(object sender, EventArgs e)
        {
            //FormBorderStyle = FormBorderStyle.None;//フォームの枠を非表示にする
            TransparencyKey = Color.Red;//透過色を設定
        }
    }

    partial class Form1
    {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースを破棄する場合は true を指定し、その他の場合は false を指定します。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナーで生成されたコード

        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(800, 600);
            this.Name = "Form1";
            this.Text = "Form1";
            this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.Form1_FormClosed);
            this.Shown += new System.EventHandler(this.Form1_Shown);
            this.ResumeLayout(false);
        }

        #endregion
    }
}
わかり易いよう800x600画面ウィンドウ,枠を表示させてます
http://www2.koyoen.birdview.co.jp/~abcxyz/x0527.png

letter

Re: 背景の透過処理について

#10

投稿記事 by letter » 1年前

>>Math様

ご回答ありがとうございます。
私の環境では32bitの時は透過処理ができておらず、16ビットの時は透過処理ができるようになりました。
なので32bitの時に発生するTransparencyKeyの不具合だと思われますが現在これを回避する方法がわからず困っております・・・・

アバター
もるも
記事: 52
登録日時: 4年前
連絡を取る:

Re: 背景の透過処理について

#11

投稿記事 by もるも » 1年前

私のPCもwindows10で32ビットの設定でも透過されます。
OSとかグラフィックボードの相性なのかな(-_-;)

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: 背景の透過処理について

#12

投稿記事 by Dixq (管理人) » 1年前

DXライブラリ自体のバグ等に関しては掲示板で聞いてもらった方がいいかもしれません。
http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?
DXライブラリの管理人さんに報告すれば何か解決策を教えてくれるかもしれません。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: 背景の透過処理について

#13

投稿記事 by へにっくす » 1年前

> Dixqさん
DXライブラリ自体のバグではないかと。
Formのプロパティ指定による動作なので。・・・

> letter さん
以下が参考になりませんか。
最後の方の「うまくいかない場合は?」を見てください

https://dobon.net/vb/dotnet/form/transparencykey.html
written by へにっくす

アバター
usao
記事: 1565
登録日時: 6年前

Re: 背景の透過処理について

#14

投稿記事 by usao » 1年前

オフトピック
すごくどうでもいい事柄ですが,

> DXライブラリ自体のバグではないかと。

この文って,以下のどちらの意味にも読める感がありますね.

・DXライブラリ自体のバグ ではない であろう
・DXライブラリ自体のバグなのではなかろうか

letter

Re: 背景の透過処理について

#15

投稿記事 by letter » 1年前

ご回答くださった皆様、ありがとうございます。

ご返信が遅くなり大変申し訳ありませんでした。
へにっくす様から頂きましたURLの中のコードを試してみたのですが32ビットではやはり処理されませんでした。
以下がコードとなります。

コード:

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;//DxLibを使用

namespace DesctopMascot
{
    public partial class Form1 : Form
    {
        private int modelHandle;
        private Bitmap bmp;

        public Form1()
        {
            InitializeComponent();
            //ClientSize = new Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);//画面サイズの設定
            DX.ChangeWindowMode(DX.TRUE);
            DX.SetOutApplicationLogValidFlag(DX.FALSE);//Log.txtを生成しないように設定
            DX.SetUserWindow(Handle);//DxLibの親ウインドウをこのフォームに設定
            DX.DxLib_Init();//DxLibの初期化処理
            DX.SetDrawScreen(DX.DX_SCREEN_BACK);//描画先を裏画面に設定

            modelHandle = DX.MV1LoadModel("Data/yukari.pmd");//3Dモデルの読み込み

            DX.SetCameraNearFar(0.1f, 1000.0f);//奥行0.1~1000をカメラの描画範囲とする
            DX.SetCameraPositionAndTarget_UpVecY(DX.VGet(0.0f, 10.0f, -30.0f), DX.VGet(0.0f, 10.0f, 0.0f));//第1引数の位置から第2引数の位置を見る角度にカメラを設置
        }

        public void MainLoop()
        {
            DX.ClearDrawScreen();//裏画面を消す

            DX.DrawBox(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, DX.GetColor(255, 255, 255), DX.TRUE);//背景を設定(透過させる)

            DX.MV1DrawModel(modelHandle);//3Dモデルの描画

            //ESCキーを押したら終了
            if (DX.CheckHitKey(DX.KEY_INPUT_ESCAPE) != 0)
            {
                Close();
            }

            DX.ScreenFlip();//裏画面を表画面にコピー
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            DX.DxLib_End();//DxLibの終了処理
        }

        private void Form1_shown(object sender, EventArgs e)
        {
            bmp = new Bitmap(@"form.bmp"); //画像を読み込み
            bmp.MakeTransparent(Color.White); //画像を透明にする

            FormBorderStyle = FormBorderStyle.None;//フォームの枠を非表示にする
            TransparencyKey = Color.White;//透過色を設定
            BackColor = Color.White;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            //フォームの形の画像を描画する
            e.Graphics.DrawImage(bmp, 0, 0);
        }
    }
}
bmpファイルは自前で白色のものを用意いたしました。
やはり諦めて16ビットで開発した方がいいのでしょうか?

letter(解決)

Re: 背景の透過処理について

#16

投稿記事 by letter(解決) » 1年前

お世話になっております。

かなり前の質問ですが一応32ビットで透過処理がされない対策ができましたので報告させていただきます。
windows7の設定のaeroを無効にしたところ32ビットでも透過処理がされるようになりました。
この設定が悪さをしていたと思われます。

回答をくださった皆様、本当にありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る