Resources+ Png+ Transparent-

Тема в разделе "WASM.BEGINNERS", создана пользователем sometime, 26 июн 2009.

  1. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    тема такая - загружаю я картинку с ресурсов:
    Код (Text):
    1. case WM_CREATE:
    2.  
    3. MyImg = LoadResources( GetModuleHandle( 0 ), NULL );
    4. reinterpret_cast<Gdiplus::Bitmap*>(MyImg)->GetHBITMAP(Gdiplus::Color(0,255,255,255), &bmFrame);
    5. hdc = GetDC( hWnd );
    6. hScrDC = CreateCompatibleDC( hdc );
    7. SelectObject( hScrDC, bmFrame );
    8. ReleaseDC( hWnd, hdc );
    9. DeleteObject( bmFrame );
    10. break;
    11.  
    12. case WM_PAINT:
    13.  
    14. hdc = BeginPaint( hWnd, &ps );
    15. DrawObjects( hWnd, hScrDC, 0, 0);
    16. BitBlt( hdc, 0, 0, 400, 500, hScrDC, 0, 0, SRCCOPY );
    17. EndPaint( hWnd, &ps );
    18. break;
    19.  
    20. BOOL DrawObjects( HWND hWnd, HDC hScrDC, int xPos, int yPos )
    21. {
    22. StretchBlt( hScrDC, 360, 5, 25, 25, hScrDC, 400, 0, 25, 25, SRCCOPY );
    23. StretchBlt( hScrDC, 300, 0, 40, 40, hScrDC, 425, 0, 40, 40, SRCCOPY );
    24. return TRUE;
    25. }
    26.  
    27. Image* LoadResources( HINSTANCE hInstance, LPSTR Name )
    28. {
    29.  
    30.     Gdiplus::Image* img;
    31.     return LoadImageFromResource( IDB_PNG_BG, _T("PNG") , hInstance, &img);
    32. }
    33.  
    34.  
    35. Image* LoadImageFromResource(UINT res, LPCTSTR pType, HMODULE hInst, Gdiplus::Image **image)
    36. {
    37.     HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(res), pType);
    38.     if (!hResource){
    39.         return false;
    40.     }
    41.     DWORD imageSize = ::SizeofResource(hInst, hResource);
    42.     if (!imageSize)
    43.         return false;
    44.     const void* pResourceData = ::LockResource(::LoadResource(hInst, hResource));
    45.     if (!pResourceData)
    46.         return false;
    47.     HGLOBAL hBuffer  = ::GlobalAlloc(GMEM_MOVEABLE, imageSize);
    48.     if (hBuffer)
    49.     {
    50.         void* pBuffer = ::GlobalLock(hBuffer);
    51.         if (pBuffer)
    52.         {
    53.             CopyMemory(pBuffer, pResourceData, imageSize);
    54.             IStream* pStream = NULL;
    55.             if (::CreateStreamOnHGlobal(hBuffer, FALSE, &pStream) == S_OK)
    56.             {
    57.                 (*image) = Gdiplus::Image::FromStream(pStream);
    58.                 DWORD dw = GetLastError();
    59.            }
    60.             ::GlobalUnlock(hBuffer);
    61.         }
    62.         ::GlobalFree(hBuffer);
    63.         hBuffer = NULL;
    64.     }
    65.     return *image;
    66. }
    возвращает красивенький битмап и я был доволен до недавна......пока не начал вызывать DrawObjects. Получается так:
    если в строчке
    Код (Text):
    1. reinterpret_cast<Gdiplus::Bitmap*>(MyImg)->GetHBITMAP(Gdiplus::Color(0,255,255,255), &bmFrame);
    Color будет как и написано (0,255,255,255) - фон закрасит синим - почему? - не извесно!
    если Color изменить,например (0,255,255,0) - фон черный)

    при регистрации класа окна указываю что Brush = NULL_BRUSH. Проверял - так оно и есть,окошко прозрачное...И остается прозрачным пока не сделаю
    SelectObject( hScrDC, bmFrame );

    чё я не так делаю?? С графикой только вот пытаюсь понять как работать так что не особо пока разбераюсь,вот надеюсь с вашей помощью понять где "сабака зарыта".
    На код сильно не "плюйтесь" - темп из темпов)

    зарание благодарен за ответы!

    ПС размер картинки 500х500, видимая область 400х500. 100 пикселов оставил на кнопки,которые там и нарисованы. Формат *.png с транспарентом. Если выводить при помощи Bitmap img(background.png) + DrawImage(img) - прозрачность присутствует.
     
  2. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    вот сижу и дальше продолжаю - все сходится на конверте:
    reinterpret_cast<Gdiplus::Bitmap*>(MyImg)->GetHBITMAP(Gdiplus::Color(0,255,255,255), &bmFrame);

    -как его мона заменить что бы дальше продолжить иследования???
     
  3. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    как выгуглил - я был прав GetHBITMAP убивает прозрачность,всеми любимый майкрософт при создании GDIplus забыл об этом методе "присохшим" еще с win3.1))) - я и не сомневался в их находчивости. Ну лан суть не в том кто как пишет и о чём при этом думает,а в том что бы обойти траблу с заду(мне так больше нравится))
    - Подумал о создании собственной функции GetHBITMAP - как думаете,реально? - ну да все реально,но стоит ли?! Может кто подскажет хоть в какую сторону идти и что почитать - буду крайне благодарен. А то общение с гулей особо ни на что не вывели_Спс