トップページ > 記事閲覧
MakeScreenしたデータからHBITMAPを作る方法に
名前:HDDT 日時: 2018/05/29 22:49

はじめまして、Dxlib/C++を使ってソフトを作っています。初心者です。 作りたいのはデスクトップ上でキャラが動く(デスクトップマスコットというのかわかりませんが)ソフトです。 背景色をウィンドウの透過色に指定する方法を試しましたが、透過png画像に半透明な部分があるとその部分が透過色ではなくなり透過されなくなります。 検索した結果、UpdateLayeredWindow関数を使えばいいようで、 umezawa.dyndns.info/wordpress/?p=3020 を参考にして考えていたのですが、MakeScreenを使って作ったグラフィックをHBITMAPにする方法が分かりません。 どなたか方法を教えてもらえないでしょうか?
メンテ

Page: 1 |

Re: MakeScreenしたデータからHBITMAPを作る方法に ( No.1 )
名前:管理人 日時:2018/05/30 01:02

リファレンスには載っていませんが、DXライブラリにも UpdateLayerdWindow を使用して半透明の画像を デスクトップに表示する機能がありますので、よろしければ以下の『Test1.bmp を透明度 50% でデスクトップに表示する』 サンプルプログラムを参考にその機能を使ってみてください m(_ _)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int GraphHandle ; int ScreenHandle ; int SoftImageHandle ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // 画面サイズを設定 SetGraphMode( 800, 600, 32 ) ; // UpdateLayerdWindow を使用する設定 SetUseUpdateLayerdWindowFlag( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 乗算済みアルファ用の画像として読み込む設定にする SetUsePremulAlphaConvertLoad( TRUE ) ; // 画像の読み込み GraphHandle = LoadGraph( "Test1.bmp" ); // 乗算済みアルファ用の画像として読み込む設定を解除 SetUsePremulAlphaConvertLoad( TRUE ) ; // 画面取り込み用のソフトウエア用画像を作成 SoftImageHandle = MakeARGB8ColorSoftImage( 800, 600 ) ; // 描画対象にできるアルファチャンネル付き画面を作成 ScreenHandle = MakeScreen( 800, 600, TRUE ) ; // 描画先をアルファチャンネル付き画面にする SetDrawScreen( ScreenHandle ) ; // メインループ while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen() ; // 描画ブレンドモードを乗算済みアルファ用のアルファブレンドで透明度 50% に設定 SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 128 ) ; // 画像を描画 DrawGraph( 100, 100, GraphHandle, TRUE ) ; // 描画先の画像をソフトイメージに取得する GetDrawScreenSoftImage( 0, 0, 800, 600, SoftImageHandle ) ; // 取り込んだソフトイメージを使用して透過ウインドウの状態を更新する UpdateLayerdWindowForPremultipliedAlphaSoftImage( SoftImageHandle ) ; // 少し待つ Sleep( 12 ) ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 透過ウィンドウを使用するために使用するリファレンスに載っていない関数は以下の通りです // UpdateLayerdWindowForBaseImage や UpdateLayerdWindowForSoftImage を使用するかどうかを設定する // ( DxLib_Init を呼び出す前に実行する必要があります ) // Flag = TRUE:使用する FALSE:使用しない int SetUseUpdateLayerdWindowFlag( int Flag ) ; // 乗算済みアルファのソフトウエアイメージハンドルを使用して UpdateLayerdWindow を行う // ( ScreenFlip の代わりにこの関数で描画結果をデスクトップ画面に反映します ) int UpdateLayerdWindowForPremultipliedAlphaSoftImage( int SIHandle ) ; あと、サンプルでも MakeScreen で作成したアルファチャンネルつきの画像を使用していますが、 アルファチャンネルつきの画像に対して半透明の描画を行う場合、『乗算済みアルファ』という手法を 使用しないと正常な描画結果を得ることができません なので上記のサンプルでも関数SetUsePremulAlphaConvertLoad や ブレンドモードDX_BLENDMODE_PMA_ALPHA などを 使用して『乗算済みアルファ』の処理を行っています もし『乗算済みアルファ』についてまだご存知ではありませんでしたら、こちらの『乗算済みアルファ』についての 解説ページをご覧ください m(_ _)m < 乗算済みアルファのすすめ > https://dxlib.xsrv.jp/lecture/PremulAlpha/PremulAlpha.html
メンテ
Re: MakeScreenしたデータからHBITMAPを作る方法に ( No.2 )
名前:HDDT(解決) 日時:2018/05/30 19:00

管理人様、返信ありがとうございます。 この方法を使って目的通りの動作が出来ました! また何かわからないことがあったら質問しますので、その時はよろしくお願いいたします。
メンテ

Page: 1 |

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

   クッキー保存