11:パレット&透過2

「Windowsモードでのパレット」

さて、久しぶりのDD講座。終わった訳じゃありません。まだまだネタはあります。

今回はWindowモードでのパレットをやります。 前回のプログラムを256色表示で起動すれば分かると思いますが、ほかの256色パレットを 使っているプログラムにフォーカスを変えると化けます。そのうえフォーカスが戻っても まだ化けたまんまです。これを直そうというのが今回のテーマ。

変な色。

とはいえ、今時256色表示なんてしてる人はいないだろ〜なんて思ってる人はすんなり先にいってもOK。 つけなくていいと思う機能はつけない方がいいです。 まぁそんなこといったらフルスクリーンモードONLYにしてWindowモードなしにすればさらにプログラムがすっきりするんですが、 まぁWindowモードを完璧にしたい人はどうぞということで。(3Dプログラムまでには先が長そう…)

では本題、具体的にどうすればいいのかというと、WM_QUERYNEWPALETTEを処理します。 これはパレットのフォーカスがきたときにくるメッセージです。 256色など、パレットが必要な時のみしか送られてこないので(多分)16bitなどでもエラーはでません。
case WM_QUERYNEWPALETTE:
	{
		// パレットのセット
		if(!bFull && lpDDPal && lpDDSPrimary)
		{
			if(lpDDSPrimary->SetPalette(lpDDPal)!=DD_OK){ MessageBox(hWnd,"パレットのセットに失敗",strAppName,0); return 1;}
		}
	}break;

さぁできあがりです♪簡単ですね。今度は256色表示でもちゃんとパレットの復帰ができています。 これだけではさみしいので、ついでにパレットの透過色も改造しておきます。

今までの透過色は黒でした。これはいい色で(本当に)、パレットでも0、RGB指定でも0なんですね。 なので0とだけ透過色を設定しておけば黒が透明色になってくれるんです(0xFFFFFFFFでは白が透明色)。 ところが、透明色を別の色にしようとなるとやっかいなんです。 というのは、画面の色数(bpp)によって数字が変わってくるんですね。 特に16bitモードは、さらにビデオカードによって数字が変わります。有名な565だの556だのいうあれです。

なら黒か白を透明色にすれば結局いいんですが、それでも黒を透明ではなく使いたいときってありますよね。 黒に近い色を黒代わりにするっていう簡単で即決な方法もありますが、それではプログラミング講座にならないので、 今回は処理分けをして、黒以外を透明色として使ってみたいと思います。

// カラーキー指定
DDCOLORKEY ddck;
ddck.dwColorSpaceLowValue = ddck.dwColorSpaceHighValue = DDColorMatch(lpDDSSprite,RGB(255,0,255)); // Paletteの番号 or RGBで指定
if(lpDDSSprite->SetColorKey(DDCKEY_SRCBLT,&ddck)!=DD_OK){ MessageBox(hWnd,"オフスクリーンバッファの透過色の設定に失敗",strAppName,0); return 1;}
・・・

// DDColorMatch
DWORD CAPPMAIN::DDColorMatch(LPDIRECTDRAWSURFACE lpDDSsrc,COLORREF rgb)
{
・・・
	// 色のパレット番号 or RGBを取得
	DWORD dw = CLR_INVALID;
	DDSURFACEDESC ddsd;
	ddsd.dwSize = sizeof(ddsd);
	if(lpDDSsrc->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) == DD_OK)
	{
		dw = *(DWORD*)ddsd.lpSurface;
		if(ddsd.ddpfPixelFormat.dwRGBBitCount != 32) dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount)-1;
		lpDDSsrc->Unlock(NULL);
	}
・・・
	return dw;
}


さて、DDColorMatchはDirectXのサンプルにあるアレです。 ちょっとコメントを付け加えてタブなどを変更しました。 この関数は、引数のRGBから今の画面のその色の数字を返してくれます。 256色以下のパレット使用ならばそのパレット番号を、RGB指定なら565であれ655であれちゃんとしたRGBを返してくれます。 まぁそんな感じでこれで一発で取得できるわけです。

あとはこれをカラーキーとしてセットすればめでたくその色が透明色になります。 ちょっと長くなったけど今回はこれで終わりですではまたいつか…

Download dd011.lzh - パレットと透過2


色がかなりカラフル化しています(汗


★TOP★

Copyright(C) へぽぽ