透明ウィンドウについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
パラダイス

透明ウィンドウについて

#1

投稿記事 by パラダイス » 12年前

C言語とDXライブラリでゲームを作ろうと頑張っているプログラミング初心者です。
windowsXP, VC++ 2008を使用しています。

ttp://vvbuibui.blog47.fc2.com/blog-entry-124.html
こちらのブログにある「ウィンドウの透明化」についての質問なのですが、ここの話を参考に以下のプログラムを組んでみました。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE,HINSTANCE,LPSTR,int ){
	ChangeWindowMode(TRUE); 

	SetBackgroundColor(0,0,0);
	SetUseBackBufferTransColorFlag(TRUE);
	SetTransColor(0,0,0);

	DxLib_Init();
	SetDrawScreen( DX_SCREEN_BACK );

	int image = LoadGraph( "Test.png" );

	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE) ){

		SetDrawMode( DX_DRAWMODE_BILINEAR );
		DrawRotaGraph( 320, 240, 0.3, 0.0, image, TRUE );
		SetDrawMode( DX_DRAWMODE_NEAREST );

	}
	DxLib_End();
	return 0;
}
実行結果は、ウィンドウモードの状態では透明化が出来ていたのですが、フルスクリーンにすると真っ黒な画面で何も起きません。あと、Test.pngはアンチエイリアスを掛けて描いたものなのに、いざ表示してみると「アンチエイリアス無効化されちゃってる?」と思うほどギザギザしていました。

ブログの話をもう少し読み進めると以下の方法もあるとの事で、それも試してみました。

コード:

SetBackgroundColor(0,0,0);
SetUseBackBufferTransColorFlag(TRUE);
SetTransColor(0,0,0);
の部分を

コード:

SetBackgroundColor(0,0,0);
SetWindowLongA(GetMainWindowHandle(),GWL_EXSTYLE,WS_EX_LAYERED);//透明化
SetLayeredWindowAttributes(GetMainWindowHandle(),RGB(0,0,0),255,LWA_COLORKEY);
に置き換えて実行

こちらの方法はウィンドウモードもフルスクリーンモードも透明化にはなりませんでしたorz
そもそもこの方法での透明化はあまり宜しくないのでしょうか?それとも自分のプログラムのせい?

話が逸れるのですが、DXライブラリのリファレンスにあるマスク関数のサンプルプログラムを使ってTest.pngを表示させても、今回の透明ウィンドウで表示したのと同じ感じでギザギザしていました。
このギザギザになってしまう状況、どうすることもできないのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: 透明ウィンドウについて

#2

投稿記事 by h2so5 » 12年前

フルスクリーンモードの場合、デスクトップは描画されないと思います。
ウィンドウモードで、画面サイズをデスクトップと同じ大きさにすればいいかと。

nil
記事: 428
登録日時: 12年前

Re: 透明ウィンドウについて

#3

投稿記事 by nil » 12年前

この掲示板のtaketoshiさんという方がDXライブラリでウィンドウ透過をしてらっしゃった時もギザギザに悩んでらしたような、
最終的にWindowsAPIで同様の処理をなさっていたので、
綺麗に描画することを求めるのであればそれもまたひとつの手では?

パラダイス

Re: 透明ウィンドウについて

#4

投稿記事 by パラダイス » 12年前

