ウィンドウの背景を透過したい(directXの改造)

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

ウィンドウの背景を透過したい(directXの改造)

#1

投稿記事 by bonbo » 7年前

早速ですが質問させていただきます。
DxLibMake.slnで
DxNetwork.cppの
デフォルトで553行目にあるWM_CREATEメッセージを

コード:

	case WM_CREATE :
		SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 80, LWA_ALPHA|LWA_COLORKEY);                  //追加
		hWnd = hWnd ;
		break ;
のように変更
DxWindow.cppの
デフォルトで1801行目にあるWM_CREATEメッセージを

コード:

	case WM_CREATE :
		// ウインドウが作成された直後の時の処理
		SetLayeredWindowAttributes(hWnd, RGB(0, 0, 0), 80, LWA_ALPHA|LWA_COLORKEY);                  //追加
		if( WinData.WindowRgn != NULL )
		{
			SetWindowRgn( hWnd, WinData.WindowRgn, FALSE ) ;
		}
		break ;
デフォルトで833行目にあるCreateWindowEx関数を

コード:

					CreateWindowEx(

						WExStyle_WindowModeTable[WinData.WindowStyle] + AddExStyle|WS_EX_LAYERED,            //WS_EX_LAYEREDメッセージを追加した
						WinData.ClassName ,
						WinData.WindowText ,
						WStyle_WindowModeTable[WinData.WindowStyle] + AddStyle,
						WinData.WindowPosValid == TRUE ? WinData.WindowX : Rect.left,
						WinData.WindowPosValid == TRUE ? WinData.WindowY : Rect.top,
						WindowSizeX,
						WindowSizeY,
						NULL,WinData.Menu,
						WinData.Instance,
						NULL );
デフォルトで4932行目にあるCreateWindowEx関数を

コード:

			WinData.ToolBarHandle = CreateWindowEx( 
				WS_EX_LAYERED,                                                             //0をWS_EX_LAYEREDに変えた
				TOOLBARCLASSNAME,
				NULL,
				WS_CHILD | WS_VISIBLE,
				0, 0,
				0, 0,
				WinData.MainWindow,
				NULL,
				WinData.Instance,
				NULL ) ;
のように変更して実行し、
出力されたライブラリおよびその他のファイルを
D:\DxLib_VC\プロジェクトに追加すべきファイル_VC用
内で上書き。
その後、そのファイルを参照する以下のようなdxlibプロジェクトを実行してみたのですが

コード:

#include "DxLib.h"
//真っ黒な画面に白い■が表示されているだけのプログラム
//画面の黒いピクセルを透過したい
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE ) ;
	if( DxLib_Init() == -1 )	
	{
		return -1 ;	
	}

	DrawBox( 320 , 240 ,500,600,GetColor(255,255,255),TRUE) ;

	WaitKey() ;

	DxLib_End() ;

	return 0 ;
}
透過できていませんでした。いったい何が原因なのでしょうか

本来ならこういう質問はDirectXの勉強が完了してからしないといけないとは思うのですが
先に作りたくなってしまったので質問させていただきました。

よろしくお願いします

bonbo

Re: ウィンドウの背景を透過したい(dxlibの改造)

#2

投稿記事 by bonbo » 7年前

タイトル間違えました。dxlibの改造です。directXを改造ほどの技術ないです
のっけからすみません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ウィンドウの背景を透過したい(directXの改造)

#3

投稿記事 by softya(ソフト屋) » 7年前

直す箇所に関しては本家であるDXライブラリ置き場の掲示板で質問してもらったほうが良さそうです。
DXLIB自体を直すのはDirectXの知識が不可欠ですら色々勉強が必要と思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
てんむすキツネ
記事: 88
登録日時: 8年前
住所: 岡山

Re: ウィンドウの背景を透過したい(directXの改造)

#4

投稿記事 by てんむすキツネ » 7年前

DxLibはゲーム向けのライブラリなので
そういうウインドウ作成は考えられていないと思います。
なのでわざわざDxLibを使う必要もないかと。

質問の答えになっていませんが、
別の方法で透明なウインドウを作ることもできます。

まず、透明色を指定することでしょうか。
http://dixq.net/forum/viewtopic.php?f=3&t=11267
1つの色を透明色に指定して
その色は一切描画しないという方法です。

その色のある画像が変になったり
半透明要素が適応されず、
ギザギザした感じの画像になることはありますが
簡単に出来ます。

他にも
DxLibと連帯はできませんが(できるのかもしれませんが、自分の知識じゃ無理でした)
http://www.inasoft.org/wpt/ulw.html
こちらのサイトに
png形式の画像を描画しつつ、
半透明のウインドウの作成ができるもののサンプルがのっています。
参考にしてみては?
MLP!MLP!

bonbo

Re: ウィンドウの背景を透過したい(directXの改造)

#5

投稿記事 by bonbo » 7年前

>soft屋さん
ありがとうございます
>直す箇所に関しては本家であるDXライブラリ置き場の掲示板で質問してもらったほうが良さそうです。
わかりました、そちらで質問してみます
>DXLIB自体を直すのはDirectXの知識が不可欠ですら色々勉強が必要と思います。
たしかにわがままな質問ですよね、DirectX終わらせてからまたきます

>天紆 狐さん
ありがとうございます。
類似トピックがあったのに似たような質問をしてしまい申し訳ありませんでした。
まさにこれです。


一応やりたいことはできるようになったものの…原因が気になりますね。
すっきりしないので調べておきます。

みなさんありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ウィンドウの背景を透過したい(directXの改造)

#6

投稿記事 by softya(ソフト屋) » 7年前

原因は推測として透明色の指定関数などが無いことでしょうか。
あと、DirectXの描画結果をウィンドウに転送しなければいけないのですが、ウィンドウモードではこれをDXLIBがやってくれていたはずですが確認はしていません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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