Re: 透過ウィンドウ使用時に文字列が表示されない ( No.1 ) |
- 名前:びみょう 日時:2014/09/20 18:47
プログラムの順序で表示されたりされなかったりするようです。
しかし、なぜそうなるのかよく理解できませんでした。
下のでは、画面上に テスト の文字は表示されません。
なぜでしょうか?
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//コンソール画面の呼び出し
AllocConsole();
FILE* fp;
freopen_s(&fp, "CONOUT$", "w", stdout);
freopen_s(&fp, "CONIN$", "r", stdin);
int screensofthandle, capsofthandle, softhandle;
int shH, shW;
// ウインドウモードで起動
ChangeWindowMode(TRUE);
if (SetGraphMode(WINDOWWIDTH, WINDOWHEIGHT, 32) != DX_CHANGESCREEN_OK)
{
MessageBox(NULL, _T("ウィンドウ位置を設定できませんでした"), _T("エラー"), MB_OK);
}
//ウィンドウ位置を右下に設定
RECT rc;
GetWindowRect(GetDesktopWindow(), &rc);
SetWindowInitPosition(rc.right - WINDOWWIDTH, rc.bottom - WINDOWHEIGHT);
// ウインドウの透過色モードON
SetUseBackBufferTransColorFlag(TRUE);
// DXライブラリの初期化
if (DxLib_Init() < 0) return -1;
// 画像の読み込み
softhandle = LoadSoftImage("image/default1.png");
GetSoftImageSize(softhandle, &shW, &shH);
// 透過色と画面クリア色をセット
SetTransColor(255, 0, 255);
SetBackgroundColor(255, 0, 255);
// 画面出力用のソフトウエア画像の作成
screensofthandle = MakeARGB8ColorSoftImage(WINDOWWIDTH, WINDOWHEIGHT);
// 画面キャプチャ用のソフトウエア画像の作成
capsofthandle = MakeXRGB8ColorSoftImage(WINDOWWIDTH, WINDOWHEIGHT);
// 描画先を裏画面に
SetDrawScreen(DX_SCREEN_BACK);
// メインループ(何かキーが押されたらループを抜ける)
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
{
DrawFormatString(110, 110, GetColor(0, 0, 0), "テスト");
// 裏画面への描画結果を取得
GetDrawScreenSoftImage(0, 0, WINDOWWIDTH, WINDOWHEIGHT, capsofthandle);
// 画面出力用のソフトウエア画像をクリア
FillSoftImage(screensofthandle, 0, 0, 0, 0);
// 画面出力用のソフトウエア画像の左上端に読み込んだ画像を転送
BltSoftImage(-(WINDOWWIDTH - shW), -(WINDOWHEIGHT - shH), WINDOWWIDTH, WINDOWHEIGHT, softhandle, 0, 0, screensofthandle);
// 画面出力用のソフトウエア画像を使ってウインドウの表示を更新
UpdateLayerdWindowForSoftImage(screensofthandle);
}
// DXライブラリの後始末
DxLib_End();
//コンソール解放
FreeConsole();
// ソフトの終了
return 0;
}
|
Re: 透過ウィンドウ使用時に文字列が表示されない ( No.2 ) |
- 名前:管理人 日時:2014/09/21 04:16
透過ウインドウモードでは ScreenFlip の代わりに UpdateLayerdWindowForSoftImage などで画面の更新を行います
びみょうさんのプログラムでは UpdateLayerdWindowForSoftImage で使用している screensofthandle に DrawFormatString の結果が
全く関わっていないので「テスト」の文字が画面に表示されない状態となっています
// 画面出力用のソフトウエア画像の左上端に読み込んだ画像を転送
BltSoftImage(-(WINDOWWIDTH - shW), -(WINDOWHEIGHT - shH), WINDOWWIDTH, WINDOWHEIGHT, softhandle, 0, 0, screensofthandle);
↑こちらの行の下に
// 文字列の書き込み
BltStringSoftImage( 110, 110, "テスト", screensofthandle ) ;
という記述を追加して、UpdateLayerdWindowForSoftImage で使用している screensofthandle に対して
「テスト」を描画すれば、画面に「テスト」が表示されるようになります
|
Re: 透過ウィンドウ使用時に文字列が表示されない ( No.3 ) |
- 名前:びみょう 日時:2014/09/21 14:17
管理人様、ありがとうございます
おお、ちゃんと表示されましたが、
色は白しか描けないのでしょうか?
|
Re: 透過ウィンドウ使用時に文字列が表示されない ( No.4 ) |
- 名前:管理人 日時:2014/09/21 18:51
BltStringSoftImage では白色の文字しか転送できません
No.1のびみょうさんのプログラムではソフトイメージにそのまま画像を転送していますが、
もし白色の文字以外を使用する場合は別の方法で透過ウインドウに描画結果を反映させる必要があります
まずアルファチャンネルつきの画像を MakeScreen で作成して、
その画面に対して DrawGraph や DrawString などで描画処理を行い、
GetDrawScreenSoftImage でソフトイメージに描画結果を取り込み、
UpdateLayerdWindowForPremultipliedAlphaSoftImage で透過ウインドウに描画結果を反映する、
という手順を採る必要があります
透過ウインドウに緑色の文字と画像を表示するサンプルを組んでみましたので、よろしければ参考にして下さい
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GraphHandle ;
int ScreenHandle ;
int SoftImageHandle ;
int PreMulAlphaFontHandle ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// 透過ウインドウ設定
SetUseBackBufferTransColorFlag( TRUE ) ;
// 画面サイズを設定
SetGraphMode( 800, 600, 32 ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画対象にできるアルファチャンネル付き画面を作成
ScreenHandle = MakeScreen( 800, 600, TRUE ) ;
// 描画結果取り込み用のソフトウエア用画像を作成
SoftImageHandle = MakeARGB8ColorSoftImage( 800, 600 ) ;
// 画像を読み込む際にアルファ値をRGB値に乗算するように設定する
SetUsePremulAlphaConvertLoad( TRUE ) ;
// 画像の読み込み
GraphHandle = LoadGraph( "Test1.bmp" );
// 画像を読み込む際にアルファ値をRGB値に乗算する設定を解除する
SetUsePremulAlphaConvertLoad( FALSE ) ;
// 乗算済みアルファ対応のフォントハンドルを作成する設定にする
SetFontCacheUsePremulAlphaFlag( TRUE ) ;
// アンチエイリアスつきフォントの作成
PreMulAlphaFontHandle = CreateFontToHandle( NULL, 32, 8, DX_FONTTYPE_ANTIALIASING_8X8 ) ;
// 乗算済みアルファ対応のフォントハンドルを作成する設定を解除する
SetFontCacheUsePremulAlphaFlag( FALSE ) ;
// 透過色を紫に設定
// ( 透過色の部分が強制的に透過されてしまうため、使用されにくい色に設定 )
SetTransColor( 255,0,255 ) ;
// 描画先をアルファチャンネルつき画面にする
SetDrawScreen( ScreenHandle ) ;
// メインループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// 描画ブレンドモードを乗算済みアルファにセット
SetDrawBlendMode( DX_BLENDMODE_PMA_ALPHA, 255 ) ;
// 画像を描画
DrawGraph( 0, 48, GraphHandle, TRUE ) ;
// 文字列を描画
DrawStringToHandle( 0, 0, "テスト文字列", GetColor( 0,255,0 ), PreMulAlphaFontHandle ) ;
// 描画結果をソフトイメージに転送する
GetDrawScreenSoftImage( 0, 0, 800, 600, SoftImageHandle ) ;
// 取り込んだソフトイメージを使用して透過ウインドウの状態を更新する
UpdateLayerdWindowForPremultipliedAlphaSoftImage( SoftImageHandle ) ;
// 少し待つ
Sleep( 12 ) ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
尚、プログラム中に『乗算済みアルファ』という語句が出てきますが、こちらは
アルファチャンネルつきの画面に対して描画処理を行う際に正しい描画結果を得るために
使用する必要のあるものです
こちらのページで『乗算済みアルファ』についての解説をしていますので、よろしければご覧ください m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/lecture/PremulAlpha/PremulAlpha.html
|
Re: 透過ウィンドウ使用時に文字列が表示されない ( No.5 ) |
- 名前:びみょう 日時:2014/09/21 19:46
なるほど・・・別の方法を取らないといけなかったんですね。
勉強になります。ありがとうございましたm(_ _)m
|
|