トップページ > 過去ログ > 記事閲覧
HBITMAPを描画
名前:埴輪 日時: 2010/11/30 15:44

Dxlib_init()の前に画面キャプチャを撮り HBITMAP型で保存しているのですが、 これをDxlibの関数で描画できるようにするには どのようにすればいいでしょうか。 BitBlt()ではうまくいかなさそうなので・・・。 既出ですが、自己解決なされたようで、回答されていませんでしたので・・・。 かく言う自分も SetUseBackBufferTransColorFlag(true); で目的は達することができました。 お騒がせしました。

Page: 1 |

Re: HBITMAPを描画 ( No.1 )
名前:埴輪 日時:2010/12/12 19:24

SetUseBackBufferTransColorFlag(true); で解決! と思っていたのですが、この方法では一部の環境 (古い(XP,Celeron 2GHz,オンボードのグラフィック?))にて異常に重いです。 なにかいい方法はないでしょうか
Re: HBITMAPを描画 ( No.2 )
名前:いっち 日時:2010/12/12 21:40

「異常に重い」とありますがどのくらい異常なんでしょうか? 埴輪さんの想定する普通がわかりません。
Re: HBITMAPを描画 ( No.3 )
名前:埴輪 日時:2010/12/18 18:56

画像が回転しながら飛び回りぶつかると跳ね返る だけなのですが、 SetUseBackBufferTransColorFlag(true); ナシで個数100でもFPS60を維持できるのに SetUseBackBufferTransColorFlag(true); アリで個数10ことかだとFPSはたちまち1ケタになってしまいます。
Re: HBITMAPを描画 ( No.4 )
名前:いっち 日時:2010/12/18 20:30

SetUseBackBufferTransColorFlag は基本的に FPS を気にする用途向けではないと思います。 埴輪さんのレスを読む限りではデスクトップの画像を背景に使用しているようですが、 SetUseBackBufferTransColorFlag のように背景に使用するデスクトップ画像をリアルタイムで更新することは そのアプリケーションにとって重要なのでしょうか? 現状、私ではあまりお力になれそうに無いのですが、 ソースを拝見すれば何か分かるかもしれないので、ソースを開示して頂くことは可能でしょうか?
Re: HBITMAPを描画 ( No.5 )
名前:埴輪 日時:2010/12/18 23:48

スクリーンセーバーなのですが、 vistaや7のバブルのようなものにしたいのです。 ソースはいまのところお見せできるほど整理していないのでご容赦ください。
Re: HBITMAPを描画 ( No.6 )
名前:いっち 日時:2010/12/19 13:32

背景のデスクトップ画像を描画のたびに更新する必要が無いのであれば、 埴輪さんが最初に行おうとしていた通りにスクリーンショットのビットマップをグラフィックハンドルに変換して、 SetUseBackBufferTransColorFlag を使わずに描画するほうが良いと思います。 聞きかじりの知識で恐縮ですが・・・。 GetObject を使えば BITMAP構造体を取得できるので、そこからソフトイメージに手動で変換できるのではないでしょうか。 また、GetDIBits を使えば DDB から DIB に変換できるので BITMAPINFO構造体を取得できます。 BITMAPINFO構造体があれば CreateGraphFromBmp で直接グラフィックハンドルに変換できそうなのですが、 ちょっと使い方が分かりませんでした。
Re: HBITMAPを描画 ( No.7 )
名前:埴輪 日時:2010/12/20 19:21

WindowsAPIやDirectXに関しては無知なので なんだかややこしそうです。 だからこそDXライブラリを使わせていただいておるわけですが・・・。 DXライブラリで普通に扱えないことをするのはやはり大変ですね(汗 >背景のデスクトップ画像を描画のたびに更新する必要が無いのであれば、 できるに越したことはありませんが、できなくてもかまいません。 実際、7のバブルスクリーンセーバーは映っているものは固定されてしまいます。
Re: HBITMAPを描画 ( No.8 )
名前:いっち 日時:2010/12/20 23:54

やってみました。 LoadImage に LR_CREATEDIBSECTION を指定して読み込むとなぜか8bitColorになってしまったので、GetDIBits を使っています。 //- 以下、テストコード ("test1.bmp"を使用) -// #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ); if ( DxLib_Init( ) == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); int StrColor = GetColor( 255, 255, 255 ); // 元となるビットマップハンドルの作成 HBITMAP hBmp; hBmp = (HBITMAP)LoadImage( NULL, "..\\!Sample\\" "test1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE ); // DIBセクションの取得 BITMAP DDBInfo; BITMAPINFO DIBInfo; GetObject( hBmp, sizeof(BITMAP), &DDBInfo ); DIBInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); DIBInfo.bmiHeader.biWidth = DDBInfo.bmWidth; DIBInfo.bmiHeader.biHeight = DDBInfo.bmHeight; DIBInfo.bmiHeader.biPlanes = 1; DIBInfo.bmiHeader.biBitCount = 32; DIBInfo.bmiHeader.biCompression = BI_RGB; BYTE *pData = new BYTE[DDBInfo.bmWidth * DDBInfo.bmHeight * 4]; HDC hDC = GetDC( GetMainWindowHandle( ) ); GetDIBits( hDC, hBmp, 0, DDBInfo.bmHeight, (void*)pData, &DIBInfo, DIB_RGB_COLORS); ReleaseDC( GetMainWindowHandle( ), hDC ); DeleteObject( hBmp ); // ソフトイメージに変換してみる int sh = MakeXRGB8ColorSoftImage( DDBInfo.bmWidth, DDBInfo.bmHeight ); BYTE *Dots = pData; for ( int y = DDBInfo.bmHeight - 1; y >= 0 ; y-- ) { // データは上下さかさまらしい for ( int x = 0; x < DDBInfo.bmWidth; x++ ) { DrawPixelSoftImage( sh, x, y, *(Dots+2), *(Dots+1), *(Dots+0), *(Dots+3) ); Dots += 4; } } // ハンドルに変換してみる int gh = CreateGraphFromBmp( &DIBInfo, pData ); // やってみたらうまくいきました。 delete pData; // ReCreateGraphするときに必要かも。 while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { ClearDrawScreen( ); DrawFormatString( 0, 0, StrColor, "TEST" ); DrawSoftImage( 0, 0, sh ); DrawGraph( 200, 0, gh, TRUE ); ScreenFlip( ); } DxLib_End( ); return 0; }
Re: HBITMAPを描画 ( No.9 )
名前:埴輪 日時:2010/12/23 11:19

ありがとうございます。 試してみます。 やはりAPIを使うには多くの手順をふまなければならないのですね・・・。 あらためてDXライブラりのありがたさがわかります。

Page: 1 |