トップページ > 記事閲覧
背景を透明にしたい。
名前:ひら 日時: 2020/05/23 10:57

いつもお世話になっております。 現在、私はフォームの背景を透明にしようとしています。 ttps://qiita.com/massoumen/items/2985a0fb30472b97a590 の記事によるとTransparencyKeyを使うと透明にできるようですが、 TransparencyKeyを使ってもうまく背景が透明になりません。 背景を透明にするにはどうすればいいのでしょうか? 再び初歩的な質問となってしまいましたが 何卒、宜しくお願いいたします。 ソースコード_____________________________________________ 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; namespace Live2D { public partial class Form1 : Form { private int ModelHandle; public Form1() { InitializeComponent(); this.TransparencyKey = Color.FromArgb(1, 1, 1); DX.SetOutApplicationLogValidFlag(DX.TRUE); DX.SetUserWindow(this.Handle); if (System.IntPtr.Size == 8) { // 64bit起動の場合 DX.Live2D_SetCubism4CoreDLLPath("dll/x64/Live2DCubismCore.dll"); } else { // 32bit起動の場合 DX.Live2D_SetCubism4CoreDLLPath("dll/x86/Live2DCubismCore.dll"); } DX.DxLib_Init(); DX.SetDrawScreen(DX.DX_SCREEN_BACK);//描画先を裏画面に設定 ModelHandle = DX.Live2D_LoadModel(@"Desk/Kiritan/kiritanv3.model3.json"); DX.Live2D_Model_SetExtendRate(ModelHandle , 1.2f , 1.2f); } public void MainLoop() { DX.ClearDrawScreen();//裏画面を消す DX.DrawBox(0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, DX.GetColor(1, 1, 1), DX.TRUE); DX.Live2D_Model_Update(ModelHandle, 1 / 60.0f); DX.Live2D_RenderBegin(); DX.Live2D_Model_Draw(ModelHandle); DX.Live2D_RenderEnd(); DX.ScreenFlip(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DX.Live2D_DeleteModel(ModelHandle); DX.DxLib_End(); Environment.Exit(0); } } }
メンテ

Page: 1 |

Re: 背景を透明にしたい。 ( No.1 )
名前:管理人 日時:2020/05/24 03:10

DXライブラリで背景を透過する場合は DxLib_Init の前に DX.SetUseUpdateLayerdWindowFlag( DX.TRUE ); を追加して、透過処理対応の設定に変更する必要があります、また、ScreenFlip の代わりに GetDrawScreenSoftImage と UpdateLayerdWindowForSoftImage を使用します 透過処理ウィンドウの場合は通常と画面表示の流れが大きく異なり 1. MakeScreen で画面サイズのアルファチャンネル付きの仮画面を作成する 2. MakeARGB8ColorSoftImage で画面サイズのソフトウェアイメージを作成する 3. SetDrawScreen で 1 で作成した仮画面を描画先にする 4. ClearDrawScreen で仮画面をクリア 5. 描画関数で仮画面に描画 6. GetDrawScreenSoftImage で仮画面への描画結果を 2 で作成したソフトウェアイメージに取り込み 7. UpdateLayerdWindowForSoftImage で描画結果を透過ウィンドウに反映 8. 4 に戻る となります 手元でフォームの背景を透明にするプログラムを組んでみましたので、よろしければご覧ください m(_ _)m ( TransparencyKey は使用しません ) 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 System.Runtime.InteropServices; using DxLibDLL; namespace Live2D { public partial class Form1 : Form { private int DrawScreen; private int SoftImage; private int ModelHandle; private int NowTime; private int BackTime; // Layerd Window に設定するために使用する Win32API 関連の定義 [DllImport("user32.dll", SetLastError = true)] static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); const int GWL_EXSTYLE = -20; const int WS_EX_LAYERED = 0x80000; public Form1() { InitializeComponent(); DX.SetOutApplicationLogValidFlag(DX.TRUE);//動作確認のため生成させる。 DX.SetUserWindow(this.Handle);//DxLibの親ウインドウをこのフォームに設定 if (System.IntPtr.Size == 8) { // 64bit起動の場合 DX.Live2D_SetCubism4CoreDLLPath("dll/x64/Live2DCubismCore.dll"); } else { // 32bit起動の場合 DX.Live2D_SetCubism4CoreDLLPath("dll/x86/Live2DCubismCore.dll"); } // 透過処理を行う設定にする DX.SetUseUpdateLayerdWindowFlag(DX.TRUE); DX.DxLib_Init(); ModelHandle = DX.Live2D_LoadModel(@"Desk/Kiritan/kiritanv3.model3.json"); FormBorderStyle = FormBorderStyle.None;//フォームの枠を非表示にする // 透過処理対応ウィンドウに設定を変更する int style = GetWindowLong(this.Handle, GWL_EXSTYLE); SetWindowLong(this.Handle, GWL_EXSTYLE, style | WS_EX_LAYERED); // 描画対象にできるアルファチャンネル付き画面を作成 DrawScreen = DX.MakeScreen(this.Width, this.Height, DX.TRUE); // 画面取り込み用のソフトウエア用画像を作成 SoftImage = DX.MakeARGB8ColorSoftImage(this.Width, this.Height); // 描画先を描画対象にできるアルファチャンネル付き画面にする DX.SetDrawScreen(DrawScreen); // 時間パラメータを初期化 NowTime = DX.GetNowCount(); BackTime = NowTime - 1; } public void MainLoop() { // 仮画面をクリア DX.ClearDrawScreen(); // モデルの状態を経過時間分だけ進める DX.Live2D_Model_Update(ModelHandle, (NowTime - BackTime) / 1000.0f); DX.Live2D_RenderBegin(); DX.Live2D_Model_Draw(ModelHandle); DX.Live2D_RenderEnd(); // 描画先の画像をソフトイメージに取得する DX.GetDrawScreenSoftImage(0, 0, this.Width, this.Height, SoftImage); // 取り込んだソフトイメージを使用して透過ウインドウの状態を更新する DX.UpdateLayerdWindowForSoftImage(SoftImage); // 時間パラメータを更新する BackTime = NowTime; NowTime = DX.GetNowCount(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { DX.Live2D_DeleteModel(ModelHandle); DX.DxLib_End(); Environment.Exit(0); } } }
メンテ
Re: 背景を透明にしたい。 ( No.2 )
名前:ひら(解決) 日時:2020/05/24 21:23

なるほど、TransparencyKeyは使用しないのですね。 お蔭様で解決しました! 本当にありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存