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);
}
}
}