背景の透過処理について
背景の透過処理について
いつもお世話になっております。
現在、下記サイトを参考にデスクトップマスコットを作成しているのですが背景の透過処理で詰まっております。
https://qiita.com/massoumen/items/2985a0fb30472b97a590
サイトではTransparencyKeyで透過色を設定し、それをDrawBOXで画面全体に描画して背景を透過させているみたいですが、実際に試し見たところ透過されませんでした。
まずはサイト内のコードを写経して実際にサンプルを動かしているところです。
TransparencyKeyを使用してDXlibで背景を透過させるにはどうしたらよろしいのでしょうか?
それともwindowsアプリケーションとDXlibで背景を透過させるにはSetUserWindowを使用しない方法で
SetUseBackBufferTransColorFlag関数を使用した方がよいのでしょうか?
環境はwindows7でVisualStudio commyunity2017にDXlibのC#版を使用しております。
もし、不足事項がありましたらご指摘いただけたらと思います。
現在、下記サイトを参考にデスクトップマスコットを作成しているのですが背景の透過処理で詰まっております。
https://qiita.com/massoumen/items/2985a0fb30472b97a590
サイトではTransparencyKeyで透過色を設定し、それをDrawBOXで画面全体に描画して背景を透過させているみたいですが、実際に試し見たところ透過されませんでした。
まずはサイト内のコードを写経して実際にサンプルを動かしているところです。
TransparencyKeyを使用してDXlibで背景を透過させるにはどうしたらよろしいのでしょうか?
それともwindowsアプリケーションとDXlibで背景を透過させるにはSetUserWindowを使用しない方法で
SetUseBackBufferTransColorFlag関数を使用した方がよいのでしょうか?
環境はwindows7でVisualStudio commyunity2017にDXlibのC#版を使用しております。
もし、不足事項がありましたらご指摘いただけたらと思います。
Re: 背景の透過処理について
>>もるも様
ご回答ありがとうございます。
フォーム枠ですがこちらは消えております。
なのでshownイベント自体は登録できていると思われます。
一応コードを載せさせていただきます。
自分でも調べているのですが調べ方が悪いのか原因が未だにわからないままです・・・
ご回答ありがとうございます。
フォーム枠ですがこちらは消えております。
なので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();
}
}
}
}
Re: 背景の透過処理について
letterさんのコードをコピペで実行してみましたが、枠の付いた大きなフォームが表示されました。
//this.Shown += new EventHandler(Form1_Shown);//フォームが初めて表示されたときにこの処理を呼べるように登録。
これがForm1.designers.csファイルのInitializeComponent()内にありますでしょうか?
フォームデザイナーのプロパティで追加するか、Form1()の中に書き込むとこちらでは枠も背景も透明になりました。
//this.Shown += new EventHandler(Form1_Shown);//フォームが初めて表示されたときにこの処理を呼べるように登録。
これがForm1.designers.csファイルのInitializeComponent()内にありますでしょうか?
フォームデザイナーのプロパティで追加するか、Form1()の中に書き込むとこちらでは枠も背景も透明になりました。
Re: 背景の透過処理について
>>もるも様
ご回答ありがとうございます。
また、たびたび申し訳ありません。
ご指摘いただきました箇所を確認いたしましたが、
this.Shown += new EventHandler(Form1_Shown);
こちらのコードは記載されておりました。
実行結果が異なっているので設定の部分なのかなと思い始めております。
デザイン側のコードも載せさせていただきます。
当方では画像のような実行結果になっております(見やすくするために画面をウィンドウモードに切り替えています)
http://firestorage.jp/photo/3a3e6a4576d ... d2b4d0c5ab
ご回答ありがとうございます。
また、たびたび申し訳ありません。
ご指摘いただきました箇所を確認いたしましたが、
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
Re: 背景の透過処理について
>>もるも様
ご回答ありがとうございます。
ご指摘いただきました画像の解像度を16ビットに落としたところ透過処理がされました。
原因は画面の解像度が32ビットであったものによるものでした。
ただ、DXlibを併用した場合の回避方法をわからないでいます・・・・
ご回答ありがとうございます。
ご指摘いただきました画像の解像度を16ビットに落としたところ透過処理がされました。
原因は画面の解像度が32ビットであったものによるものでした。
ただ、DXlibを併用した場合の回避方法をわからないでいます・・・・
Re: 背景の透過処理について
Windows10,VisualStudio2017Communityでは普通に透過されてるようですが。(開発者ようコマンドプロンプト)
c.bat c1.cs
わかり易いよう800x600画面ウィンドウ,枠を表示させてます
http://www2.koyoen.birdview.co.jp/~abcxyz/x0527.png
c.bat 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
}
}
http://www2.koyoen.birdview.co.jp/~abcxyz/x0527.png
Re: 背景の透過処理について
>>Math様
ご回答ありがとうございます。
私の環境では32bitの時は透過処理ができておらず、16ビットの時は透過処理ができるようになりました。
なので32bitの時に発生するTransparencyKeyの不具合だと思われますが現在これを回避する方法がわからず困っております・・・・
ご回答ありがとうございます。
私の環境では32bitの時は透過処理ができておらず、16ビットの時は透過処理ができるようになりました。
なので32bitの時に発生するTransparencyKeyの不具合だと思われますが現在これを回避する方法がわからず困っております・・・・
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 背景の透過処理について
DXライブラリ自体のバグ等に関しては掲示板で聞いてもらった方がいいかもしれません。
http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?
DXライブラリの管理人さんに報告すれば何か解決策を教えてくれるかもしれません。
http://dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?
DXライブラリの管理人さんに報告すれば何か解決策を教えてくれるかもしれません。
Re: 背景の透過処理について
> Dixqさん
DXライブラリ自体のバグではないかと。
Formのプロパティ指定による動作なので。・・・
> letter さん
以下が参考になりませんか。
最後の方の「うまくいかない場合は?」を見てください
https://dobon.net/vb/dotnet/form/transparencykey.html
DXライブラリ自体のバグではないかと。
Formのプロパティ指定による動作なので。・・・
> letter さん
以下が参考になりませんか。
最後の方の「うまくいかない場合は?」を見てください
https://dobon.net/vb/dotnet/form/transparencykey.html
written by へにっくす
Re: 背景の透過処理について
オフトピック
すごくどうでもいい事柄ですが,
> DXライブラリ自体のバグではないかと。
この文って,以下のどちらの意味にも読める感がありますね.
・DXライブラリ自体のバグ ではない であろう
・DXライブラリ自体のバグなのではなかろうか
> DXライブラリ自体のバグではないかと。
この文って,以下のどちらの意味にも読める感がありますね.
・DXライブラリ自体のバグ ではない であろう
・DXライブラリ自体のバグなのではなかろうか
Re: 背景の透過処理について
ご回答くださった皆様、ありがとうございます。
ご返信が遅くなり大変申し訳ありませんでした。
へにっくす様から頂きましたURLの中のコードを試してみたのですが32ビットではやはり処理されませんでした。
以下がコードとなります。
bmpファイルは自前で白色のものを用意いたしました。
やはり諦めて16ビットで開発した方がいいのでしょうか?
ご返信が遅くなり大変申し訳ありませんでした。
へにっくす様から頂きました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);
}
}
}
やはり諦めて16ビットで開発した方がいいのでしょうか?
Re: 背景の透過処理について
お世話になっております。
かなり前の質問ですが一応32ビットで透過処理がされない対策ができましたので報告させていただきます。
windows7の設定のaeroを無効にしたところ32ビットでも透過処理がされるようになりました。
この設定が悪さをしていたと思われます。
回答をくださった皆様、本当にありがとうございました。
かなり前の質問ですが一応32ビットで透過処理がされない対策ができましたので報告させていただきます。
windows7の設定のaeroを無効にしたところ32ビットでも透過処理がされるようになりました。
この設定が悪さをしていたと思われます。
回答をくださった皆様、本当にありがとうございました。