解決済み:問題は ::CreateCompatibleBitmap ( hdc, 26, 26 ); にありました。ウィンドウの背景色とビットマップが同じだったので、実際のビットマップは 166x166 であった 26x26 ビットマップを作成していたので、::BitBlt ed では表示されませんでした。そんな愚かな間違い。
問題のイメージを別の bmp ファイルに置き換えると (コードに変更はありません)、動作します。リソースにはさらに bmp ファイルがあり、それらは機能しています。
BMP の問題は何でしょうか?
リソースハッカーに確認したところ、実行可能ファイルに画像があります。
以下は、私がコードで行っていることです。
Resource.rc
IDB_ANIMMAIN_1 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_1.bmp"
IDB_ANIMMAIN_2 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_2.bmp"
IDB_ANIMMAIN_3 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_3.bmp"
IDB_ANIMMAIN_4 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_4.bmp"
IDB_ANIMMAIN_5 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_5.bmp"
IDB_ANIMMAIN_6 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_6.bmp"
IDB_ANIMMAIN_7 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_7.bmp"
IDB_ANIMMAIN_8 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_8.bmp"
IDB_ANIMMAIN_9 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_9.bmp"
IDB_ANIMMAIN_10 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_10.bmp"
IDB_ANIMMAIN_11 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_11.bmp"
IDB_ANIMMAIN_12 BITMAP DISCARDABLE "E:\\image\\AnimMain\\AnimMain_12.bmp"
Resource.h
#define IDB_ANIMMAIN_1 501
#define IDB_ANIMMAIN_2 502
#define IDB_ANIMMAIN_3 503
#define IDB_ANIMMAIN_4 504
#define IDB_ANIMMAIN_5 505
#define IDB_ANIMMAIN_6 506
#define IDB_ANIMMAIN_7 507
#define IDB_ANIMMAIN_8 508
#define IDB_ANIMMAIN_9 509
#define IDB_ANIMMAIN_10 510
#define IDB_ANIMMAIN_11 511
#define IDB_ANIMMAIN_12 512
main.cpp
std::vector < HBITMAP > bitmaps;
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_1 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_2 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_3 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_4 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_5 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_6 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_7 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_8 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_9 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_10 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_11 ) ) );
bitmaps.push_back ( ::LoadBitmap ( hInstance, MAKEINTRESOURCE ( IDB_ANIMMAIN_12 ) ) );
アップデート:
HDC hdc = ::GetDC ( hwnd );
int i = 0;
while ( running )
{
hbitmap = bitmaps [ i ];
::Sleep ( 200 ); paint ( hdc );
i++;
if ( i >= bitmaps.size ( ) ) i = 0;
}
::ReleaseDC ( hwnd, hdc );
return true;
以下は、私がどのようにペイントを行っているかです。ペイント関数は、アニメーション(画像が使用される)を実行するループから呼び出され、ループで this-> hbitmap が更新されます。
::LoadBitmap 呼び出しで IDB_ANIMMAIN_x を別のリソース識別子に変更すると、それが機能するので、ループと onpaint(); は確実に実行されます。作業しています。
オンペイント:
HDC dcSkin = ::CreateCompatibleDC ( hdc );
HDC hMemDc = ::CreateCompatibleDC ( hdc );
HBITMAP hmemBmp = ::CreateCompatibleBitmap ( hdc, 26, 26 );
HBITMAP hOldMemBmp = (HBITMAP) ::SelectObject ( hMemDc, hmemBmp );
HBITMAP hOldSkinBmp = (HBITMAP) ::SelectObject ( dcSkin, this->hbitmap );
//::MessageBox ( 0, "second", "jAnimationBig::paint", 0 );
::BitBlt ( hMemDc, 0, 0, width, height, dcSkin, 0, 0, SRCCOPY );
::BitBlt ( hdc, 0, 0, width, height, hMemDc, 0, 0, SRCCOPY );
::SelectObject ( hMemDc, hOldMemBmp );
::SelectObject ( dcSkin, hOldSkinBmp );
::DeleteObject ( hOldSkinBmp );
::DeleteObject ( hOldMemBmp );
::DeleteObject( hmemBmp );
::DeleteDC ( hMemDc );
::DeleteDC ( dcSkin );