h2so5 さんが書きました:フルスクリーンモードの場合、デスクトップは描画されないと思います。
ウィンドウモードで、画面サイズをデスクトップと同じ大きさにすればいいかと。
そうだったのですか!!じゃあフルスクリーンの状態だと黒いままってのは当然なのですね。
言われた通りウィンドウモードで最大化にしてみたところ、一応(1024,768)の座標まで画像を表示することが出来ました。

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE,HINSTANCE,LPSTR,int ){

  SetAlwaysRunFlag(TRUE);
  SetWindowSizeChangeEnableFlag( TRUE );
  SetGraphMode( 1024, 768, 16 );
  SetWindowStyleMode( 8 );

    SetBackgroundColor(0,0,0);
    SetUseBackBufferTransColorFlag(TRUE);
    SetTransColor(0,0,0);

	ChangeWindowMode(TRUE); 
	DxLib_Init();
	SetDrawScreen( DX_SCREEN_BACK );

	int image = LoadGraph( "Test.png" );

	while( !ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE) ){

		SetDrawMode( DX_DRAWMODE_BILINEAR );
		DrawRotaGraph( 1024, 763, 0.3, 0.0, image, TRUE );
		SetDrawMode( DX_DRAWMODE_NEAREST );

	}
	DxLib_End();
	return 0;
}
しかしなぜか一瞬表示がおかしくなる。
しかも完全に枠がないかと思ってたのに枠が表示されていないだけで枠分画像を描画できない。
さらに枠を表示することもできない・・・あまり使い勝手がよろしくないようですorz
涼雅 さんが書きました:この掲示板のtaketoshiさんという方がDXライブラリでウィンドウ透過をしてらっしゃった時もギザギザに悩んでらしたような、
最終的にWindowsAPIで同様の処理をなさっていたので、
綺麗に描画することを求めるのであればそれもまたひとつの手では?
DXライブラリじゃ絶対どうすることもできないのなら、そうするしかないですよねorz
WinAPIの勉強しなきゃ・・・


http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=1616
なにやらここに重大なヒント(答え?)が記述されているようなのに勉強不足で理解できない。
ここを読めば「透明ウィンドウ」「ギザギザ」の問題二つが見事に解決するですかね?

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 透明ウィンドウについて

#5

投稿記事 by ISLe » 12年前

SetWindowStyleModeでウィンドウの枠なしスタイルは2みたいですけど。
8はツールバースタイルのウィンドウ?らしいです。

パラダイス

Re: 透明ウィンドウについて

#6

投稿記事 by パラダイス » 12年前

ISLe さんが書きました:SetWindowStyleModeでウィンドウの枠なしスタイルは2みたいですけど。
8はツールバースタイルのウィンドウ?らしいです。
自分で試してみた結果なんですが、以下の通りになってるようで・・・
0 : 枠あり最大化不可。(デフォルト)
1 : 細い枠ありボタン無し。
2 : 枠なし。
3 : 枠あり小さいクローズボタンのみ。
4 : 2と同じ。
5 : 枠ありクローズボタンのみ。
6 : 0と同じ。
7 : 枠ありで最大化ボタンが使える。
8 : 枠ありで最大化された状態で起動。
9 : 0と同じ。
10 : 2と同じ。
11~ : 深刻なエラー。
SetWindowStyleModeで0を指定しても枠なしの状態でウィンドウが生成されてしまう。
ならば8で設定して最初から最大化された状態にしてしまおうということで8をしていました。
しかしツールバースタイルのウィンドウだったとは・・・少しウィンドウについて(っていうかWinAPIについて)勉強してみようと思います。
そうしたらDXライブラリに頼らずとも「透明ウィンドウ」「ギザギザ」の二つも解決するのかと思いますので・・・
アドバイスをくれた皆様に感謝します。ありがとうございました。

taketoshi
記事: 222
登録日時: 13年前
住所: 日本国

Re: 透明ウィンドウについて

#7

投稿記事 by taketoshi » 12年前

私はマウスカーソルに沿って光を散りばめるソフトを作りたくて、
DXライブラリを使用してみましたがゲームに特化しすぎたライブラリの為、撃沈しました。
そのあとGDI+を試してみましたがpng画像の描写がうまくいかず撃沈、最終的にlibpng+Winapiで制作しました。
DXライブラリやGDI+だとpng画像の透明部分がうまく処理できませんでした
(私がダメなだけで、別に方法はあるのかもしれない)


メインウインドウをWINAPIで透過処理させてからDXライブラリで画像描写をすれば透明ウインドウを用いたゲーム作りもいけますかね。
(WINAPIとDXライブラリの混在使用の仕方は解らない・・・誰かやり方教えてください)



透明ウインドウをWindowsAPIで作るにあたりここを参考にしました。
http://www.inasoft.org/wpt/ulw.html

ここはVBですけどなんとなく参考になります。
http://blogs.wankuma.com/youryella/arch ... 02151.aspx

閉鎖

“C言語何でも質問掲示板” へ戻る