资源图像无效c ++

时间:2013-11-07 09:21:01

标签: c++ winapi resources

已解决:问题出在:: CreateCompatibleBitmap(hdc,26,26);我正在创建一个26x26位图,其中实际的位图是166x166,因为窗口的背景颜色和位图是相同的,因此在:: BitBlt ed时它是不可见的。这样一个愚蠢的错误。


这是一个奇怪的问题,当I :: BitBlt它们时,很少有资源bmp图像没有出现,如果我用不同的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-&gt; hbitmap。
如果我将:: LoadBitmap调用中的IDB_ANIMMAIN_x更改为另一个资源标识符,那么它可以工作,所以我确定循环和onpaint();正在努力。

的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 );

1 个答案:

答案 0 :(得分:0)

已解决:问题出在 :: CreateCompatibleBitmap(hdc,26,26); 我正在创建 26x26 位图,其中实际位图是 166x166 ,因为窗口和位图的背景颜色相同,所以当 :: BitBlt ed 时它不可见。这样一个愚蠢的错误。