DirectXとウィンドウリージョン

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Shizave
記事: 1
登録日時: 10年前

DirectXとウィンドウリージョン

#1

投稿記事 by Shizave » 10年前

DirectX9を使用してデスクトップマスコットを製作しています。
directxでバックバッファに描画したものをウィンドウリージョンでくりぬいて、描画されているところ以外を透明にしたいです。
こちらのサイト"http://ru11en.wordpress.com/2011/04/10/ ... %E3%81%9F/"のようなイメージです。

こちら"http://marupeke296.com/TIPS_No11_AutoRegion.html"のサイトなどを参考に下のようにしてみたのですが、何も表示されず困っています。
下のコードでまずいところや直すべきところ、もし他の方法があれば教えていただきたいです。
CreateWindowEXにおいてWS_EX_TOP_MOST | WS_EX_LAYEREDを指定してあります。

コード:

g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
g_pD3DDev->BeginScene();

//省略

g_pD3DDev->EndScene();
g_pD3DDev->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
pSurface->GetDC(&devContext);


BITMAP bi;
GetObject(CreateCompatibleBitmap(devContext, WINDOW_SIZE_W, WINDOW_SIZE_H), sizeof(BITMAP), &bi);
HRGN hRgn = CreateRectRgn(0, 0, WINDOW_SIZE_W, WINDOW_SIZE_H);

HDC hDC = GetDC(NULL);
HDC memDC = CreateCompatibleDC(hDC);
SelectObject(memDC, CreateCompatibleBitmap(devContext, WINDOW_SIZE_W, WINDOW_SIZE_H));
for(int y = 0;y < WINDOW_SIZE_H;y++){
	for(int x = 0;x < WINDOW_SIZE_W;x++){
		COLORREF color = GetPixel(memDC, x, y);
		if(color == 0x00000000){
			HRGN DiffRgn = CreateRectRgn(x, y, x + 1, y + 1);
			CombineRgn(hRgn, hRgn, DiffRgn, RGN_DIFF);
			DeleteObject(DiffRgn);
		}	
	}	
}	
DeleteDC(memDC);
ReleaseDC(hWnd, hDC);
SetWindowRgn(hWnd, hRgn, true);

ISLe()

Re: DirectXとウィンドウリージョン

#2

投稿記事 by ISLe() » 10年前

17行目で新規作成された『何も描画していない』ビットマップに対してリージョンを作成していますね。
HDCの使い方を理解されていないように見えます。

あと、いちいちCreateCompatibleBitmapを呼び出し解放していないのでとても危険です。

そもそも、わざわざ重いGDIを経由せず、7行目で取得したサーフェスを使ってピクセル情報にアクセスすればよいのでは?

閉鎖

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